Форум: "Основная";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];
ВнизПередать массив как аргумент функции из dll Найти похожие ветки
← →
tower (2006-11-03 11:25) [0]Здраствуйте.
Нужно сделать dll библиотеку в которой будет функция для обработки матриц. Нужно из вызывающей программы передать массим и вернуть массив.
Как это сделать? Передавать массив по ссылке? Как сделать обработку массива любой размерности(размерность передать отдельным параметром)?
← →
Сергей М. © (2006-11-03 11:27) [1]
> Передавать массив по ссылке?
Если размер массива заранее не известен, то конечно по ссылке.
← →
tower (2006-11-03 11:30) [2]>Если размер массива заранее не известен, то конечно по ссылке.
А вы примерчик передачи массива по ссылке не дадите?
← →
Сергей М. © (2006-11-03 11:34) [3]а как у тебя декларирован сам массив ?
← →
tower (2006-11-03 11:38) [4]Никак. Я еще только разбираюсь. Но в вызывающей программе он наверное будет в обычном виде
var a,b:array[1..10,1..10] of real;
......
//вызвать экспортируемую функцию в которой в массиве b будет результат.
exportedproc(a,b,3);
← →
Сергей М. © (2006-11-03 11:51) [5]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;
← →
Loginov Dmitry © (2006-11-03 11:51) [6]> Как сделать обработку массива любой размерности
А что такое "размерность"?
← →
tower (2006-11-03 11:57) [7]> А что такое "размерность"?
Я имел ввиду длинну.
Относительно
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 и в вызывающей программе?
← →
Сергей М. © (2006-11-03 11:58) [8]
> Мне придется описывать тип PMatrix и в dll и в вызывающей
> программе?
Обязательно.
> имел ввиду длинну
Что такое "длина массива", если он многомерный (т.е. размерность > 1) ?
← →
Сергей М. © (2006-11-03 12:05) [9]
> массива любой размерности
Как-то не сочетается примером в [4] - там ты явно задаешь размерность = 2
← →
tower (2006-11-03 12:11) [10]Размерность у массивов будет 2, тоесть матрица. Размер матрицы NxN. Я хотел сделать так чтоб в dll не указывать максимального N. Но похоже не получится.
Спасибо за пример.
← →
tower (2006-11-03 12:22) [11]Еще один вопрос по dll .
Можно ли експортировать типы данных? Если я описал тип PMatrix в библиотеке, то может его не описывать в вызывающей программе а както импортировать?
← →
Сергей М. © (2006-11-03 12:32) [12]
> хотел сделать так чтоб в dll не указывать максимального
> N. Но похоже не получится.
Ну почему же не получится ?
Ты еще раз уточни - матрица будет заведомо NxN и при этом N заранее (т.е. на стадии компиляции) не известно ?
От этого и конкретное решение зависит ...
> Можно ли експортировать типы данных?
Нельзя.
← →
tower (2006-11-03 12:38) [13]Не не известно. Хотя это обычная лабораторная работа. Думаю если я поставлю максимальный размер 20 на 20 то ничего не случится.
← →
Evgeny V © (2006-11-03 12:47) [14]
> tower (03.11.06 12:38) [13] -
> Думаю если я поставлю максимальный размер 20 на 20 то ничего
> не случится
В реальной программе может и случится...
А передать еще и размер(ность) другим параметром или параметрами?
← →
Сергей М. © (2006-11-03 12:50) [15]Есть два варианта - вариантный массив и статический массив.
Какой выбираешь ?
← →
Array (2006-11-03 12:54) [16]
> Сергей М. © (03.11.06 12:50) [15]
вы хотите сказать что можно передать дин.масив в Dll?
в смысле ссылку?
← →
tower (2006-11-03 12:57) [17]Статический.
← →
Array (2006-11-03 13:00) [18]
> Статический.
только? ((((
← →
tower (2006-11-03 13:02) [19]Да. Я знаю как передать, но как вернуть? Нужно делать функцию которая возвращает массив. Как это сделать?
← →
Дмитрий Белькевич © (2006-11-03 13:10) [20]Если все длины и рамерности заранее известны (на этапе компиляции имеется в виду), то возращай как любую другую переменную.
← →
tower (2006-11-03 13:13) [21]Уже все написал. Работает. Всем спасибо.
← →
Сергей М. © (2006-11-03 13:22) [22]
> как вернуть?
Смотря куда возвращаешь - в делфи-модуль или в иной
← →
Дмитрий Белькевич © (2006-11-04 02:34) [23]>Никак. Я еще только разбираюсь. Но в вызывающей программе он наверное будет в обычном виде
var a,b:array[1..10,1..10] of real;
......
//вызвать экспортируемую функцию в которой в массиве b будет результат.
exportedproc(a,b,3);
Всё таки, у него делфи.
← →
Сергей М. © (2006-11-04 10:42) [24]
> Всё таки, у него делфи.
На момент отладки/тестирования - да.
Но не факт, что в дальнейшем не будет попытки использовать эту dll в хост-приложениях, разработанных в иных средах
← →
Ученик чародея © (2006-11-04 13:53) [25]
>
> 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.
← →
Leonid Troyanovsky © (2006-11-04 14:47) [26]
> Ученик чародея © (04.11.06 13:53) [25]
> или по выделению памяти в глобальных
> переменных твоей dll и передачи ссылки на эту память.
Идея и сам по себе не очень хороша,
а уж реализация - совсем никудышная.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.059 c