Fortran 调用C 函数

针对于Fortran中有些函数的自动向量化的流水不如C语言好,有些针对于整个Fortran语言的项目中的某个函数需要换成C语言,然后在Fortran中调用相应的C函数。

两种方法都是在Fortran module  文件中调用C函数,并且都要修改相应的Makefile文件,在其中加入相应的CFLAGS。

方法一:

1、直接在Fortran文件调用原Fortran函数之前中声明 external :: func_name_c,如果是讲某个函数中的某部分改成C语言操作,那么在哪个函数里面声明。

2、将调用所替换掉的Fortran操作的部分(或者某个Fortran函数)改成call func_name_c(之前是call func_name_fortran或者几行Fortran代码的计算操作)

3、在与原来的Fortran文件在同一目录文件下建立一个相应的c文件,其中具体声明和实现相应的C语言函数(func_name_c_),要特别注意,C语言文件中的文件要比Fortran中的call后边调用的函数名字多一个下划线“_”,而且C语言中声明实现的函数的参数都必须是指针。

例如:Fortran文件中是call func_add_c(a,b,c),

在对应的C语言文件中就是void  func_add_c_(int *a,int *b,int *c)   //函数名要相应的多一个下划线

 

方法二:

1、在module函数开始添加 USE ISO_C_BINDING

2、在Fortran中写一个interface:(格式如下)

interface 

    subroutine func_add( a,b,c) bind (C,name="func_add_c")

    use iso_c_binding

    implicit none

    integer(c_int),value :: b,c

    !real (c_double),value ::
    
    type(c_ptr),value :: a       !c 中的指针

    end  subroutine func_add
end interface

3、在调用C语言函数的地方call func_name_c(c_loc(a),b,c)。

对应需要传递指针的参数要加上c_loc(),其他的参数可以直接传递。

4、在与Fortran文件在同一目录文件夹下的C语言文件中声明实现相应的函数:

inline void func_add_c(int *a ,int b,int c)

这个对于编译器的需求以及Makefile中的具体相关操作,还需进一步学习,小白入门,个人笔记,还望多多指教!

你可能感兴趣的:(Fortran 调用C 函数)