如何使用 std::vector 作为参数从 Fortran 77 调用 C++ 函数?

How to call C++ funtion from Fortran 77 using std::vector as arguments?

我必须用 C++ 函数替换一些 Fortran 子例程。由于文献很少,我遇到了如下一个问题。

我的代码总是抛出错误:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

这是我的 Fortran 代码:

  PROGRAM vector_adder
  IMPLICIT NONE

  INTEGER,DIMENSION(3) :: a,b,c
  INTEGER :: i

  !C fill vectors with values
  DO i = 1,3
      a(i) = i
      b(i) = i
  END DO

  CALL ADD_VECTORS(a,b,c)

  WRITE(*,'(I5,I5,I5)') (c(i),i =1,3)

  STOP
  END PROGRAM

有效的 C 代码:

void add_vectors_(int (*a)[3], int (*b)[3], int (*c)[3])
{
    for(int i = 0; i<3 ; i++)
    {
        (*c)[i] =(*a)[i] + (*b)[i];
    }
}

我想要一个类似的 C++ 版本:

extern "C" void add_vectors_(std::vector<int> *a, std::vector<int> *b, std::vector<int> *c)
{
    for(int i = 0; i<a->size() ; i++)
    {
        (*c)[i] =(*a)[i] + (*b)[i];
    }
}

这是您可以从 FORTRAN 调用的 C++ 代码

extern "C" void add_vectors_(int(*a)[3], int(*b)[3], int(*c)[3])
{
    for (size_t i = 0; i<3; i++)
    {
        (*c)[i] = (*a)[i] + (*b)[i];
    }
}

std::vector<> 没有允许从其他非 C++ 代码调用它的可移植接口;因为它是一个模板,这样做会很困难。 (事实上​​ ,甚至可能存在 std::vector 不同版本的编译器之间或同一系统上的不同编译器之间的兼容性问题。)

您可能喜欢类似于 C++17 的 string_view for vector<> 的东西,但这样的东西不是标准库的一部分。请注意,许多标准库例程采用 beginend 参数,这些参数适用于 C 样式代码。

您正在混合 fortranCvector 行话,它指的是连续内存位置中 int 的集合,即 arrayC++std::vectorstd::vector 是一个单独的容器 class 一共需要构建 - 参考 documentation