【发布时间】:2018-05-28 20:57:07
【问题描述】:
我想从 C++ 文件中调用一个 Fortran 子例程,我不想对其进行重新编码,它采用假定形状的数组作为输入。但是,如果我将分配的 C++ 数组上的指针(以通过引用处理调用情况)传递给 Fortran 子例程,则应用程序会出现段错误。
C++-文件
#include <cstdlib>
extern "C" {
void __fma_MOD_printvector2(int**);
}
int main(int argc, char const *argv[])
{
int *vectorB = (int *)malloc(5*sizeof(vectorB));
for(int i = 0; i < 5; i++)
{
vectorB[i] = i+10;
}
__fma_MOD_printvector2(&vectorB);
return 0
}
Fortran 文件:
MODULE fma
IMPLICIT NONE
CONTAINS
SUBROUTINE printVector2(a)
INTEGER, DIMENSION(:), INTENT(IN) :: a
INTEGER :: i
DO i=1,size(a)
WRITE(*,*) a(i)
END DO
END SUBROUTINE printVector2
END MODULE fma
输出:
10
[1] 5080 segmentation fault (core dumped) ./main.x
有什么我错的地方吗?
【问题讨论】:
-
假定的形状数组不可互操作。正在寻找副本。
-
__fma_MOD_printvector2(&vectorB);-- 1) 您正在传递指针的地址。这是故意的吗? 2)DO i=1,size(a)-- FORTRAN 从哪里获得尺寸信息?即使在 C++ 中,您也无法从指针中获取大小信息。 -
@PaulMcKenzie Fortran 获取大小,因为数组不是指针。它都在副本的链接中。但是您对 C++ 大小的指针是正确的,只要将 Fortran 部分更改为可互操作的数组参数,它就应该是
int*。
标签: c++ segmentation-fault fortran