Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передать массив как аргумент функции из dll [D6, D7]


Страницы:   1 2

tower ©   (2006-11-03 11:25:00) 

Здраствуйте.

Нужно сделать dll библиотеку в которой будет функция для обработки матриц. Нужно из вызывающей программы передать массим и вернуть массив.
Как это сделать? Передавать массив по ссылке? Как сделать обработку массива любой размерности(размерность передать отдельным параметром)?


Leonid Troyanovsky   (2006-11-04 14:47:00) [1]


> Ученик чародея ©   (04.11.06 13:53) [25]

>  или по выделению памяти в глобальных
> переменных твоей dll и передачи ссылки на эту память.


Идея и сам по себе не очень хороша,
а уж реализация - совсем никудышная.

--
Regards, LVT.


Ученик чародея   (2006-11-04 13:53:00) [2]


>
> tower   (03.11.06 11:25)
>
> Здраствуйте.
>
> Нужно сделать dll библиотеку в которой будет функция для
> обработки матриц. Нужно из вызывающей программы передать
> массим и вернуть массив.
> Как это сделать? Передавать массив по ссылке? Как сделать
> обработку массива любой размерности(размерность передать
> отдельным параметром)?


Real - это тип Паскаля и в других средах не поддерживается, используй float,double. Хотя в Delphi real - это синоним double, но лучше так не писать.

Передачу массива ты можешь производить или по выделению памяти в хост приложении , или по выделению памяти в глобальных переменных твоей dll и передачи ссылки на эту память.

1 вариант стандартный и, думаю, понятен.

2.

library xxx;

uses ...;

TGlobalVariable=record
 M:array of array of double;
 id:integer;
 end;

var MyGlovalVariable:array of TGlobalVariable;
var ExitSave: Pointer;

Procedure ClearExit;stdcall;
////

procedure OnFinalize;
begin
 ClearExit;
 //exit code
 ExitProc := ExitSave;
end;

begin
 SetLength(MyGlovalVariable,0);
 //readdress Exit Procedure
 ExitSave := ExitProc;
 ExitProc := @OnFinalize;
end.


Сергей М.   (2006-11-04 10:42:00) [3]


> Всё таки, у него делфи.


На момент отладки/тестирования - да.
Но не факт, что в дальнейшем не будет попытки использовать эту dll в хост-приложениях, разработанных в иных средах


Дмитрий Белькевич   (2006-11-04 02:34:00) [4]

>Никак. Я еще только разбираюсь. Но в вызывающей программе он наверное будет в обычном виде

var a,b:array[1..10,1..10] of real;
......
//вызвать экспортируемую функцию в которой в массиве b будет результат.
exportedproc(a,b,3);

Всё таки, у него делфи.


Сергей М.   (2006-11-03 13:22:00) [5]


> как вернуть?


Смотря куда возвращаешь - в делфи-модуль или в иной


tower   (2006-11-03 13:13:00) [6]

Уже все написал. Работает. Всем спасибо.


Дмитрий Белькевич   (2006-11-03 13:10:00) [7]

Если все длины и рамерности заранее известны (на этапе компиляции имеется в виду), то возращай как любую другую переменную.


tower   (2006-11-03 13:02:00) [8]

Да. Я знаю как передать, но как вернуть? Нужно делать функцию которая возвращает массив. Как это сделать?


Array   (2006-11-03 13:00:00) [9]


> Статический.


только? ((((


tower   (2006-11-03 12:57:00) [10]

Статический.


Array   (2006-11-03 12:54:00) [11]


> Сергей М. ©   (03.11.06 12:50) [15]

вы хотите сказать что можно передать дин.масив в Dll?
в смысле ссылку?


Сергей М.   (2006-11-03 12:50:00) [12]

Есть два варианта - вариантный массив и статический массив.

Какой выбираешь ?


Evgeny V   (2006-11-03 12:47:00) [13]


> tower   (03.11.06 12:38) [13]  -
> Думаю если я поставлю максимальный размер 20 на 20 то ничего
> не случится

В реальной программе может и случится...
А передать еще и размер(ность) другим параметром или параметрами?


tower   (2006-11-03 12:38:00) [14]

Не не известно. Хотя это обычная лабораторная работа. Думаю если я поставлю максимальный размер 20 на 20 то ничего не случится.


Сергей М.   (2006-11-03 12:32:00) [15]


> хотел сделать так чтоб в dll  не указывать максимального
> N. Но похоже не получится.


Ну почему же не получится ?

Ты еще раз уточни - матрица будет заведомо NxN и при этом N заранее (т.е. на стадии компиляции) не известно ?

От этого и конкретное решение зависит ...


> Можно ли експортировать типы данных?


Нельзя.


tower   (2006-11-03 12:22:00) [16]

Еще один вопрос по dll .
Можно ли експортировать типы данных? Если я описал тип PMatrix в библиотеке, то может его не описывать в вызывающей программе а както импортировать?


tower   (2006-11-03 12:11:00) [17]

Размерность у массивов будет 2, тоесть матрица. Размер матрицы NxN.  Я хотел сделать так чтоб в dll  не указывать максимального N. Но похоже не получится.
Спасибо за пример.


Сергей М.   (2006-11-03 12:05:00) [18]


> массива любой размерности


Как-то не сочетается примером в [4] - там ты явно задаешь размерность = 2


Сергей М.   (2006-11-03 11:58:00) [19]


> Мне придется описывать тип PMatrix и в dll и в вызывающей
> программе?


Обязательно.


> имел ввиду длинну


Что такое "длина массива", если он многомерный(т.е. размерность > 1) ?


tower   (2006-11-03 11:57:00) [20]

> А что такое "размерность"?

Я имел ввиду длинну.

Относительно

PMatrix = ^TMatrix;
TMatrix = array[1..10,1..10] of real;
..
var a,b: TMatrix;
...
procedure exportedproc(a,b: PMatrix; ...);
begin
...
b[i,j] := a[i,j];
...
end;


Мне придется описывать тип PMatrix и в dll и в вызывающей программе?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо