2016-08-09 128 views
0

Ich habe eine Bilanz von einer in C geschrieben DLL gefüllt ist, die diese Struktur hat:De-Referenzierung Satzelemente

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; 

Der Rekord scheint korrekt ausgefüllt zu werden, weil die ‚Device‘ zurück ganzen Zahlen und ‚usb_devicecoun Es ist wie erwartet. Was ich nicht herausfinden kann ist, wie man die anderen Elemente ablöst. Was ich brauche, ist Kochbuch oder ein paar gute Beispiele.
Hilfe

+1

Bitte besuchen Sie diese Seite und lesen Sie sie aufmerksam durch: http://stackoverflow.com/help/on-topic Hinweis 4: * Fragen, die uns auffordern, ein Buch, ein Tool, eine Softwarebibliothek, ein Lernprogramm oder eine andere Offsite-Ressource zu empfehlen oder zu finden sind off-topic für Stack Overflow, da sie dazu neigen, eigensinnige Antworten und Spam zu bekommen. Beschreiben Sie stattdessen das Problem und was bisher getan wurde, um es zu lösen. * Nachdem Sie mehr als 30 Fragen gestellt haben, ist es für uns vernünftig zu erwarten, dass Sie das wissen, ohne Sie daran erinnern zu müssen. –

+0

Tut mir leid, dass ich das Wort "Buch" benutze. Ich muss dich immer wieder erinnern, vielen Dank. Ich brauche immer noch Hilfe bei der Dereferenzierung der Aufzeichnung. Hast du welche? –

+0

Vielleicht könnten Sie ein Lehrbuch oder die Dokumentation konsultieren. Zeiger werden ausführlich dokumentiert. –

Antwort

2

Dereferenzieren von Zeigern ist ziemlich einfach. Es spielt keine Rolle, ob der Zeiger zu einem Datensatz, einer Klasse oder nur zu einer Variablen gehört. Sie dereferenzieren einen Zeiger, indem Sie den Operator ^ direkt hinter der Kennung des Zeigers hinzufügen.

Zum Beispiel:

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

einen Zeigers in Delphi Dereferenzierung ist eine einfache Sache, den Dereferenzierungsoperator verwenden. Wenn ein Zeiger dereferenziert wird, liefert er einen Wert des Typs, auf den der Zeiger verweist. Für einen nicht typisierten Zeiger bedeutet dies, müssen Sie typisieren den Compiler zu sagen, welche Art von der ergab sich dereferencing:

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; 

Also, wenn ein Zeiger ist ein Zeiger auf einen Zeiger dann dereferencing es diesen Zeiger ergibt, was wiederum dann dereferenziert werden.

Sie können diesen Dereferenzierungszeiger für Variablen und für Mitglieder von Klassen und Datensätzen verwenden (wie in Ihrem Beispiel). Der Compiler und die Sprache unterstützen jedoch auch automatische Dereferenzierung wo erforderlich.

Das heißt, wenn Sie einen Zeiger auf einen Datensatztyp haben und wünschen ein bestimmtes Mitglied des dass Datensatz verweisen, können Sie immer noch den Operator dereferenzieren verwenden oder Sie die Dereferenzierungsoperator auslassen können (den Compiler automatisch Dereferenzierung für Sie).

einen einfachen TPoint Datensatz als Beispiel: „Was ich brauche, ist Kochbuch oder einige gute Beispiele“

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;