Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.04.2020, 21:32
trs25 trs25 вне форума
Прохожий
 
Регистрация: 16.04.2014
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Функция на C

Добрый вечер. Пытаюсь перевести код, который написан на C. С dll вызываю функцию bladerf_get_device_list. Вот сам код:

Код:
 typedef enum {
    BLADERF_BACKEND_ANY, 
    BLADERF_BACKEND_LINUX, 
    BLADERF_BACKEND_LIBUSB, 
    BLADERF_BACKEND_CYPRESS, 
    BLADERF_BACKEND_DUMMY = 100, 
   } bladerf_backend;

#define BLADERF_DESCRIPTION_LENGTH 33
#define BLADERF_SERIAL_LENGTH 33

struct bladerf_devinfo {
  bladerf_backend backend; 
  char serial[BLADERF_SERIAL_LENGTH]; 
  uint8_t usb_bus; 
  uint8_t usb_addr; 
  unsigned int instance; 
  char manufacturer[BLADERF_DESCRIPTION_LENGTH];
  char product[BLADERF_DESCRIPTION_LENGTH]; 
};

int CALL_CONV bladerf_get_device_list(struct bladerf_devinfo **devices);

Попробовал это все перевести в Delphi. Функция возвращает 1 (одно устройство подключено, но сама запись заполняется неверными данными)
Код:
Bladerf_Backend = (BLADERF_BACKEND_ANY,  BLADERF_BACKEND_LINUX,  BLADERF_BACKEND_LIBUSB,  BLADERF_BACKEND_CYPRESS,  BLADERF_BACKEND_DUMMY = 100);

PDevice = ^TDevice;
TDevice = record
  backend  : Bladerf_Backend;
  serial   : PAnsiChar;
  usb_bus  : Byte;
  usb_addr : Byte;
  instance : Integer;
  manufacturer :PAnsiChar;
  product :PAnsiChar;
end;

bladerf_get_device_list: function(point: PDevice): integer; cdecl;

//Try to execute
procedure TForm1.Button1Click(Sender: TObject);
var
  myblade : TDevice;
  pointer : PDevice;
begin
  pointer := @myblade;
  dongle_count:= bladerf_get_device_list(pointer);
  myblade := pointer^;
  Memo1.Lines.Add(myblade.serial);
  Memo1.Lines.Add(myblade.manufacturer);
  Memo1.Lines.Add(myblade.product);
end;
Нужна помощь. Спасибо
Ответить с цитированием
  #2  
Старый 14.04.2020, 20:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. плохая идея использовать ключевое слово в качестве имени переменной (pointer)
2. На сколько я вижу, функция принимает указатель на массив структур, а не просто указатель на структуру.
3. какое соглашение по вызову прячестся за CALL_CONV. Обычно в С используется PASCAL, но разрабы могли и другой тип использовать.
4. char[] и PAnsiString это разные типы. Попробуй Array[0..32] of Byte или of AnsiChar.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter