| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
Модератор: Сообщение скрыто. |