Usando puntatori nativi in F # con WriteableBitmap
-
27-09-2019 - |
Domanda
Ciao
Sto cercando di utilizzare WritableBitmap.BackBuffer
come usato in questo esempio , vedere gli esempi di sezione.
Quello che sto cercando di fare è davvero scrivere un int[]
in uno spazio a punti nativeint
a.
Per essere in grado di scrivere da int [] per qualche ricordo ho iniziato da questa risposta su SO.
Microsoft.FSharp.NativeInterop.NativePtr.write
sembra essere una funzione di buono da utilizzare per scrivere.
Dopo aver provato a leggere un po ' due domande si pone.
-
WritableBitmap.BackBuffer
ha il tipo nativeint, come convertire a nativeptr cheNativePter.write
vuole? -
Sembra che posso solo scrivere una
int
alla volta, ma voglio scrivere un interoint []
.
Ammetto che io sono in acque profonde, ma è in acque profonde si impara a nuotare :)
Grazie in anticipo
Görgen
Soluzione
Credo che la funzione NativePtr.write
può essere utilizzata solo per scrivere il valore unico alla volta, quindi se si desidera copiare un array, si dovrà utilizzare un ciclo for
.
Un'opzione più semplice potrebbe essere quella di utilizzare il metodo Marshal.Copy
( vedere MSDN ) che prende una matrice di origine (ci sono sovraccarichi per le matrici contenenti elementi di vario genere) e intptr
come la destinazione.
Qualcosa del genere dovrebbe funzionare:
let imageData = [| ... |] // generate one dimensional array with image data
writeableBitmap.Lock()
let buffer = writeableBitmap.BackBuffer
Marshal.Copy(imageData, 0, buffer, imageData.Length)
Altri suggerimenti
Credo che l'approccio suggerito di Tomas ha un senso. Tuttavia, per rispondere alla tua prima domanda, è possibile convertire un nativeint
ad un nativeptr
utilizzando la funzione NativeInterop.NativePtr.ofNativeInt
.