指向F#中指针的指针

时间:2016-10-01 20:38:34

标签: .net f# interop

我目前正在尝试学习.NET的P / Invoke功能,特别是在F#中。我试图调用的C函数需要一个参数,该参数是指向指针的指针。我正在努力寻找用于在F#中表示这个的运算符。

在做了一些阅读,特别是这个blog post之后,我会相信在.NET语言中,最好用&而不是{{1}来表示指针参数这样他们就是管理指针' (如果有人可以为我澄清任何用例,我不应该使用管理指针,那么那也很棒!)。 因此,到目前为止,我已尝试*这是不正确的,因为它代表一个布尔AND,我也尝试了&&,这将匹配' C&#39 ;指向指针的指针的样式表示。

我相信在C#中,你可以用类似的方式来表示这个' C'风格,即**

有人知道如何在F#做类似的事吗?特别是在int** q;定义中。

谢谢。

更新

没有更具体的道歉 - 这是一种结构类型。

准确地说我在这里做了什么 - 我试图复制结构extern找到here来处理我正在使用Raspberry的项目Pi相机模块。然后,在以下function中使用此MMAL_BUFFER_HEADER_T。从函数返回时将设置指针的地址。

更新2 在这里大声思考 - 使用struct会以正确的方式表示这一点吗?

2 个答案:

答案 0 :(得分:1)

我要付出太多努力才能正确检查,但试试这个。

当然,您必须确保获得类型和源属性。顺序和Cdecl是否正确?如果您不需要在F#中引用结构的字段,换句话说,将其视为不透明类型,那么您可以在函数头中使用nativeint(带或不带符号?)来代替,就像在C中使用void指针一样。

open System.Runtime.InteropServices

type uint32_t = uint32 // likely correct type, but you must check
type MMAL_STATUS_T = int32 // replace with correct type
type MMAL_PORT_T = int32 // replace with correct type

#nowarn "9"
[<Struct; StructLayout(LayoutKind.Sequential)>]
type MMAL_BUFFER_HEADER_T =
    val next: MMAL_BUFFER_HEADER_T ref // will ref work here, or should it be byref<MMAL_BUFFER_HEADER_T>?
    val priv: nativeint // or you could use a type (with ref?) here also
    val cmd: uint32_t // assuming uint32_t is uint32
    // etc
    val typ: MMAL_BUFFER_HEADER_TYPE_SPECIFIC_T ref
    val user_data: nativeint // void pointer in C

[<DllImport("SomeDll.dll", CallingConvention=CallingConvention.Cdecl)>]
extern MMAL_STATUS_T mmal_port_event_get(MMAL_PORT_T port, MMAL_BUFFER_HEADER_T& buffer, uint32_t event)

答案 1 :(得分:0)

为了防止其他人遇到这个问题,我最终使用nativeint&来表示函数调用所需的多个间接。函数本身为我分配内存,所以我很高兴使用这种方法。再次感谢所有帮助我顺利完成任务的人。