无法将数组从FORTRAN传递到C

无法将数组从FORTRAN传递到C,c,arrays,fortran,pass-by-reference,fortran-iso-c-binding,C,Arrays,Fortran,Pass By Reference,Fortran Iso C Binding,我试图将一个一维数组从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[])

我试图将一个一维数组从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;
}
int测试函数(双a[]{
int i;

对于(i=0;i,在Fortran和C之间传递数组是一个非常重要的问题。特定的C和Fortran编译器很重要

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

int test_func (float *a)

虽然许多Fortran编译器传递的是“数组描述符”的地址,而不是数组本身,但这可能在某些平台上工作。请查看Fortran编译器的文档。

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

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
我看到的第一个问题是指定
double
来匹配
real*4
。这在几乎所有平台上都是无效的。将C函数声明为:

int test_func (float *a)
虽然许多Fortran编译器传递的是“数组描述符”的地址,而不是数组本身,但这在某些平台上可以工作。请查看Fortran编译器的文档

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编译器的名称损坏(这被
绑定
名称
子句覆盖)。您使用
接口
块向Fortran描述C例程,用ISO C绑定中提供的Fortran类值指定C类型。gfortran手册中的“内部模块”一章中有一个类类型列表。另请参阅本章“混合语言编程”。由于ISO C绑定是语言标准的一部分,因此本文档比gfortran更通用


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

这是什么平台和特定的编译器?我在Linux上运行它们。对于C程序,我使用gcc,对于FORTRAN,我使用IFORT。现代实现这一点的方法是使用FORTRAN ISO C绑定。这是一部分Fortran语言标准的一部分,并使语言之间的连接可移植。检查标记中的许多示例。此问题与stackoverflow.com/questions/20171187/…不同,尽管标题类似。此问题是关于在Fortran调用C时传递数组。此问题是关于在C调用Fortran时传递数组.后一个问题是这个问题的重复。这是什么平台和特定的编译器?我在Linux上运行它们。对于C程序,我使用gcc,对于FORTRAN,我使用IFORT。在现代,实现这一点的方法是使用FORTRAN ISO C绑定。这是FORTRAN语言标准的一部分,使语言是可移植的。请检查标记中的许多示例。尽管标题类似,但此问题与stackoverflow.com/questions/20171187/…不同。此问题是关于在Fortran调用C时传递数组。此问题是关于在C调用Fortran时传递数组。后一个问题是此问题的副本。您是ca吗调用将int作为子例程返回的函数。将C函数声明为返回void。调用将int作为子例程返回的函数。将C函数声明为返回void。