我有以下名为的 Fortran 子例程show_value
调用一个名为的 C 函数show_value
:
INTERFACE
SUBROUTINE show_value(variable) BIND(C, name = "show_value")
USE, INTRINSIC :: iso_c_binding
TYPE(*) :: variable
END SUBROUTINE
END INTERFACE
C 函数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)
C 函数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