2016-10-01 9 views
1

私は現在、特にF#のP/Invoke機能を学びたいと考えています。私が呼び出すしようとしているC関数は、 'ポインタへのポインタ'であるパラメータを必要とし、F#でこれを表現するためにどの演算子を使うのが苦労しています。いくつかの読み取りを行った後F#のポインタへのポインタ

、特にこのblog postは、私は、.NET言語で、&代わりの*誰かができれば、彼らは(「ポインタ管理」されるようにポインタパラメータを表すために優れていることを信じるにつながりますよどのようなユースケースを私に明示します。それによって、私はで管理してはいけません。 これまでのところ、私は&&を試していますが、これはブールANDを表すため正しくありません。また、ポインタへのポインタの 'C'スタイル表現に一致する**も試してみました。

C#では、これを「C」スタイルと同様に表すことができます。つまり、int** q;です。

誰もF#で何か似たようにする方法を知っていますか?特にexternの定義にある。

ありがとうございます。

更新より特定されていないため

謝罪 - これは、構造体の型にあります。

私はここで何をしているのか正確には - MMAL_BUFFER_HEADER_Tが見つかりましたhere私はラズベリーパイカメラモジュールで取り組んでいるプロジェクトのために再現しようとしています。この場合、は、次にfunctionで使用されます。関数の戻り時にポインタのアドレスが設定されます。

更新2 ここで大声で考えてみると、System.IntPtr&を正しく表現するとしますか?

+1

何へのポインタへのポインタ?それが 'char **'または 'wchar_t ** 'の場合、それらは特別な扱いを受けます。それが他のものなら、具体的にしてください。 – ildjarn

+0

返信いただきありがとうございます - 私は今投稿を更新しました。構造体型です。ありがとう。 –

+0

このポインタの意味はなんですか?関数はメモリを割り当ててポインタを返しますか?それとも別のことですか? –

答えて

1

これを正しく確認するには多大な労力が必要ですが、これを試してください。

もちろん、タイプとソース属性を確実に取得する必要があります。シーケンシャルとCdeclは正しいですか? F#で構造体のフィールドを参照する必要がない場合、つまり、それを不透明な型のように扱う必要がある場合は、関数のヘッダにnativeint(アンパサンドの有無にかかわらず)を使用することができますあなたは他の誰がこの問題に遭遇してしまっ念のC.

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) 
+0

本当にこの回答が好きです@Bent Tranberg、返信する時間を取ってくれてありがとうございました。 –

0

でのvoidポインタを使用する方法は、私は、関数呼び出しのために必要な複数の間接を表現するためにnativeint&を使用して終了しました。関数自体は私のためにメモリを割り当てるので、私はこのメソッドを使用することを楽しみにしています。私はこれで私の道を手伝ってくれたすべての人に再び感謝します。

関連する問題