|
Модераторы: Poseidon, Snowy, bems, MetalFan |
|
Guest |
|
|||
Unregistered |
Доброго всем времени суток.
Задача такова: необходимо использовать в Delphi подпрограммы из Фортрана, через DLL,- там высокая эффективность алгоритмов и много отличной математики в модулях. Проблема: не удается передавать массивы данных ни по ссылке , ни по значению - передаются не данные а ботва. Корректно передаются скалярные данные и ссылки на них, но если пытаюсь передать еще и массив (или типизированную ссылку на массив), то уродуются и они, при передаче нетипизированной ссылки (просто адреса массива) прочие параметры подпрограмы не повреждаются, но корректно разыменовать ссылку в Фортран-подпрограмме не удается. В идеале хочется выделять память под массивы в Delphi а в фортран слать/получать только ссылки, разыменовывая их внутри Фортрана. Кто знает как можно проделать эти операции, подскажите, идею очень хочется реализовать. Заранее спасибо, KAS. e-mail: [email protected] |
|||
|
||||
acp |
|
|||
Опытный Профиль Группа: Участник Сообщений: 389 Регистрация: 4.2.2003 Где: Владимир Репутация: нет Всего: 2 |
1. Возможно например, проблема в фортрановских dll'ях. Т.к. если передавать ссылку на обычный массив (array of byte), а точнее на его первый элемент, то не должно возникнуть никаких проблем с ним. Он представляется как обычная последовательность байтов. Или требуется передать что нибудь типа array of TSomeType (где TSomeType = record ...)? 2. Может у вас проблемы с stdcall/pascal? |
|||
|
||||
Mikel |
|
|||
Опытный Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: 1 Всего: 2 |
может вы не правильно указали как вызывать процедуру(сообщение выше). Вы должны знать как читать параметры(слева направо-pascal, справа на лево-stdcall, а также кто чистит стек-вызывающая процедура, или вызываемая)
-------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
KAS |
|
|||
Unregistered |
К сожалению дело, видимо, в чем-то другом. С протоколами передачи все в порядке. В фортране я указываю передачу данных "как в СИ" - там есть такая опция компилятора для DLL. В Delphi можно использовать директивы stdcall, cdecl и safecall - я экспериментально проверял для любых скалярных типов данных передача в фортран, модификация и возврат значения в Delphi работают корректно. То что работает cdecl, где стек очищает вызывающая програма меня тоже несколько удивило, но это факт. Вообще я использую stdcall как наиболее логичную. Передать массив не удается ни какой - не простейший из однобайтовых беззнаковых, ни других типов. Не получилось использовать и просто безтиповую ссылку на начало массива с последующим разыменованием в фортране. Естественно я попробовал поиграться с разными массивами, которые описываются в самой фортран-подпрограме. Там корректно работает все (использование статического массива, ссылки на него, использование динамического массива), не удается всего лишь передать его в Delphi.
Но за обсуждение спасибо. Если у кого-то появятся мысли по поводу, пожалуйста пишите как удобнее на сайт или на e-mail. KAS |
|||
|
||||
Mikel |
|
|||
Опытный Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: 1 Всего: 2 |
А фортран корректно работает с памятью windows'a. Может в этом проблема?
И как представляется массив в фортране? -------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
Guest_stranger |
|
|||
Unregistered |
Как ты описываешь в Дельфи аргумент-массив?
Случайно не как открытый массив? - так к нему паскаль неявный параметр - длину пристыковывает. Попробуй так: декларация 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 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.10.2022 Репутация: нет Всего: нет |
Модератор: Сообщение скрыто. |
|||
|
||||
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |