باستخدام المؤشرات الأصلية في F# مع CritableBitMap

StackOverflow https://stackoverflow.com/questions/4246844

  •  27-09-2019
  •  | 
  •  

سؤال

مرحبًا

أحاول استخدام WritableBitmap.BackBuffer كما هو مستخدم في هذا المثال, ، انظر أمثلة القسم.
ما أحاول فعله حقًا هو كتابة int[] في الفضاء أ nativeint نقاط ل.

لتكون قادرًا على الكتابة من int [] إلى بعض الذاكرة التي بدأت منها هذا الجواب على ذلك.Microsoft.FSharp.NativeInterop.NativePtr.write يبدو أن وظيفة جيدة للاستخدام للكتابة.

بعد المحاولة والقراءة قليلا اثنين تنشأ الأسئلة.

  1. WritableBitmap.BackBuffer لديه النوع الأصلي ، كيفية التحويل إلى NativePtr NativePter.write يريد؟

  2. يبدو أنه لا يمكنني كتابة واحدة إلا 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 وظيفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top