2017-06-03 2 views
2

J'ai créé un tampon rempli par un tableau de valeurs flottantes. Malheureusement, lorsque j'essaie d'interroger sa propriété contents() (lorsque j'essayais de déboguer un problème), j'obtenais un EXC_BAD_ACCESS. Voici le code:Le contenu de MTLBuffer a provoqué EXC_BAD_ACCESS

let inputData = [Float32](repeatElement(5, count: 16384)) // Declaration 

// Declaration of the buffer and filling contents... 
inputBuffer = device.makeBuffer(bytes: inputData, length: MemoryLayout<Float32>.size * inputData.count, options: MTLResourceOptions()) 

// Crash occurs here: 
let contents = inputBuffer.contents().load(as: [Float32].self) 

Je voudrais savoir pourquoi l'accident se produit. D'autres déclarations de tampon similaires ont fonctionné correctement, donc je suppose que cela pourrait être un problème avec l'accès au contenu.

Répondre

1

Pour accéder au contenu de la matrice, en utilisant la méthode load, vous devez spécifier le type d'élément du tableau (et un décalage facultatif) à la place. Par exemple:

let firstElement = inputBuffer.contents().load(fromByteOffset: 0, as: Float.self) 

et ainsi de suite. Vous essayiez de charger le premier élément en tant que [Float], ce qui pourrait expliquer le crash.

+0

qui a fait l'affaire. Merci. Donc, si je veux tout le tableau, y a-t-il une fonction? Ou est-ce que je répète le nombre d'éléments en changeant le décalage? –

+0

@AdilPatel Vous êtes les bienvenus;) Pls voir Matthijs réponse pour un moyen de récupérer l'ensemble du tableau ... –

1

Pour obtenir l'ensemble du réseau, vous pouvez faire:

let count = buffer.length/MemoryLayout<Float>.stride 
var output = [Float](repeating: 0, count: count) 
_ = output.withUnsafeMutableBytes { ptr in 
    memcpy(ptr.baseAddress, buffer.contents(), buffer.length) 
}