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

3
我需要用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];
    }
}

4
在C++中,使用C风格的函数调用会更容易。我认为没有一种可移植的方法能够从FORTRAN与std::vector对象进行接口交互。 - R Sahu
更普遍地说,无论是哪个C++类,您都不能将C++对象传递给Fortran。在这个意义上,std::vector<int>并不特殊。 - Brick
1
你可以传递任何指针,无论是C++类还是其他类型的指针。 - Vladimir F Героям слава
Fortran中的ISO_C_BINDING意味着更容易编写混合语言代码。如果Fortran版本可行,则重写为C似乎不是最优方法。 - Holmz
2个回答

3

以下是你可以从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的东西来处理vector<>,但这种东西并不是标准库的一部分。请注意,许多标准库例程采用与C样式代码配合良好的beginend参数。


-3

你混淆了你的fortranC术语中的vector,它指的是一个在连续内存位置中包含int的集合,即一个array,和C++std::vectorstd::vector是一个独立的容器类,需要构造 - 参考文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接