Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2011, 20:22   #1
Davlet M
Пользователь
 
Регистрация: 27.08.2009
Сообщений: 34
Стрелка создание fortran dll для c++

есть код программы на фортране, можно ли создать длл для с++, и можно ли будет получать результаты выполнения фортрановского модуля из этой длл? как это сделать? и будет ли снижать скорость работы программы, или осуществить просто перевод из фортрана в с++??
Davlet M вне форума Ответить с цитированием
Старый 27.02.2011, 21:14   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от Davlet M Посмотреть сообщение
есть код программы на фортране, можно ли создать длл для с++, и можно ли будет получать результаты выполнения фортрановского модуля из этой длл?
Можно.

Цитата:
Сообщение от Davlet M
как это сделать?
- знание соответствия между C-шными и фортрановскими типами данных;
- знание механизма передачи параметров в подпрограмму и обратно там и там;
- знание некоторых тонкостей конкретного фортран-компилятора (какие "decoration rules" используются);
- API-функции LoadLibrary() и GetProcAddress().

Цитата:
Сообщение от Davlet M
будет ли снижать скорость работы программы
А из-за чего должно произойти "снижение скорости"?

Цитата:
Сообщение от Davlet M
или осуществить просто перевод из фортрана в с++??
Очень непростой вопрос, зависящий от кучи трудноформализуемых факторов. Знание Фортрана C-программистом, который отважился на портинг?.. Какой Фортран? 90? Или IV?.. С LOGICAL*1 - массивами для хранения символьных переменных, с арифметическими IF-ами и с кучей GOTO?.. Объём кода?.. Знание хотя бы основ предметной области (отнюдь не такой неважный вопрос, как может показаться на первый взгляд)? Сроки? Часто бывает, что фортрановские программы вылизывались десятилетиями, а после портинга, даже самого тщательного, ошибки будут неминуемо какое-то время вылезать...

В общем, google-запросы типа "calling fortran from C++" или "fortran C mixed-language programming" в помощь! Ну и в help-е к Вашему Фортрану что-то наверняка есть. Задайте "Mixed-language" в поиске...

ADDED 19:31 CET
А, и ещё... Посмотрите в началах Фортрановских файлов: операторов COMMON и, особенно, EQUIVALENCE много? Если есть - плюньте на идею портинга сразу и сконцентрируйтесь на mixed-language программировании. Иногда, кстати, и статически удаётся Фортран прилинковать.

Последний раз редактировалось Vago; 27.02.2011 в 21:31.
Vago вне форума Ответить с цитированием
Старый 27.02.2011, 21:34   #3
Davlet M
Пользователь
 
Регистрация: 27.08.2009
Сообщений: 34
По умолчанию

так а как потом из dll вытаскивать значения нужных переменных? можно пример?
Davlet M вне форума Ответить с цитированием
Старый 27.02.2011, 21:42   #4
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от Davlet M Посмотреть сообщение
так а как потом из dll вытаскивать значения нужных переменных?
Ну, если бы DLL была C-шной? У Вас такой вопрос возник бы? Есть DLL-ка, которую нужно загрузить, есть функция, точку входа в которую нужно найти, есть список параметров, есть возвращаемой значение. Здесь - то же самое. Только то, что в Фортране типа INTEGER*4 в C должно быть типа int* и т.п...

Цитата:
Сообщение от Davlet M Посмотреть сообщение
можно пример?
Какая у Вас пара C / Фортран? Что за компиляторы?
Vago вне форума Ответить с цитированием
Старый 27.02.2011, 21:46   #5
Davlet M
Пользователь
 
Регистрация: 27.08.2009
Сообщений: 34
По умолчанию

работаю в с++ билдер 6, какой фортран понятия не имею, поставили перед задачей, что нужно использовать этот код =(

могу привести пару строк:

DIMENSION E(3),B(3),Q(100)
COMPLEX CL(30),F1(100),F2(100)
COMMON/BL1/A,B1/BL2
READ(1,13) C,A,D1,E1
13 FORMAT(F7.4/F7.4/F7.4/F7.4/F7.4/F7.4/) итп))
Davlet M вне форума Ответить с цитированием
Старый 27.02.2011, 22:20   #6
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от Davlet M Посмотреть сообщение
работаю в с++ билдер 6
От работы с этой штуковиной Бог миловал!

Цитата:
Сообщение от Davlet M
какой фортран понятия не имею
Это надо знать. Потому как разные компиляторы одной и той же ф-ии дадут в DLL разные имена. А вызывать из C нужно будет по имени...

Цитата:
Сообщение от Davlet M
могу привести пару строк:

DIMENSION E(3),B(3),Q(100)
COMPLEX CL(30),F1(100),F2(100)
COMMON/BL1/A,B1/BL2
READ(1,13) C,A,D1,E1
13 FORMAT(F7.4/F7.4/F7.4/F7.4/F7.4/F7.4/) итп))
А вот и COMMON-ы!.. А заодно и READ с перфокарт... :D
...
Главная (безымянная) Фортран-программа оформляется как FUNCTION. Дальше - два варианта. Если READ'ов относительно немного - всё, что в них вводится, зафигачивается в список параметров, вводится в C и оттуда передаётся (а из Фортрана орераторы ввода, естественно, удаляются). Если много - через параметры передаётся имя файла с исх. данными, а до первого READ вставляется оператор OPEN (UNIT=1, FILE= ... ) на этот файл, и весь ввод делается в Фортране, как и делался.
Vago вне форума Ответить с цитированием
Старый 27.02.2011, 23:02   #7
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Davlet M, существует ещё один способ. Хоть и некрасивый, но работающий. Просто строится фортрановский exe-шник и запускается из C в нужном месте через system() (или что там в Борланде). Обмен данными - через файлы. Если "программный комплекс" лепится для внутреннего пользования - вполне может сойти. Тут вот человек с БЕЙСИКом Фортран намеревался сопрячь, но чем у него кончилось - не знаю...

Последний раз редактировалось Vago; 27.02.2011 в 23:06.
Vago вне форума Ответить с цитированием
Старый 28.02.2011, 00:22   #8
Davlet M
Пользователь
 
Регистрация: 27.08.2009
Сообщений: 34
По умолчанию

вся проблема в том, что ехешник ужасно грузит проц, ибо он запускаться должен очень много раз для расчета и настройки, при этом нужно создавать файлы и считывать их, а если внедрять код в с или использовать длл, то мне достаточно получить значения двух массивов. насчет перфокарт то да, вы правы, это очень старый код((( я хотел переводить с фортрана в с++. но уж очень приличный по объему текст((
Davlet M вне форума Ответить с цитированием
Старый 28.02.2011, 00:28   #9
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Я завтра какой-нибудь элементарный примерчик наваяю, попробую показать шаг за шагом, как это делается. ПосмОтрите, прикинете ещё раз, перед тем, как принять решение...
Vago вне форума Ответить с цитированием
Старый 28.02.2011, 00:30   #10
Davlet M
Пользователь
 
Регистрация: 27.08.2009
Сообщений: 34
По умолчанию

хорошо, спасибо)
Davlet M вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание dll на с++ для 1с8 zladej Общие вопросы C/C++ 0 05.07.2010 13:11
Создание dll John_chek Общие вопросы Delphi 3 24.09.2007 14:26
Создание dll файла для работы с БД Nadya БД в Delphi 2 15.02.2007 12:54