Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интеграция Delphi и Fortran 
:(
    Опции темы
Guest
Дата 24.6.2003, 22:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

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

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

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

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








  Вверх
acp
Дата 25.6.2003, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 4.2.2003
Где: Владимир

Репутация: нет
Всего: 2




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

PM WWW ICQ   Вверх
Mikel
Дата 25.6.2003, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: 1
Всего: 2



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


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
KAS
Дата 26.6.2003, 17:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: 1
Всего: 2



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


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
Guest_stranger
Дата 29.6.2003, 00:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 13.10.2022, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 12.10.2022

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1181 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.