Использование родных указателей в F # с WritableBitmap - PullRequest
3 голосов
/ 22 ноября 2010

Привет

Я пытаюсь использовать WritableBitmap.BackBuffer, как в этом примере , см. Примеры в разделе.
Что я пытаюсь сделатьна самом деле это запись int[] в пробел, на который указывает nativeint.

Чтобы иметь возможность писать из int [] в какую-то память, я начал с этого ответа в SO.Microsoft.FSharp.NativeInterop.NativePtr.write, кажется, хорошая функция для записи.

После попыток и прочтения возникает два вопроса.

  1. WritableBitmap.BackBuffer имеет тип nativeint, как конвертировать в nativeptr, который хочет NativePter.write?

  2. Кажется, что я могу писать толькопо одному int за один раз, но я хочу написать целое int [].

Я признаю, что я нахожусь в глубокой воде, но именно в глубокой воде вы учитесь плавать :)

Заранее благодарны
Горген

Ответы [ 2 ]

4 голосов
/ 22 ноября 2010

Я думаю, что предложенный Томас подход имеет смысл.Однако, чтобы ответить на ваш первый вопрос, вы можете преобразовать nativeint в nativeptr, используя функцию NativeInterop.NativePtr.ofNativeInt.

3 голосов
/ 22 ноября 2010

Я думаю, что функцию NativePtr.write можно использовать только для записи одного значения за раз, поэтому, если вы хотите скопировать массив, вам придется использовать цикл for.

Более простым вариантом может быть использование метода Marshal.Copy ( см. MSDN ), который принимает исходный массив (существуют перегрузки для массивов, содержащих элементы различных типов) и intptr в качестве места назначения.

Примерно так должно работать:

let imageData = [| ... |] // generate one dimensional array with image data
writeableBitmap.Lock()

let buffer = writeableBitmap.BackBuffer
Marshal.Copy(imageData, 0, buffer, imageData.Length)
...