Смешанное программирование на Фортране и С - PullRequest
1 голос
/ 12 октября 2011

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

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 12 октября 2011

Извините, но вы очень запутаны.Что такое заголовочный файл Fortran?Например, вы не можете прочитать включаемый файл Fortran, используя компилятор C!Два языка слишком разные.Кроме того, включаемый файл Фортрана почти никогда не является заголовочным файлом, сравнимым с файлом 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);
  ...
}
4 голосов
/ 12 октября 2011

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

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

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

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

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

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

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

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

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

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

SUBROUTINE READ(small,medium,large)

  INTEGER       small
  REAL          medium
  DOUBLE        large

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

...