2016-10-01 6 views
1

Ich versuche derzeit, die P/Invoke-Funktionen von .NET zu lernen, insbesondere in F #. Eine C-Funktion, die ich aufrufen möchte, benötigt einen Parameter, der ein "Zeiger auf einen Zeiger" ist, und ich bin schwer zu finden, welcher Operator verwendet werden soll, um dies in F # darzustellen.Zeiger auf einen Zeiger in F #

Nach etwas zu lesen tun, vor allem diese blog post, ich bin zu der Annahme verleiten, dass in .NET-Sprachen, es besser ist, Zeigerparameter mit einem & statt * so darzustellen, dass sie ‚Pointers Managed‘ (wenn jemand könnte Klar für mich irgendwelche Anwendungsfälle, wobei ich sollte nicht mit den Managed Pointers dann wäre das auch toll!). Daher habe ich bisher && versucht, was falsch ist, da es ein Boolesches AND darstellt, und ich habe auch versucht **, die die 'C' Stildarstellung eines Zeigers auf einen Zeiger entsprechen würde.

Ich glaube, dass in C#, können Sie dies in ähnlicher Weise wie die 'C' Stil, d. H. int** q;.

Würde jemand wissen, wie man etwas Ähnliches in F # macht bitte? Besonders in extern Definitionen.

Vielen Dank.

aktualisieren

Entschuldigt nicht präziser zu sein - das ist auf eine Struktur-Typ.

Um genau zu sein, was ich hier mache - ich versuche, die Struktur MMAL_BUFFER_HEADER_T gefunden here für ein Projekt, das ich mit dem Raspberry Pi Camera Module arbeiten zu replizieren. Diese struct wird dann im folgenden function verwendet. Die Adresse des Zeigers wird beim Zurückkehren von der Funktion eingestellt.

Update 2 Denken laut hier aus - würde mit System.IntPtr& diese repräsentieren in der richtigen Art und Weise?

+1

Zeiger auf Zeiger auf was? Wenn es 'char **' oder 'wchar_t **' ist, bekommen diese spezielle Behandlung; Wenn es etwas anderes ist, sei bitte spezifisch. – ildjarn

+0

Vielen Dank für die Antwort - Ich habe den Beitrag jetzt aktualisiert. Es ist zu einem Strukturtyp. Vielen Dank. –

+0

Was ist die Semantik dieses Zeigers? Funktioniert die Funktion Speicher und gibt Ihnen einen Zeiger darauf zurück? Oder ist es etwas anderes? –

Antwort

1

Zu viel Aufwand für mich, dies richtig zu überprüfen, aber versuchen Sie es.

Sie müssen natürlich sicherstellen, dass Sie die Typen und die Quellattribute richtig erhalten. Ist Sequential und Cdecl korrekt? Wenn Sie Felder der Struktur (en) in F # nicht referenzieren müssen, mit anderen Worten wie ein undurchsichtiger Typ, dann können Sie möglicherweise mit der Verwendung von nativeint (mit oder ohne kaufmännisches Und zwar?) Im Funktionskopf statt, gleich So können Sie void-Zeiger in 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

Wirklich wie diese Antwort @Bent Tranberg, vielen Dank für die Zeit zu nehmen, um zu antworten. –

0

für den Fall, jemand anderes geschieht über diese Frage zu kommen, verwenden würde, die ich unter Verwendung einer nativeint& endete die mehrfache Indirektion für den Funktionsaufruf erforderlich darzustellen. Die Funktion selbst reserviert Speicher für mich, so dass ich glücklich bin, diese Methode zu verwenden. Nochmals vielen Dank an alle, die mir dabei geholfen haben.