2014-06-09 3 views
3

Je transfère du code à Swift, mais je ne comprends pas comment gérer les pointeurs.COpaquePointer à un octet arbitraire dans un bloc de mémoire


Swift, comment créer un bloc vide de la mémoire, de telle sorte que les fonctions C y ont accès?

source C:

UInt8* bytes = malloc(qty_bytes_in_file); 

..et, après ce qu'on fait, comment voulez-vous créer un pointeur sur un décalage arbitraire de cette mémoire? Je vais devoir déplacer à plusieurs reprises les pointeurs vers différentes adresses dans ce bloc de mémoire, auquel une fonction C écrira alors des données.

source C:

void* mData = &bytes[i]; 

est ici une version abrégée du code C avec lequel je commence, afin que vous puissiez voir les deux lignes dans le contexte:

source C :

UInt8* bytes = malloc(qty_bytes_in_file); // Swift equivalent? 

while (!err) { 

    AudioBufferList buffer_list = new_buffer_list(); 

    buffer_list.mBuffers[0].mData = &bytes[i]; // Swift equivalent? 

    // each iteration, ExtAudioFileRead fills 
    // in a portion of buffer_list's '.mData': 
    err = ExtAudioFileRead(
     audio_file, 
     &qty_frames_requested, 
     &buffer_list 
    ); 

    i += foo; 

} 
+1

Je créer un wrapper obj-c. Le faire dans Swift pur sera juste trop difficile. Cependant, votre point de départ est 'UnsafePointer ' qui vous permettra le 'malloc' mais comme je vois, vous devrez également utiliser' reinterpretCast'. – Sulthan

+0

@Sulthan Oui, je viens de finir d'écrire un emballage, vous avez tout à fait raison. Je pense avoir lu quelque part qu'Apple veut décourager l'arithmétique des pointeurs dans Swift, car cela provoque toute une catégorie d'erreurs. Le code serait probablement plus lent dans Swift de toute façon. – Charlesism

+1

Exemple utile pour créer un tampon et le remplir, ici: https://gist.github.com/rothomp3/0a7b9fef4249a4f91fc6 – matt

Répondre

0

Pour la première question, je voudrais juste faire un tableau de valeurs d'octets:

var bytes = Array<UInt8>(count: qty_bytes_in_file, repeatedValue: 0) 

Et je pense que vous pouvez fournir une référence à ce tableau en tant que paramètre in-out. Par exemple:

let stream = NSInputStream(data: someNSDataObject) 
let numberOfBytesRead = stream.read(&bytes, maxLength:buffer.count) 

Il y a aussi à Swift une enveloppe disponible ...

struct UnsafePointer<T> 

... avec une propriété « mémoire » pour se rendre à la première mémoire sous-jacente.

+1

Mon problème est légèrement différent. Je dois faire l'arithmétique de pointeur, par exemple: obtenir une référence au troisième ou quatrième octet dans un bloc de mémoire mallocé – Charlesism

Questions connexes