Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Интеграция Delphi и Fortran


Автор: Guest 24.6.2003, 22:52
Доброго всем времени суток.
Задача такова: необходимо использовать в Delphi подпрограммы из Фортрана, через DLL,-
там высокая эффективность алгоритмов и много отличной математики в модулях.
Проблема: не удается передавать массивы данных ни по ссылке , ни по значению - передаются не данные а ботва.

Корректно передаются скалярные данные и ссылки на них, но если пытаюсь передать еще и массив (или типизированную ссылку на массив), то уродуются и они, при передаче нетипизированной ссылки (просто адреса массива) прочие параметры подпрограмы не повреждаются, но корректно разыменовать ссылку в Фортран-подпрограмме не удается.

В идеале хочется выделять память под массивы в Delphi а в фортран слать/получать только ссылки, разыменовывая их внутри Фортрана.

Кто знает как можно проделать эти операции, подскажите, идею очень хочется реализовать.

Заранее спасибо, KAS. e-mail: [email protected]








Автор: acp 25.6.2003, 02:12

1. Возможно например, проблема в фортрановских dll'ях. Т.к. если передавать ссылку на обычный массив (array of byte), а точнее на его первый элемент, то не должно возникнуть никаких проблем с ним. Он представляется как обычная последовательность байтов. Или требуется передать что нибудь типа array of TSomeType (где TSomeType = record ...)?
2. Может у вас проблемы с stdcall/pascal?

Автор: Mikel 25.6.2003, 17:19
может вы не правильно указали как вызывать процедуру(сообщение выше). Вы должны знать как читать параметры(слева направо-pascal, справа на лево-stdcall, а также кто чистит стек-вызывающая процедура, или вызываемая)

Автор: KAS 26.6.2003, 17:38
К сожалению дело, видимо, в чем-то другом. С протоколами передачи все в порядке. В фортране я указываю передачу данных "как в СИ" - там есть такая опция компилятора для DLL. В Delphi можно использовать директивы stdcall, cdecl и safecall - я экспериментально проверял для любых скалярных типов данных передача в фортран, модификация и возврат значения в Delphi работают корректно. То что работает cdecl, где стек очищает вызывающая програма меня тоже несколько удивило, но это факт. Вообще я использую stdcall как наиболее логичную. Передать массив не удается ни какой - не простейший из однобайтовых беззнаковых, ни других типов. Не получилось использовать и просто безтиповую ссылку на начало массива с последующим разыменованием в фортране. Естественно я попробовал поиграться с разными массивами, которые описываются в самой фортран-подпрограме. Там корректно работает все (использование статического массива, ссылки на него, использование динамического массива), не удается всего лишь передать его в Delphi.
Но за обсуждение спасибо. Если у кого-то появятся мысли по поводу, пожалуйста пишите как удобнее на сайт или на e-mail.
KAS

Автор: Mikel 27.6.2003, 14:50
А фортран корректно работает с памятью windows'a. Может в этом проблема?
И как представляется массив в фортране?

Автор: Guest_stranger 29.6.2003, 00:35
Как ты описываешь в Дельфи аргумент-массив?
Случайно не как открытый массив? - так к нему
паскаль неявный параметр - длину пристыковывает.

Попробуй так:

декларация
procedure FortranProc(var Arr1, Arr2; var N: Integer); cdecl; external ... name ...; // если она у тебя в фортране cdecl

вызов
FortranProc(a[0], b[0], N);

В фортране
SUBROUTINE FORTRANPROC (ARR1, ARR2, N)
REAL*4 ARR1(N), ARR2(N) ! для примера - я не знаю, какой у тебя массив
INTEGER N
...

И, если ты используешь двумерные массивы, не забудь, что они в
фортране по столбцам хранятся, а не по строкам, как в паскале.

ЗЫ насколько я помню, в фортране всё передаётся только по ссылке.
Передать что-то по значению нельзя.


Автор: aqually 13.10.2022, 15:14
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)