用变长数组参数在Fortran中调用C函数

用变长数组参数在Fortran中调用C函数,c,fortran,fortran-iso-c-binding,C,Fortran,Fortran Iso C Binding,我试图将一个一维数组从Fortran传递到C,并通过一个例程将一个输出数组返回到Fortran。该功能简单,便于演示。它接收2个可变长度数组,其中一个为空,并将第二个值存储在空数组的相应位置。源代码如下所示 活页夹f90 我在函数中包含了一个printf,只是为了验证 职能c 如果您将值属性添加到接口块中的假人t和p,会怎么样?如果您使用iso_c_绑定,请不要使用kind=8,这真的很难看。如果您必须使用这种丑陋且不可移植的方式,请注意101325.0和0.1是单精度数字。使用0.1确实很重要

我试图将一个一维数组从Fortran传递到C,并通过一个例程将一个输出数组返回到Fortran。该功能简单,便于演示。它接收2个可变长度数组,其中一个为空,并将第二个值存储在空数组的相应位置。源代码如下所示

活页夹f90

我在函数中包含了一个
printf
,只是为了验证

职能c


如果您将
属性添加到接口块中的假人
t
p
,会怎么样?如果您使用iso_c_绑定,请不要使用
kind=8
,这真的很难看。如果您必须使用这种丑陋且不可移植的方式,请注意
101325.0
0.1
是单精度数字。使用
0.1
确实很重要。即使使用不同名称的标准数据类型,例如real64和c_double,也不能保证编译器能够正确识别相同或不同的类型。我建议尝试@francescalus方法,因为默认情况下Fortran通过引用传递参数。此外,由于您有数组,并且在C中它们被表示为指针,因此您需要将
C_ptr
类型的变量传递给可以使用
C_loc
获得的函数。添加value属性解决了这个问题。没有要求使用@Chaosit提到的c_ptr。我还根据@Vladimir F的评论,将精度更新为使用
c_double
,并使用
.d
定义了浮点数。
module binder
  use iso_c_binding
  implicit none

  interface
    subroutine eval_jacob(t,p,y,jac) bind(c)
      use iso_c_binding
      real(c_double) :: t
      real(c_double) :: p
      real(c_double) :: y(*)
      real(c_double), intent(out) :: jac(*)
      end subroutine eval_jacob
  end interface

end module
#include <stdio.h>
void eval_jacob(double t,double p,double* y,double* jac) {
  jac[1] = y[1];
  printf("%f",jac[1]);

  return;
}
program test_f
  use binder
  use iso_c_binding
  implicit none

  real(c_double) :: t = 0.d0
  real(c_double) :: p = 101325.d0
  integer, parameter :: NN = 11

  real(c_double) :: y(NN)
  real(c_double) :: jac(NN)

  integer :: i


  do i = 1,NN
    y(i) = 1.0d-1
  end do

  call eval_jacob(t,p,y,jac)
  write(*,*), jac(2)

end program