Смешанное программирование Fortran и C

Я студент-исследователь теоретической физики, работаю в области космологии. В ходе моего исследования я использовал довольно большую библиотеку кодов Fortran, и я использовал C для своих нужд программирования.

Мне удалось связать две программы в многочисленных тестовых файлах, и они работают блестяще. Но для них я использовал объектные файлы, чтобы связать их все. Но когда я попытался запустить реальную сделку через C, включите ссылку на файлы заголовков Fortran. Кажется, что они прекрасно интегрируются и вызывают друг друга, но формат заголовочного файла Fortran несовместим с компилятором C, поэтому, когда он переходит к заголовочному файлу, он начинает выдавать ошибки, которые не могут понять синтаксис.

Например, заголовочный файл Fortran определяет двойные переменные с вещественными * 8, поэтому, когда C их читает, он выдает ошибки. То же самое происходит и с комментариями в файле.

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

Я просмотрел Интернет и нашел запутанные ответы, и я не знаю, какой из них следовать. Любая помощь в этом вопросе будет оценена :)


person Shaz    schedule 12.10.2011    source источник
comment
Какая версия Фортрана? Если это Fortran 77, вы можете использовать f2c.   -  person David Thornley    schedule 12.10.2011
comment
Я действительно смущен тем, что не работает для вас. Связывание объектных файлов после отдельной компиляции c и fortran является способом объединить c и fortran в одном проекте. Вы ищете автоматический переводчик заголовков?   -  person dmckee --- ex-moderator kitten    schedule 12.10.2011


Ответы (2)


Извините, но вы очень путаете. Что такое заголовочный файл Fortran? Например, вы не можете прочитать включаемый файл Fortran с помощью компилятора C! Два языка слишком разные. Кроме того, включаемый файл Fortran почти никогда не является заголовочным файлом, сравнимым с файлом C.

Я не знаю, какой компилятор вы используете. Но если вы выбрали последнюю версию GCC (Gnu Compiler Collection), то включенный в нее компилятор Fortran может учитывать функцию ISO_C_BINDING, которая упрощает соединение Fortran-C.

Пример :

MODULE my_fortran
  USE iso_c_binding
  IMPLICIT NONE
  CONTAINS
  SUBROUTINE my_subroutine(a,b) BIND(C,name="my_sub")
    INTEGER(c_int),INTENT(in),VALUE :: a
    REAL(C_DOUBLE),INTENT(out) :: b
    ...
  END SUBROUTINE
END MODULE

Заголовочный файл C с именем «my_sub.h», например:

void my_sub(int, double *);

C-файл

#include "my_sub.h"

