Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1164884290
pyJIoH
2006-11-30 13:58
2006.12.17
Экспорт в rtf. Ünicode =)


2-1164906050
ssss
2006-11-30 20:00
2006.12.17
Нажать клавишу мыши!


3-1160552935
вп
2006-10-11 11:48
2006.12.17
Как создать индекс для таблицы VFP ?


15-1164462327
TIF
2006-11-25 16:45
2006.12.17
>>>>> Скачать Delphi >>>>>


2-1164620173
bablja
2006-11-27 12:36
2006.12.17
Округление





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский