Использование модуля Fortran90 в приложении C / C ++

0

У меня есть исходный файл большого модуля, написанного в fortran90 с некоторыми определениями типов, некоторыми интерфейсами, некоторыми функциями и подпрограммами. Я могу скомпилировать его и использовать его в обычной программе fortran.

Но так как я всегда использовал C/C++ и я не знаю так много fortran я бы хотел использовать этот модуль внутри программы C/C++. Это использует свои типы данных и вызывает на нем свои функции/подпрограммы.

Является ли это возможным? Как я могу это сделать? Каковы различные шаги, которые я должен выполнить? Есть ли некоторые исчерпывающие учебные пособия в Интернете (я не нашел так много с кратким поиском google).

  • 0
    C / C ++ не существует (есть C и C ++, и они не совпадают).
  • 0
    @crashmstr я знаю. Я имел в виду, что я обычно использую C или C ++, и я не думаю, что было бы так сильно отличаться от вызова кода на Fortran из C или из C ++
Показать ещё 2 комментария
Теги:
fortran
fortran90
static-linking

2 ответа

4

Fortran 2003 добавляет специальные положения, касающиеся взаимодействия с C. Вы можете найти краткое изложение в документации GCC. Однако, если ваш код Fortran не использует эти функции (как это, вероятно, не так), и вы не готовы его модифицировать, тогда ответ сильно зависит от ваших цепочек инструментов Fortran и C. Некоторые проблемы включают

  • имя mangling. Многие компиляторы Fortran неявно добавляют одно или несколько символов подчеркивания к объявленным именам функций, а большинство конвертируют идентификаторы либо в строчные, либо в верхние регистры
  • индексирование массива. Индексы массива Fortran начинаются с 1 (по умолчанию), а многомерные массивы индексируются в противоположном порядке, используемом C.
  • Строковые аргументы. Фортран имеет строки с прямой длиной. Способ, которым они представлены в списке аргументов функции, варьируется от компилятора к компилятору. Большинство из них используют char * и передают длину в качестве отдельного аргумента, но используются другие механизмы. Кроме того, аргумент length может следовать сразу после указателя, или он может быть добавлен в конце списка аргументов.
  • строки в целом. Фортран имеет строки с прямой длиной. Положения за конец действительных данных должны заполняться пустым.
  • указатели. У Fortran 95 нет исходных указателей. У него есть что-то, называемое указателем, но оно не является непосредственно аналогичным указателю на C.
  • скалярные типы данных. Отображение из типов данных C, таких как int и double для типов данных Fortran, несколько зависит от задействованных компиляторов. Не гарантируется, что все типы, предоставляемые одним компилятором, имеют аналогичные типы среди тех, которые известны другому компилятору.
  • определяемые пользователем. Без функций взаимодействия C трудно гарантировать, что макет пользовательских типов будет таким же, даже если вы можете правильно подобрать типы компонентов.
  • согласование аргументов. В дополнение к тому, что Fortran использует call-by-reference, Fortran 90 предоставляет режимы передачи массива, которые не сопоставляются ни с чем в C. Не все функции используют эти режимы для передачи массивов, но вы вряд ли сможете (они даже не поддерживаются функциями F03 C interop).
  • не следует смешивать внешние входы/выходы Fortran с внешним вводом/выводом C. Трудно получить право.
  • вам, вероятно, потребуется связать библиотеку времени исполнения Fortran. Его имя варьируется от компилятора к компилятору.

Это не исчерпывающий список, но он охватывает большинство распространенных проблем. Какие из них вам нужно решать, зависит от пакетов, которые вы пытаетесь подключить.

Ранее в F03 Interpop Fortran/C обычно предоставлялся по отдельности для каждого продукта по отдельности. Часто с одной стороны или с другой стороны был предоставлен набор специальных функций интерфейса или и то, и другое. Там по-прежнему существует такой код, и для вас это может быть хорошей стратегией. Кроме того, есть инструменты, которые пытаются помочь разобраться в беспорядке. У GNU Autotools есть определенная поддержка, например, охватывающая гораздо больше, чем просто инструментальная цепочка GNU. Кроме того, вам может потребоваться проверить некоторые объектные файлы, чтобы определить, как подойти к некоторым из этих проблем.

0

Поиск вызова fortran из c дал мне несколько ссылок на различные учебники и примеры.

Некоторые основные моменты:

Фортран звонки по ссылке, поэтому вы можете использовать указатели/адрес оператора.

Процедуры Fortran обычно экспортируются с помощью простого прошивки имен. Вы можете либо узнать, прочитав руководство, либо вы можете использовать nm fo, где fo - скомпилированный fortran файл.

Используя полученные имена подпрограмм, вам нужно создать файл заголовка C с объявлениями для подпрограмм, которые вы хотите вызвать.

При связывании вам нужно связать с библиотекой fortran, -l<name of fortran lib>.

  • 0
    Благодарю. Как насчет пользовательских типов данных? Должен ли я определить соответствующий тип данных C или я могу использовать определения Fortran?
  • 0
    Это не очень хороший ответ, в нем не упоминаются ныне стандартизированный (на Фортране) подход к взаимодействию в Си. Этот стандартизированный подход позволяет, помимо прочего, избегать манипулирования именами программистом вручную.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню