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

时间:2017-06-06 22:03:42

标签: c++ vector fortran subroutine

我必须用C ++函数替换一些Fortran子例程。由于文献很差,我遇到了类似下面的问题。

我的代码总是会抛出错误:

  

程序接收信号SIGSEGV:分段故障 - 内存参考无效。

这是我的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];
    }
}

2 个答案:

答案 0 :(得分:2)

这是您可以从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兼容性问题。)

对于vector<>,您可能会喜欢类似于C ++ 17 here的内容,但这样的事情并不是标准库的一部分。请注意,许多标准库例程都采用 begin end 参数,这些参数适用于C风格的代码。

答案 1 :(得分:-2)

您正在混合fortran C vector的术语,它指的是int在连续内存位置的集合,即array { {1}} C++std::vector是一个单独的容器类,需要构造 - 请参考documentation