باستخدام المؤشرات الأصلية في F# مع CritableBitMap
-
27-09-2019 - |
سؤال
مرحبًا
أحاول استخدام WritableBitmap.BackBuffer
كما هو مستخدم في هذا المثال, ، انظر أمثلة القسم.
ما أحاول فعله حقًا هو كتابة int[]
في الفضاء أ nativeint
نقاط ل.
لتكون قادرًا على الكتابة من int [] إلى بعض الذاكرة التي بدأت منها هذا الجواب على ذلك.Microsoft.FSharp.NativeInterop.NativePtr.write
يبدو أن وظيفة جيدة للاستخدام للكتابة.
بعد المحاولة والقراءة قليلا اثنين تنشأ الأسئلة.
WritableBitmap.BackBuffer
لديه النوع الأصلي ، كيفية التحويل إلى NativePtrNativePter.write
يريد؟يبدو أنه لا يمكنني كتابة واحدة إلا
int
في وقت واحد لكني أريد أن أكتب كليًاint []
.
أعترف أنني في مياه عميقة ولكن في المياه العميقة تتعلم السباحة :)
أشكر مقدما
جورجين
المحلول
أعتقد أن 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)
نصائح أخرى
أعتقد أن نهج توماس المقترح أمر منطقي. ومع ذلك ، للإجابة على سؤالك الأول ، يمكنك تحويل ملف nativeint
إلى nativeptr
باستخدام NativeInterop.NativePtr.ofNativeInt
وظيفة.