簡體   English   中英

F#指針成員訪問器

[英]F# pointer member accessor

有什么方法可以訪問NativePtr結構的成員並NativePtr分配值,就像在下面的示例中使用C#一樣?

(來自MSDN)

CoOrds* p = &home; p -> x = 25;

當前,我正在使用NativePtr.write ,但是我不確定這是否是最佳/正確的解決方案。

謝謝。

假設您必須以這種方式處理struct ,那么您描述的方式是最清晰的方法。 為了完整起見,這里是該方法(省略了打包的實現細節):

open FSharp.NativeInterop

[<StructLayout(...)>]
type myStructure =
    struct
        val mutable a : int
        val mutable b : byte
    end

let changeA pointer newA =
    let mutable structure = NativePtr.read pointer
    structure.a <- newA
    NativePtr.write pointer structure

但是,由於必須知道每個元素的確切偏移量,因此也可以使用此信息直接寫入該字段。 F#沒有提供使用命名標識符執行此操作的方法,其嚴格輸入的nativeptr<'T>類型意味着您不能簡單地轉換為相關的指針類型。 NativePtr.set offset ptr函數添加sizeof<'T> * offset ,因此在這種情況下也沒有用。

為了簡單起見,假設類型myStructure具有Packed屬性。 那么, a的偏移量為0, b的偏移量為4。 我們全力以赴,完全放棄了托管內存的領域,我們可以這樣做:

let changeB pointer newB =
    let bPtr =
        NativePtr.toNativeInt pointer
        |> (+) 4n
        |> NativePtr.ofNativeInt<byte>
    NativePtr.write bPtr newB

甚至:

let changeMember pointer offset (value : 'T) =
    let pointer' =
        NativePtr.toNativeInt pointer
        |> (+) (nativeint offset)
        |> NativePtr.ofNativeInt<'T>
    NativePtr.write pointer' value

對於這些情況的最佳解決方法是什么(如果必須加以處理),則是一個懸而未決的問題。 我傾向於采用第一種最清晰的方法,但會占用更多的內存。 不惜一切代價避免使用最后一個任意偏移量方法-如果必須處理添加原始偏移量,最好將它們包裝在像第二種方法那樣更易於驗證的函數中,因此調用者無需計算偏移量本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM