Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
ВнизДоступ на 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.134 c