【问题标题】:Pass allocated C++ array to Fortran subroutine [duplicate]将分配的 C++ 数组传递给 Fortran 子例程 [重复]
【发布时间】: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(&amp;vectorB); -- 1) 您正在传递指针的地址。这是故意的吗? 2) DO i=1,size(a) -- FORTRAN 从哪里获得尺寸信息?即使在 C++ 中,您也无法从指针中获取大小信息。
  • @PaulMcKenzie Fortran 获取大小,因为数组不是指针。它都在副本的链接中。但是您对 C++ 大小的指针是正确的,只要将 Fortran 部分更改为可互操作的数组参数,它就应该是 int*

标签: c++ segmentation-fault fortran


【解决方案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

【讨论】:

  • 你是如何回答一个封闭的问题的?
  • 顺便说一句,我问过这个问题,因为它很有趣(不是针对你)meta.stackoverflow.com/questions/368733/… 但请尽量不要回答重复的问题,我们通常会关闭它们。这就是我搜索副本的原因,尽管答案很明显,我可以立即回答。
  • 这个问题本身就作为meta.stackoverflow.com/questions/252711/…的副本关闭了:)
  • 是的,这就是系统让它完成它的原因,您的浏览器不知道关闭。你也很新,所以很难知道哪些问题已经回答,哪些问题还没有回答,不要太担心。我在打开我正在寻找重复的问题后立即写了一条评论,但如果你看不到标志,它可能与评论相同。
  • 鉴于 ISO/IEC TS 29113:2012 已经发布了一段时间,而 Fortran 2018 也不远了,第一段有点误导。
猜你喜欢
  • 2023-03-14
  • 2012-10-15
  • 2013-11-01
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多