2016-08-09 13 views
0

私は録音は、この構造を有しているCで記述されたDLLによって満たされている:レコードが正しく満たされているように見える参照解除レコードの要素

Thackrf_device_list = record 
    serial_numbers: PPAnsiChar; 
    usb_board_ids: ^hackrf_usb_board_id; 
    usb_device_index: PInteger; 
    devicecount: Integer; 
    usb_devices: PPointer; 
    usb_devicecount: Integer; 
    end; 

、返された整数「devicecount」と「usb_devicecoun理由期待通りです。 私が理解できないことは、他の要素を逆参照する方法です。 私が必要とするのは、料理本またはいくつかの良い例です。
ヘルプ

+1

:例として、単純なTPointレコードを使用して

このページにアクセスして、非常に慎重に読んでください:http://stackoverflow.com/help/on-topic注意事項4:*書籍、ツール、ソフトウェアライブラリ、チュートリアル、その他のオフサイトリソーススタックオーバーフローの話題にはなりません。なぜなら、オピニオン回答とスパムを引き付ける傾向があるからです。代わりに、それを解決するために問題とそれまでに何が行われているかを説明してください。*ここで30以上の質問をした後、あなたに思い出させることなく、あなたがこれを知っていると期待するのは合理的です。 –

+0

「Book」という言葉を使用して申し訳ありません。私は今思い出させる必要がありますし、またあなたに非常に感謝します。 私は依然としてレコードの逆参照に助けが必要です。あなたがいずれかを持っている? –

+0

おそらく、教科書やドキュメンテーションを参照することができます。ポインタは包括的​​に文書化されている。 –

答えて

2

逆参照ポインタは非常に簡単です。ポインタがレコード、クラスに属しているかどうかは問題ではありません。ポインターの識別子の直後に^演算子を追加してポインターを参照解除します。例えば

:Delphiでポインタを間接参照

var 
    LDeviceList: Thackrf_device_list; 
    LSomePAnsiChar: PAnsiChar; 
    LSomeUsbBoardIDs: hackrf_usb_board_id; 
    LSomeInteger: Integer; 
    LSomePointer: Pointer; 
begin 
    // fill LDeviceList by the C-written DLL 

    LSomePAnsiChar := LDeviceList.serial_numbers^; // returns a pointer to the first char of a string containing the serials as 'serial_numbers' seems to be a pointer to a pointer (PAnsiChar) 
    LSomeUsbBoardIDs := LDeviceList.usb_board_ids^; // gives you the record of type 'hackrf_usb_board_ids' 
    LSomeInteger  := LDeviceList.usb_device_index^; // returns the device index as an integer value 
    LSomePointer  := LDeviceList.usb_devices^; // returns a pointer as 'usb_devices' seems to be a pointer to a pointer 
    // ... 
end; 
1

は逆参照演算子を使用する簡単なことです。ポインタが逆参照されると、ポインタによって参照される型の値が返されます。ポインタは、それがどのターンでできる、そのポインタを生成する逆参照ポインタへのポインタであれば

var 
    intPtr: PInteger; 
    charPtr: PChar; 
    ptr: Pointer; 
    int: Integer; 
    char: Char; 
begin 
    // .. 

    int := intPtr^; // read as: int := the int pointed to by intPtr 
    char := charPtr^; // read as: char := the char pointed to by charPtr 

    // For untyped pointers you need to cast 

    int := Integer(ptr^); 
    char := Char(ptr^); 
end; 

:型なしポインタについては、これはあなたが逆参照によって得られたされたどのような種類のコンパイラを伝えるために型キャストする必要があることを意味します参照解除されます。

この逆参照ポインターは、変数およびクラスとレコードのメンバー(例のように)に使用できます。ただし、コンパイラと言語は、自動逆参照をサポートしています。

あなたには、いくつかのレコード型へのポインタを持っているとそのレコードの特定のメンバーを参照したい場合、あなたはまだ(あなたは間接参照演算子を残すことができますコンパイラを間接参照演算子を使用したりすることができ、されますですあなたのために自動的に逆参照されます)。 「私は必要なのか、料理のいくつかの良い例である。」

type 
    PPoint = ^TPoint; 
    TPoint = record 
    X, Y: Integer; 
    end; 

var 
    pointPtr: PPoint; 
    myX, myY: Integer; 
begin 
    //.. 

    myX := pointPtr^.X; 
    myY := pointPtr^.Y; 

    // or you can simply write: 

    myX := pointPtr.X; 
    myY := pointPtr.Y; 
end;