Ваш перевод массивов char[]
неверен. Они должны быть объявлены как array[0..high] of AnsiChar
фиксированные массивы, а не как PAnsiChar
указатели.
Кроме того, ваше объявление bladerf_get_device_list()
неверно. Параметр devices
является выходным параметром, он возвращает вам указатель на массив устройств, поэтому функция должна иметь возможность изменять указатель, который вы ему задаете, что означает, что параметр должен быть объявлен как var
или out
типа указателя. Без этого вы вместо этого объявляете devices
в качестве входного параметра, и, таким образом, функция не может изменить ваш указатель.
Кроме того, не забудьте вызвать bladerf_free_device_list()
, когда вы закончите, используя список .
A буквальный перевод кода C будет выглядеть так:
type
bladerf_backend = (
BLADERF_BACKEND_ANY,
BLADERF_BACKEND_LINUX,
BLADERF_BACKEND_LIBUSB,
BLADERF_BACKEND_CYPRESS,
BLADERF_BACKEND_DUMMY = 100,
);
const
BLADERF_DESCRIPTION_LENGTH = 33;
BLADERF_SERIAL_LENGTH = 33;
type
pbladerf_devinfo = ^bladerf_devinfo;
bladerf_devinfo = record
backend: bladerf_backend;
serial: array[0..BLADERF_SERIAL_LENGTH-1] of AnsiChar;
usb_bus: UInt8;
usb_addr: UInt8;
instance: UInt32;
manufacturer: array[0..BLADERF_DESCRIPTION_LENGTH-1] of AnsiChar;
product: array[0..BLADERF_DESCRIPTION_LENGTH-1] of AnsiChar;
end;
const
libbladeRF = 'libbladeRF.dll'; // or whatever the actual DLL filename is...
function bladerf_get_device_list(out devices: pbladerf_devinfo): Int32; cdecl; external libbladeRF;
procedure bladerf_free_device_list(devices: pbladerf_devinfo); cdecl; external libbladeRF;
И тогда вы можете использовать его так:
{$POINTERMATH ON}
procedure TForm1.Button1Click(Sender: TObject);
var
devices: pbladerf_devinfo;
dongle_count, i: Int32;
begin
dongle_count := bladerf_get_device_list(devices);
if dongle_count < 0 then
// error handling ...
try
for i := 0 to dongle_count-1 do
begin
Memo1.Lines.Add(String(devices[i].serial));
Memo1.Lines.Add(String(devices[i].manufacturer));
Memo1.Lines.Add(String(devices[i].product));
end;
finally
bladerf_free_device_list(devices);
end;
end;
В качестве альтернативы:
procedure TForm1.Button1Click(Sender: TObject);
var
devices, device: pbladerf_devinfo;
dongle_count, i: Int32;
begin
dongle_count := bladerf_get_device_list(devices);
if dongle_count < 0 then
// error handling ...
try
device := devices;
for i := 0 to dongle_count-1 do
begin
Memo1.Lines.Add(String(device^.serial));
Memo1.Lines.Add(String(device^.manufacturer));
Memo1.Lines.Add(String(device^.product));
Inc(device);
end;
finally
bladerf_free_device_list(devices);
end;
end;