我有如下Fortran子程序,名为
这会调用C函数
根据Fortran文档,如果想要启用子例程
在进行了这些更改后,执行以下Fortran代码:
show_value
,该子程序调用了名为show_value
的C函数:INTERFACE
SUBROUTINE show_value(variable) BIND(C, name = "show_value")
USE, INTRINSIC :: iso_c_binding
TYPE(*) :: variable
END SUBROUTINE
END INTERFACE
函数show_value
的作用:
void show_value(const void *variable)
{
printf("%d\n", *(int *) variable);
}
当向Fortran子程序传递标量时,它的工作效果很好。例如:
INTEGER :: x
x = 12
call show_value(x)
这会调用C函数
show_value
并打印12
,这是正确的。根据Fortran文档,如果想要启用子例程
show_value
接收数组(任意维度)而不仅仅是标量,则应将TYPE(*) :: variable
更改为TYPE(*), DIMENSION(..) :: variable
。在进行了这些更改后,执行以下Fortran代码:
INTEGER, DIMENSION(3) :: y
y(1) = 15
y(2) = 17
y(3) = 19
call show_value(y)
show_value
函数不再打印正确的信息(即打印随机数)。此外,我发现C函数接收到的地址比原始地址(在Fortran中)低528。为了确认这一点:
void show_value(const void *variable)
{
printf("%d\n", *(int *) (variable + 528));
}
这段代码输出 15
(正确的数字)。你有什么想法吗?
环境:Ubuntu 14.04 64 位,gfortran 4.9。