int main(){
  double b;
  int a=3;
  my_sub(a,&b);
  ...
}
person Francois Jacq    schedule 12.10.2011
comment
Что такое заголовочный файл Fortran? В старые недобрые времена объявления блоков COMMON нередко помещались в отдельный файл (часто с окончанием .inc, которые затем становились INCLUDEd несколькими файлами. Вот что Я думаю, что когда кто-то говорит заголовок в контексте FORTRAN, я, конечно, не могу говорить за кого-то другого. - person dmckee --- ex-moderator kitten; 12.10.2011
comment
Под заголовочным файлом fortran я подразумеваю файл с расширением *.h, который содержит сегменты заголовочного файла. Например, ниже приведен код из заголовочного файла, написанный на фортране, *** c----------------------------- ------------------------------------------копия получена из dssusy.h 2008- 01-22, paolo gondolo * полезные глобальные переменные real*8 pi real*8 gev2cm3s ! добавлено /tb common /ruseful/ pi, gev2cm3s c save общие блоки save /ruseful/ - person Shaz; 13.10.2011
comment
И да, я использую компилятор GNU C и Gfortran. - person Shaz; 13.10.2011
comment
Еще раз, пожалуйста, не включайте включаемый файл Fortran в файл C! НИКОГДА ! Это не может работать. Включаемые файлы Fortran должны быть включены только в исходные файлы Fortran. - person Francois Jacq; 13.10.2011
comment
Я понимаю это, но в библиотеке есть определенные файлы с расширением .h, и они часто вызываются в библиотеке и с использованием Fortran. - person Shaz; 13.10.2011
comment
Итак, ваша проблема в том, что ваш компилятор c не обрабатывает фортран, верно? Ну, да. Компилятор c и компилятор fortran — разные вещи, потому что они поддерживают разные языки. (Обратите внимание, что окончание .h заголовков c является чисто человеческим соглашением, о котором компилятор ничего не знает... предоставление файлу окончания .h не означает, что компилятор c волшебным образом сможет сделать из него орел или решку) Возможно, вы хотите этап предварительной обработки, который может подготовить заголовки c, описывающие интерфейс fortran. Это интересный запрос. Увы, я не знаю инструмента для этого. - person dmckee --- ex-moderator kitten; 13.10.2011
comment
но формат заголовочного файла Fortran несовместим с компилятором C, поэтому, когда он переходит к заголовочному файлу, он начинает выдавать ошибки, которые не могут понять синтаксис. Да, C и Fortran — разные языки, и вы не можете ожидать, что компилятор C поймет исходный код Fortran или наоборот. Если у вас есть какое-то объявление переменных на Фортране, а С должен понимать те же самые переменные, вам придется написать эквивалентное объявление на С. - person M. S. B.; 13.10.2011

Fortran обычно передает свои переменные по ссылке (передает указатели). Это означает, что вы ДОЛЖНЫ указывать адреса в вызывающей программе на языке C.

Результаты функции могут быть переданы по значению, например, следующий код вызывает функцию FORTRAN с именем «gamma»:

double   x, y;
   ..................
   x = 2.0; 
   y = gamma_(&x) 

Убедитесь, что размер переменной в вызывающей программе идентичен размеру в подпрограмме Fortran:

float  --- REAL     (this is typical, but not always the case)
double --- REAL*8

Функция Fortran должна быть объявлена ​​в начале функции вызова C:

extern void read_(int *small, float *medium, double *large);

Обратите внимание, мы должны передавать все переменные в Фортран как указатели. Хотя имя функции не чувствительно к регистру в Fortran, оно получает символ подчеркивания в объявлении C и при вызове:

 read_(&small, &medium, &large);

Функция Fortran получает переменные следующим образом:

SUBROUTINE READ(small,medium,large)

  INTEGER       small
  REAL          medium
  DOUBLE        large

Точный размер этих переменных зависит от архитектуры вашей системы (32-разрядные и 64-разрядные), поэтому вам необходимо подтвердить соответствие между целыми числами, числами с плавающей запятой и двойными числами в C и Fortran в вашей системе.

person Pyadav    schedule 12.10.2011
comment
1) Код, который я пытаюсь вызвать, - это не функция, а рутина. 2) Ошибки возникают, когда он анализирует команду include и пытается скомпилировать заголовочные файлы. - person Shaz; 12.10.2011
comment
Привет, я тоже это понимаю. Но проблема возникает, когда компилятор переходит к заголовочному файлу, который написан на Fortran, но я компилирую с помощью GCC C. Я мог бы попытаться преобразовать файл .h в объект, но таких файлов со сложными зависимостями много. Я не думаю, что это очень хорошая идея. Поэтому и ищу альтернативы. - person Shaz; 12.10.2011
comment
Скомпилируйте свой код C с помощью gcc и скомпилируйте свой код Fortran с помощью gfortran. Связывание с gfortran, по-видимому, решает любые проблемы с библиотекой времени выполнения. - person Pyadav; 12.10.2011
comment
gfortran -o myprog myprog.o read.o, gcc -c myprog.c, gfortran -c read.f - person Pyadav; 12.10.2011
comment
здесь множество таких файлов со сложными зависимостями. Я не думаю, что это очень хорошая идея. Поэтому и ищу альтернативы. – - person Shaz; 12.10.2011
comment
используйте компилятор gcc и gfortan для разных языковых файлов c и Fortune - person Pyadav; 12.10.2011