Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В чем отличие 
V
    Опции темы
lnix
Дата 7.5.2010, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
Alexeis
Дата 7.5.2010, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
lnix
Дата 7.5.2010, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



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

Добавлено через 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;

PM MAIL   Вверх
Alexeis
Дата 7.5.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



lnix, так что эта функция вызывается из экзешником из Dll?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
lnix
Дата 7.5.2010, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



Да функция вызывается exe из dll
PM MAIL   Вверх
Alexeis
Дата 7.5.2010, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
lnix
Дата 7.5.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



Приблизительно к такому же выводу я и пришел, хотя теплилась надежда... маленькая совсем...
Очень признателен.
PM MAIL   Вверх
Alexeis
Дата 7.5.2010, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.