![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передать массив как аргумент функции из dll [D6, D7]
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 и в вызывающей программе?