我必须用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];
}
}
答案 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