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

时间:2018-05-28 20:57:07

标签: c++ segmentation-fault 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文件:

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

我错的任何想法?

1 个答案:

答案 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