Mixed Programming Fortran and C

你离开我真会死。 提交于 2020-01-14 02:53:08

问题


I am a Theoretical Physics research student, working in Cosmology. In course of my research I have use to rather huge library of Fortran codes and I used C for my programming needs.

I have been able to link the two programs in numerous test files and they work brilliantly. But for them I have been using the object files to link them all. But when I tried to run the real deal through C, include reference to the Fortran header files. They seem to integrate and call each other fine but the format of the Fortran header file is incomptible with the C compiler, so when it jumps to the header file it start throwing errors that it cannot understand the syntax.

For example, the Fortran header file defines double variables with real*8 so when C reads them it throws errors. The same happens with comments in the file as well.

So, I want to ask is there any way through which I can go about this problem? i.e. make the fortran format header file readible through C.

I looked over the internet and found confusing answers, and I do not know which one to follow. Any help in this matter will be appreciated :)


回答1:


Sorry but you are very confusing. What is a Fortran header file ? For instance, you cannot read a Fortran include file using a C compiler ! The two languages are too different. In addition a Fortran include file is almost never an header file comparable to the C's one.

I don't know the kind of compiler you are using. But if you have chosen a recent GCC version (Gnu Compiler Collection), then the Fortran compiler included inside is able to take into account the ISO_C_BINDING feature which makes easier the coupling Fortran-C.

Example :

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 header file named "my_sub.h" for instance :

void my_sub(int, double *);

C file

#include "my_sub.h"

int main(){
  double b;
  int a=3;
  my_sub(a,&b);
  ...
}



回答2:


Fortran usually passes its variables by reference (passes pointers). That means that you MUST give addresses in your calling C-program.

Function results, may be passed by value, for example, the following code calls a FORTRAN function called "gamma":

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

Make sure that the size of the variable in the calling program is identical to the size in the Fortran routine:

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

The Fortran function must be declared at the beginning of the C calling function:

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

Note we have to pass all variables to Fortran as pointers. Although the function name is not case sensitive in Fortran, it gains an underscore in the C declaration and when it is called:

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

The Fortran function receives the variables as follows:

SUBROUTINE READ(small,medium,large)

  INTEGER       small
  REAL          medium
  DOUBLE        large

The precise size of these variables depends on your system's architecture (32 bit verses 64 bit), so you need to confirm the correspondence between ints, floats and doubles in C and Fortran on your system.



来源:https://stackoverflow.com/questions/7743801/mixed-programming-fortran-and-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!