2017-06-06 64 views
1

我必須用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]; 
    } 
} 
+3

在C++中使用C樣式函數調用也更容易。我不認爲有一個可移植的與FORTRAN的'std :: vector'對象接口。 –

+0

更一般地說,不能將C++對象傳遞給Fortran,無論它是哪個C++類。 'std :: vector '在這個意義上並不特殊。 – Brick

+0

你可以傳遞一個指向任何東西的指針,不管它是一個C++類還是不是。 –

回答

-2

你混合你fortranC行話vector其中提到int S IN連續的內存位置的集合即一個arrayC++std::vectorstd::vector是一個獨立的容器類,需要構建 - 參考documentation

2

這裏是C++代碼,你可以從FORTRAN

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的string_view什麼,但這樣的事情不是標準庫的一部分。請注意,許多標準庫例程取開始結束參數與C風格的代碼很好地工作。

相關問題