【发布时间】:2013-07-16 06:07:08
【问题描述】:
我正在从 FORTRAN 90 代码中调用 C 例程。一切正常,但我想知道为什么以及如何使用更少的参数调用 C 例程,我应该编译器不会抱怨。编译器在这里做什么?我正在使用 Cray 编译器。
test.c
extern "C" void test_(double* x, double* y, double* z){
// do some work
}
driver.F90
MODULE DRIVER
! declare arrays
DOUBLE PRECISION, DIMENSION(dim, dim), INTENT(IN) :: x
DOUBLE PRECISION, DIMENSION(dim, dim), INTENT(IN) :: y
! call C subroutine
CALL test(x, y)
END MODULE DRIVER
【问题讨论】:
-
可能测试函数弹出一个未定义的值,您的 fortran 没有推送到堆栈(或推送可能为零的 null)。示例: push x,y,z pop z,y,x 但没有做最新的 push 所以是 push x,y pop z(it was y),y(it was x),undefined x(no push/null)
-
在你的 C 方法中打印 z 并找出答案。在调用外部方法时,您应该始终确保传入正确的数字参数,因为每个编译器都不同。它要么将 z 设置为默认值(零或空),要么会破坏堆栈,并且您将遇到一些内存问题,这些问题可能会进一步显示...
-
我不敢相信这被否决了。
-
编译器不会“抱怨”,因为 Fortran 编译器不知道您错误地调用了 C 例程。您很容易遇到运行时错误(崩溃)。如果您使用 Fortran ISO_C_Binding 并使用 Fortran 接口正确描述了 C 例程,Fortran 编译器将检测到不正确的调用并在编译时发出错误消息。