Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.14;
Скачать: CL | DM;

Вниз

Доступ на Delphi к значению функции - массиву записей   Найти похожие ветки 

 
Андрюха7   (2005-05-24 17:04) [0]

Исходные данные: имеем *.h-файл для Dll:

struct Rec
 {
  ...
 }

class MyClass
 {
public:
virtual Rec*    __stdcall GetData(int *total)   =0;
....
 }

Т.е. эта функция возвращает массив записей Rec.

Теперь пытаемся ее переложить на Дельфи.

Объявляем:

PRec = ^TRec;
TRec = record
...
end;

function GetData(pinteger total): PRec; stdcall;

Все отлично. Он создает массив. Но к нему через PRec сложно обратиться. Можно только к первой записи. Выход: просто добавляем новый тип и переопределяем функцию:

PARec = ^TARec;
TARec = array [0..KONSTANTA] of TRec;

function GetData(pinteger total): PARec; stdcall;

Теперь все работает, но только для не больше, чем для KONSTANTA элементов. При этом KONSTANTA приходится делать слишком большим, чтобы гарантированно уместить все элементы.

Вопрос: а можно доступ к массиву записей TRec организовать более "красивым" способом, чтобы не было ограничений в виде значения KONSTANTA?


 
Андрюха7   (2005-05-24 17:05) [1]

"pinteger total" естественно надо понимать как "total: pinteger" :) ОписАлся. Сорри.


 
Андрюха7 ©   (2005-05-25 16:40) [2]

Совета не будет? :(


 
TUser ©   (2005-05-25 16:42) [3]

packed record и packed array прежде всего


 
Андрюха7 ©   (2005-05-25 16:43) [4]

А как это мою проблему решает? Чуть компактнее будет память использоваться просто.


 
evvcom ©   (2005-05-25 16:44) [5]

Использовать будешь только в Delphi? Тогда используй динамический массив.


 
begin...end ©   (2005-05-25 16:47) [6]

> Андрюха7   (24.05.05 17:04)

> При этом KONSTANTA приходится делать слишком большим, чтобы
> гарантированно уместить все элементы.

Ну и что? Значение KONSTANTA можно делать очень большим (однако размер типа не должен превышать, если не ошибаюсь, 2 ГБ). Вы же не объявляете нигде переменную типа TARec -- значит, и памяти никакой не выделяется.

> Вопрос: а можно доступ к массиву записей TRec организовать
> более "красивым" способом, чтобы не было ограничений в виде
> значения KONSTANTA?

Есть ещё способ: объявить TARec как array [0..0] of TRec и отключить Range Checking.


 
Digitman ©   (2005-05-25 16:49) [7]


> все работает


работает ? или компилируется ?


 
Андрюха7 ©   (2005-05-25 17:31) [8]

2begin...end:
Именно так я и поступил. Konstanta задал таким, что размер предполагаемого массива стал равным 2Гб. Ведь dll создает массив нужного объема, а не максимально заложенного. Видимо это самое красивое решение.


 
Андрюха7 ©   (2005-05-25 17:32) [9]

2Digitman:
и работает, и компилится (не тот код, который я привел, т.к. я в нем немного все изменил, но суть осталась).


 
Андрюха7 ©   (2005-05-25 17:32) [10]

Всем спасибо за участие!


 
TUser ©   (2005-05-25 18:14) [11]

> Чуть компактнее будет память использоваться просто.

У тебя dll на Си написана, а в Си принят именно такой способ размещения данных в памяти. Поэтому без слова packed получится ерундень.



Страницы: 1 вся ветка

Текущий архив: 2005.06.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.035 c
14-1116850434
Копир
2005-05-23 16:13
2005.06.14
Кто умеет ругаться на Паскале?


14-1116917122
Layner
2005-05-24 10:45
2005.06.14
Яндекс.Деньги ворует деньги


14-1116784402
Vulko
2005-05-22 21:53
2005.06.14
Как сделать div на c++ ?


1-1117031143
SergP.
2005-05-25 18:25
2005.06.14
Необходимость деструктора в описании своего класса


1-1117259766
sofs
2005-05-28 09:56
2005.06.14
Проблема