2016-08-09 4 views
0

У меня есть запись заполняется с помощью DLL, написанной в C, который имеет такую ​​структуру:De-Referencing Запись Элементы

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

«Что мне нужно, это поваренная книга или несколько хороших примеров.» Пожалуйста, зайдите на эту страницу и внимательно прочитайте ее: http://stackoverflow.com/help/on-topic. Примечание. Пункт 4: * Вопросы, предлагающие нам рекомендовать или найти книгу, инструмент, библиотеку программного обеспечения, учебное пособие или другой ресурс вне сайта не относятся к теме для переполнения стека, поскольку они, как правило, привлекают упрямые ответы и спам. Вместо этого опишите проблему и то, что было сделано до сих пор, чтобы ее решить. * Задав здесь 30 вопросов, нам разумно ожидать, что вы это узнаете, не напомнив вам. –

+0

Извините за использование слова «Книга». Мне нужно многократно напоминать вам огромное спасибо. Мне все еще нужна помощь в разыменовании записи. У вас есть? –

+0

Возможно, вы могли бы проконсультироваться с учебником или документацией. Указатели всесторонне документированы. –

ответ

2

Указатели разыменования довольно просты. Не имеет значения, принадлежит ли указатель к записи, классу или просто некоторой переменной. Вы разыменовываете указатель, добавляя оператор ^ сразу после идентификатора указателя.

Например:

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

Разыменование указатель на Delphi простой вопрос с помощью оператора разыменования. Когда указатель разыменовывается, он дает значение типа, на которое указывает указатель. Для нетипизированного указателя это означает, что вам нужно типаж, чтобы сообщить компилятору, какой тип обеспечиваемыми разыменования:

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; 

Таким образом, если указатель является указателем на указатель, то разыменования он дает этот указатель, который в свою очередь может затем разыменовываются.

Вы можете использовать этот указатель разыменования для переменных и для членов классов и записей (как в вашем примере). Тем не менее, компилятор и язык также поддерживают автоматический разыменование в соответствующих случаях.

То есть, если у вас есть указатель на некоторый тип записи и хотите сослаться на конкретный член этой записи, вы можете использовать оператор разыменования или вы можете оставить разыменования оператор из (компилятор автоматически разыгрывается для вас).

Используя простой TPoint записи в качестве примера:

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;