Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.041 c
9-1110789626
WandererGTA
2005-03-14 11:40
2005.06.14
Помогите!


14-1116766960
SGoal
2005-05-22 17:02
2005.06.14
Иконки


3-1115199668
Danilka
2005-05-04 13:41
2005.06.14
ADO, странное формирование запроса на апдейт.


1-1117195187
Intro
2005-05-27 15:59
2005.06.14
FileListBox


1-1117432147
Inkotex
2005-05-30 09:49
2005.06.14
В чем разница?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский