从 C 调用 FORTRAN 子程序

标签 c fortran fortran-iso-c-binding

我正在尝试从 C 调用 FORTRAN 函数

我的问题是:

  1. 如果 fortRoutine 是我的 fortran 子例程的名称,那么我从 C 调用它 作为 fortRoutine_。如果 fortRoutine 只包含一个字符数组参数,那么我可以这样传递吗:

    fortRoutine_("I am in fortran");
    
  2. 在调用 FORTRAN 子程序时,什么时候应该使用值传递,什么时候应该使用引用传递?

因为我是 C 的新手,所以我对此一无所知。如果可能,请同时推荐一些好的教程链接。

最佳答案

现在执行此操作的方法是在 Fortran 端使用 Fortran ISO C 绑定(bind)。这是 Fortran 2003 语言标准的一部分,可用于许多编译器;它不是特定于 gcc 的。它已在本网站的许多答案中进行了描述。作为语言标准的一部分,它独立于编译器和平台。而且您不需要了解编译器的内部传递约定。 ISO C 绑定(bind)在 Fortran 子例程或函数的声明中使用时,会导致 Fortran 编译器使用 C 调用约定,以便可以直接从 C 调用该过程。您不需要添加隐藏参数或名称 mangle Fortran 子例程名称,即没有下划线。链接器使用的名称来自“绑定(bind)”选项。

字符串是一个难题,因为从技术上讲,在 C 中它们是字符数组,您必须在 Fortran 中匹配它。您还必须处理字符串的不同定义:C 以 null 结尾,Fortran 固定长度并用空格填充。该示例显示了这是如何工作的。数字更容易。数组的唯一问题是 C 是行优先的,而 Fortran 是列优先的,因此多维数组是转置的。

int main ( void ) {

   char test [10] = "abcd";

   myfortsub (test);

   return 0;

}

subroutine myfortsub ( input_string ) bind ( C, name="myfortsub" )

   use iso_c_binding, only: C_CHAR, c_null_char
   implicit none

   character (kind=c_char, len=1), dimension (10), intent (in) :: input_string
   character (len=10) :: regular_string
   integer :: i

   regular_string = " "
   loop_string: do i=1, 10
      if ( input_string (i) == c_null_char ) then
         exit loop_string
      else
         regular_string (i:i) = input_string (i)
      end if
   end do loop_string

   write (*, *) ">", trim (regular_string), "<", len_trim (regular_string)

   return

end subroutine myfortsub

您将 C 语言编译为目标文件并使用 gfortran 编译 fortran 语言并将两者链接起来:

gcc-mp-4.6   \
         -c  \
         test_fortsub.c

gfortran-mp-4.6   \
     test_fortsub.o  \
     myfortsub.f90  \
     -o test_fortsub.exe

输出是:

 >abcd<           4

关于从 C 调用 FORTRAN 子程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8207997/

相关文章:

c - STM32VLDiscovery定时器中断HardFault c

c - linux 如何处理 jiffies 中的溢出?

c - Lapack 在 C 中设置内部 FORTRAN 参数

fortran - 如何将 NULL 字符连接到 Fortran 中的字符数组以调用 c 函数?

linux - 套接字编程 gfortran

c - 为什么 "mov %%rsp, %%rbp"导致段错误?

python - 如何将 typedef 变量的指针实现到 SWIG 中?参数 2 类型为 'BYTE const *' 错误

python - f2py 在 Fortran 中的 Python 回调函数中使用数组

function - Fortran 函数返回未分配的数组会导致段错误

c - 将 Fortran 数组传递给 C