我想调用一个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文件:
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
我错的任何想法?
答案 0 :(得分:1)
从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