Смешанное программирование на Фортране и С
Я студент-теоретик физики, работаю в области космологии. В ходе моего исследования я использовал довольно большую библиотеку кодов Фортрана, и я использовал C для своих нужд программирования.
Мне удалось связать две программы в многочисленных тестовых файлах, и они прекрасно работают. Но для них я использовал объектные файлы, чтобы связать их всех. Но когда я попытался запустить реальную сделку через C, включил ссылку на заголовочные файлы Fortran. Кажется, что они прекрасно интегрируются и вызывают друг друга, но формат файла заголовка Fortran несовместим с компилятором C, поэтому, когда он переходит к файлу заголовка, он начинает выдавать ошибки, которые не могут понять синтаксис.
Например, заголовочный файл Fortran определяет двойные переменные с вещественными *8, поэтому, когда C читает их, он выдает ошибки. То же самое происходит и с комментариями в файле.
Итак, я хочу спросить, есть ли способ решить эту проблему? т.е. сделать заголовочный файл формата фортрана читаемым через C.
Я посмотрел в Интернете и нашел запутанные ответы, и я не знаю, какой следовать. Любая помощь в этом вопросе будет оценена:)
2 ответа
Извините, но вы очень запутаны. Что такое заголовочный файл Fortran? Например, вы не можете прочитать включаемый файл 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);
...
}
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-битные стихи), поэтому вам необходимо подтвердить соответствие между типами int, float и double в C и Fortran в вашей системе.