Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.033 c
14-1081585266
DoG
2004-04-10 12:21
2004.05.02
CreateThread !


9-1069533365
MrAngel
2003-11-22 23:36
2004.05.02
Ги - опять glVertexPointerEXT ;-)


1-1081941918
Cr@zy-EyE
2004-04-14 15:25
2004.05.02
Создаю объект в initialization, а в юните его не видно


7-1078580326
KME
2004-03-06 16:38
2004.05.02
Работа с дискетами


6-1078826063
knack
2004-03-09 12:54
2004.05.02
как узнать подключен или нет протокол TCP/IP?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский