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

Вниз

динамические массивы из Delphi в фортрановскую dll   Найти похожие ветки 

 
ghg ©   (2004-04-16 11:07) [0]

есть странности, может кто поможет объяснить
имеем такой код в Delphi

var
 nxout, nyout : integer;
 dx, dy, dz, dx_out, dy_out, dz_out : array of single;

procedure GRID(nLines, nxout, nyout : integer; dx, dy, dz : array of single); stdcall; external "grid.dll";

implimentation
...
 grid(lines, nxout, nyout, dx, dy, dz);

где lines это длины массивов dx, dy, dz

в фортране имеем следующий код


subroutine grid (nLines, nxout, nyout, dx_, dy1, dy_, dz1, dz_, dx1)

 !DEC$ ATTRIBUTES DLLEXPORT::grid
 !DEC$ ATTRIBUTES VALUE::nLines
 !DEC$ ATTRIBUTES VALUE::nxout
 !DEC$ ATTRIBUTES VALUE::nyout

 Integer*4  nLines, nxout, nyout
 Real*4  dX_(1:nLines), dY_(1:nLines), dZ_(nLines), dY1(1:nLines), dZ1(nLines), dX1(nLines)


как видно в дельфи и в фортране эти процедуры описаны по разному, но все работает правильно, а именно

на вход фортрановксой dll подаем три массива, при чтении в фортране имеем: первый массив тот который нам нужен (dx_) и он соответствует массиву dx из дельфи, далее идет массив dx1, который мне приходится вводить для правильного чтения данных со входа, в нем все элементы Undefined address
далее читаем dy_ в нем все то что в dy из дельфи, далее опять приходится вводить dy1, в котором опять все Undefined address
таже история и dz

вопрос: почему так происходит и если я что-то деаю не правильно, то как делать правильно?


 
ghg ©   (2004-04-16 11:10) [1]

сорри есть исправление
строку
subroutine grid (nLines, nxout, nyout, dx_, dy1, dy_, dz1, dz_, dx1)
читать как
subroutine grid (nLines, nxout, nyout, dx_, dx1, dy_, dy1, dz_, dz1)


 
Alx2 ©   (2004-04-16 11:15) [2]

Попробуй  вместо
procedure GRID(nLines, nxout, nyout : integer; dx, dy, dz : array of single); stdcall; external "grid.dll";
написать
procedure GRID(nLines, nxout, nyout : integer; dx, dy, dz :PSingle); stdcall; external "grid.dll";
Где Psingle=^Single;
А передавать параметры в нее вот так:
GRID(nLines, nxout, nyout, @dx[0], @dy[0], @dz[0]);


 
ghg ©   (2004-04-16 11:24) [3]

попробую сейчас, но

почему так происходит?


 
Alx2 ©   (2004-04-16 11:26) [4]

>ghg ©   (16.04.04 11:24) [3]
Потому-что динамический массив несколько необычен :))
И кроме того, параметры в процедуру у тебя описывают на самом деле не динамический массив.


 
Юрий Зотов ©   (2004-04-16 11:29) [5]

1. Процедура в DLL имеет 9 параметров. Почему же ее прототип в Delphi описан с 6-ю параметрами? Должно быть точное соответствие.

2. Насколько я понял, out-массивы заполняются в процедуре из DLL. Если так, то перед ее вызовом надо установить длину для всех out-массивов по образцу:
SetLength(dx_out, nxout)


 
PVOzerski ©   (2004-04-16 11:31) [6]

Рискну высказаться, хотя сам с этим всем дела не имел.
1) В фортране все параметры передаются по ссылке.
2) Динамический массив - сложная структура, но элементы в нем выстроены в обычную цепочку.

Исходя из этого, предлагаю:
1) В дельфийском приложении при описании параметров указать длины как var целое (с учетом байтового представления в Фортране);
2) В дельфийском приложении при описании параметров указать массивы на выбор как а) var single; б) нетипизированный var; в) pointer по значению);
3) Передавать не массивы, а их начальные элементы (в случае 2в - адреса начальных элементов)

И не забывать о calling conventions.
Всё, граблей вроде не вижу.


 
han_malign ©   (2004-04-16 11:43) [7]

при передаче динамического массива, насколько я помню, сначала в стек помещается 4 байта длины, потом указатель на начало(или наоборот) - поэтому, кстати, проходит различие в количестве параметров(стек не плывет), а вот трактовка данных... - см. PVOzerski ©   (16.04.04 11:31) [6]


 
Anatoly Podgoretsky ©   (2004-04-16 11:46) [8]

PVOzerski ©   (16.04.04 11:31) [6]
Ну какой тут риск, это известный и хорошо документированный факт



Страницы: 1 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
1-1081770981
TButton
2004-04-12 15:56
2004.05.02
SetLength


6-1078696226
kat
2004-03-08 00:50
2004.05.02
Код открывающий доступ к логическим дискам


1-1081955088
kEY//
2004-04-14 19:04
2004.05.02
Одноэкземплярное приложение


1-1081915858
alexprozorov
2004-04-14 08:10
2004.05.02
Как узнать какие функции есть в DLL ?


1-1082110042
dimon1979
2004-04-16 14:07
2004.05.02
Встроенный ассемблер