Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > В чем отличие


Автор: lnix 7.5.2010, 13:51
Столкнулся с проблемой передачи массива через параметры из dll в приложение написанное на VC++ 2008.
Суть в следующем: при передаче массива типа TypeArray = arrat[0..1023] of double все работает замечательно.
При передача массива типа TypeArray = array of Double ничего не передается (размерность массива устанавливается в dll). Принимающий массив в программе имеет ту-же размерность что и возвращаемый из dll. Как обойти это ограничение?
Заранее благодарен.

Автор: Alexeis 7.5.2010, 14:12
Цитата(lnix @  7.5.2010,  12:51 Найти цитируемый пост)
При передача массива типа TypeArray = array of Double ничего не передается (размерность массива устанавливается в dll). Принимающий массив в программе имеет ту-же размерность что и возвращаемый из dll. Как обойти это ограничение?

  array of Double - это автоматический объект, на подобии vector, только проще, поэтому передавать его можно только как статический массив, да и то следить за тем, чтобы в программе которая его передала оставалась хотя бы одна ссылка него. Т.е. передавать адрес первого элемента. Дело в том, что у статического массива адрес переменной массива совпадает с адресом первого элемента. У array of Double это не так, поэтому если нужно передавать его как статический то только @a[0].

Автор: lnix 7.5.2010, 14:25
А где можно углубить свои знания по поводу размещения в памяти объектов и т.д. и т.п.
Можете посоветовать литераруту?

Добавлено через 5 минут и 56 секунд
Вот пример процедуры для возврата 
Код

procedure DinArray(const N: Integer; out Arr: TDinArray);
var
  I: Integer;
  Buf: TDinArray;
begin
  SetLength(Buf, N);
  for I := 0 to N - 1 do Buf[I]:= I;
  Arr:= Buf;
end;


возможно я туплю но что-то не получается

Добавлено через 9 минут и 11 секунд
да вот еще 
Код

TDinArray = array of Double;

Автор: Alexeis 7.5.2010, 15:31
lnix, так что эта функция вызывается из экзешником из Dll?

Автор: lnix 7.5.2010, 15:39
Да функция вызывается exe из dll

Автор: Alexeis 7.5.2010, 15:57
lnix, такой прототип функции невозможно описать в exe на MSVC . Потому что у него нет соответствия типу array of Double; А второе, что разные менеджеры памяти.

Автор: lnix 7.5.2010, 16:04
Приблизительно к такому же выводу я и пришел, хотя теплилась надежда... маленькая совсем...
Очень признателен.

Автор: Alexeis 7.5.2010, 16:15
lnix, но есть соответствие типу ^array[0..0] of Double. Это double** . Но тогда память в делфи нужно будет выделять при помощи LocalAlloc HeapAlloc.

Добавлено через 2 минуты и 40 секунд
  В делфи вызываем GetProcessHeap и получаем дескриптор кучи приложения. Его передаем в HeapAlloc и выделяем память. В вижуалке для освобождения вызываем HeapFree.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)