Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.17;
Скачать: CL | DM;

Вниз

Передать массив как аргумент функции из 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.051 c
8-1146672134
MegaWolf
2006-05-03 20:02
2006.12.17
WAV-to-GSM конвертор


15-1164687154
DelphiN!
2006-11-28 07:12
2006.12.17
Отключить использование Proxy сервера в компоненте TWebBrowser


2-1164893329
aht
2006-11-30 16:28
2006.12.17
в общем, терзаюсь тожа, но по другому вопросу :-)


1-1162439245
PHPDeveloper
2006-11-02 06:47
2006.12.17
Поиск текста в файлах.


15-1163760223
vecna
2006-11-17 13:43
2006.12.17
Где в Москве купить ODAC?