2017-06-14 21 views
0

一個FORTRAN interface成C使用extern我應該如何導入?輸入接口模塊規程,從FORTRAN成C

假設我有以下FORTRAN模塊:

!swapper module 
module swapper 
    interface swap 
     module procedure swap_r, swap_i, swap_c 
    end interface 
contains 
    !subroutine implementations here: 
    !swap_r takes two double precision as argument 
    !swap_i takes two integers as argument 
    !swap_c takes two characters as argument 
end module swapper 

然後可我只是做在C,以下?

extern "C" void __swapper_MOD_swap(double*, double*) 
extern "C" void __swapper_MOD_swap(int*, int*) 
extern "C" void __swapper_MOD_swap(char*, char*) 

或者,如果我答應打電話swap只有雙精度數,我可以完全做到這一點?

extern "C" void __swapper_MOD_swap(double*, double*) 
+0

也許這可以幫助您,http://docs.cray.com/books/S-2179-52/html-S-2179-52/ppgzmrwh.html。 – Stargateur

+1

C中沒有泛型,但在C++中有泛型。 C中沒有'extern「C」''你實際使用C++嗎? –

+0

這裏有更多關於'INTERFACE'的信息:https://people.sc.fsu.edu/~jburkardt/f_src/f90_calls_c++/f90_calls_c++。html – QuantumDot

回答

1

它看起來像你實際上使用C++。但首先讓對C或C風格的C++答案:

不,你不能這樣做

extern "C" void __swapper_MOD_swap(double*, double*) 

你不能爲三種不同類型的參數做到這一點,你甚至不能對單個類型的參數做。

有其實並不應該是擺在首位的庫中的任何__swapper_MOD_swap

Fortran的功能是爲三個特定的子例程swap_r, swap_i, swap_c保留一個接口(它只是一個描述如何調用某些東西),並讓您按名稱swap調用它。

但有模塊中沒有實際的子程序swap Fortran只會讓你用不同的名稱來稱呼這三個細節,就這些。

沒有辦法如何調用這些函數由C像普通的。 C沒有這種類型的泛型!(它確實有一些功能可以使用void*在任何類型上運行)。


在C++中,你實際上可以使仿製藥而專門針對不同類型,你可以調用的Fortran程序作爲一種通用的,但你必須告訴C++的自己!您可以創建一個模板並手動專門化該模板以調用相應的extern "C"函數。

例如,參見我的標題https://github.com/LadaF/PoisFFT/blob/master/src/poisfft.h,其中我創建了一個C++類,它鏈接到一個extern "C" struct和一些extern "C"函數,但這些函數都在Fortran中實現。


最後,請勿使用__swapper_MOD_符號。創建一些Fortran語言使用bind(C,name="some_name")綁定和調用some_name通過extern "C",因爲不同的Fortran編譯器確實使用了不同的名字改編方案。

+0

感謝您的詳細回覆,包括有關最佳做法的提示! – QuantumDot