将分配给C++数组传递给 Fortran 子例程



我想调用一个Fortran子例程,我不想重新编码它,它从一个C++文件中接受一个假定形状的数组作为输入。但是,如果我将分配给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-file:

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

有什么想法我错了吗?

从 c 到 Fortran 过程没有可互操作的接口,其参数是假定的形状数组,就像您的情况一样。

(实际上,正如@IanH所说,有。检查您的编译器是否实现了 ISO/IEC TS 29113:2012(

我建议您通过另一个参数将有关数组形状的信息传递给过程,并在例程中使用自动数组。

SUBROUTINE printVector2(n, a) BIND(C)
USE :: ISO_C_BINDING
INTEGER(c_int), INTENT(IN) :: n
INTEGER(c_int), DIMENSION(n), INTENT(IN) :: a
INTEGER :: i
DO i=1,n
WRITE(*,*) a(i)
END DO
END SUBROUTINE printVector2

最新更新