1

我正在尝试将 FORTRAN 程序中的一维数组传递给 C。

C 函数被调用,但它保存的值是垃圾。但是,如果我尝试使用整数变量调用相同的函数,我可以传递所需的值。谁能帮我解决这个问题?

我使用的代码与此类似

文件:fortran_prog.f

program test
    real*4 :: a(4)
    data a / 1,2,3,4 /
    call test_func(a)
end program test

文件:c_prog.c

int test_func(double a[]) {
    int i;

    for(i=0;i<4;i++) {
        printf("%f\n",a[i]);
    }

    return 0;
}
4

2 回答 2

3
program test_Cfunc

   use iso_c_binding
   implicit none

   interface
      function test_func (a) bind (C, name="test_func")
         import
         integer (c_int) :: test_func
         real (c_double), dimension (1:4), intent (in) :: a
      end function test_func
   end interface

   real (c_double), dimension (1:4) :: a = [ 2.3, 3.4, 4.5, 5.6 ]
   integer (c_int) :: result

   result = test_func (a)
   write (*, *) result

end program test_Cfunc

使用 Fortran 的 ISO C 绑定,该解决方案可移植到来自同一供应商的成对编译器,或 Fortran 编译器供应商支持的组合。您不必了解特定编译器的传递约定,也不必处理 Fortran 编译器的名称修改(由 的name子句覆盖bind)。您使用一个块向 Fortran 描述 C 例程,使用interfaceISO C 绑定中提供的 Fortran 种类值指定 C 类型。gfortran 手册的“内在模块”一章中有一个种类类型的列表。另请参阅“混合语言编程”一章。由于 ISO C 绑定是语言标准的一部分,因此该文档比 gfortran 更通用。

于 2013-12-18T09:13:47.347 回答
1

在 Fortran 和 C 之间传递数组是一个非常重要的问题。特定的 C 和 Fortran 编译器很重要。

我看到的第一个问题是您指定double匹配real*4。这在几乎所有平台上肯定是无效的。将 C 函数声明为:

int test_func (float *a)

这可以在某些平台上工作,尽管许多 Fortran 编译器传递“数组描述符”的地址而不是数组本身。检查 Fortran 编译器的文档。

于 2013-12-18T05:25:52.463 回答