Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Вниздинамические массивы из 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c