用变长数组参数在Fortran中调用C函数
我试图将一个一维数组从Fortran传递到C,并通过一个例程将一个输出数组返回到Fortran。该功能简单,便于演示。它接收2个可变长度数组,其中一个为空,并将第二个值存储在空数组的相应位置。源代码如下所示 活页夹f90 我在函数中包含了一个用变长数组参数在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确实很重要
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