我必須用C++函數替換一些Fortran子程序。由於文獻很差,我遇到了像下面這樣的問題。如何使用std :: vector作爲參數從Fortran 77中調用C++函數?
我的代碼總是拋出一個錯誤:
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];
}
}
在C++中使用C樣式函數調用也更容易。我不認爲有一個可移植的與FORTRAN的'std :: vector'對象接口。 –
更一般地說,不能將C++對象傳遞給Fortran,無論它是哪個C++類。 'std :: vector'在這個意義上並不特殊。 –
Brick
你可以傳遞一個指向任何東西的指針,不管它是一個C++類還是不是。 –