我必须用 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<>
,但这样的东西不是标准库的一部分。请注意,许多标准库例程采用 begin 和 end 参数,这些参数适用于 C 样式代码。
关于c++ - 如何使用 std::vector 作为参数从 Fortran 77 调用 C++ 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44400471/