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

标签 c++ vector fortran subroutine

我必须用 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++ 代码调用它的可移植接口(interface);因为它是一个模板,这样做会很困难。 (事实上​​ ,不同版本的编译器或同一系统上的不同编译器之间甚至可能存在 std::vector 兼容性问题。)

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

关于c++ - 如何使用 std::vector 作为参数从 Fortran 77 调用 C++ 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44400471/

相关文章:

c++ - Windows C++ 单元测试 : testing dll-exported class

c++ - 从 std::vector c++ 调用 std::function 时崩溃

c++ - STL vector 保留

c - 将 C 结构翻译为 Fortran 等价物

fortran - Fortran 2003 中类型和类的区别

使用 visual studio 2008 构建 C++ 项目

c++ - C++ 中的编译时类型替换

c++ - 错误 C2084 'Function already has a body'

c++ - 为什么从 vector 打印图像像素值会返回无意义?

fortran - ifort 中的 "In call to DSYEV, an array temporary was created for argument"但相关维度仅为 1