0

我有* .H,定義一個結構。像這樣:如何使用Fortran的c頭文件中定義的結構?

#define nfloats 9999 
#define nword 655 

typedef struct { 

int a 
short b 
unsigned short d 
float e 
char t[nword] 
short un[14] 
float dat[nfloats]; 

} datafile 

在一個void c中爲數據文件的所有參數分配一個值。我想將分配的值傳遞給main fortran程序,而不必使用TYPE重新定義。只需調用* .H和iso_c_binding即可。換句話說,我希望在*中定義的Fortran主程序中使用「datafile」。 H.有人建議了一些事情?

非常感謝!

+0

那麼,你可以做到這一點,但它需要將c類型轉換爲fortran,所以你需要一個翻譯或解釋器。 – 2013-04-10 23:12:24

+2

Fortran ISO C綁定不瞭解Fortran源代碼中的C語言。它爲您提供了在Fortran中指定使用與C兼容的變量,調用等的方法。您必須編寫Fortran代碼;它不是自動的。 – 2013-04-10 23:32:34

回答

0

最簡單的方法是用您喜歡的語言編寫腳本,該腳本讀取C定義並將其轉換爲Fortran。如果你修復你的語法,那麼這很容易。

1)的#define XXX YYY變爲整數,參數:: XXX YYY =

2)是用Fortran無無符號無符號所以短褲和短褲均爲整數(種類= 1)。

3)這取決於你如何使用字符數組。如果他們返回單個字符,而不是分配給en塊,則它們可以被聲明爲字符t(nword)。如果他們被期望持有字符串,那麼他們應該被聲明爲字符(len = nword)t。

4)typedef結構{ ... }數據文件

成爲

類型的數據文件 序列 ... 端型

5)做到了這一切,你需要確保C和Fortran代碼具有相同的字節對齊方式。您的字符數組655不在字節邊界上,因此您可能會遇到對齊問題。

第二種方法是玩宏並獲取宏來爲你做代。您需要爲C定義一組宏,爲Fortran定義另一組宏。所以,你會得到類似

STRUCT_BEG(datafile) 
    INTEGER(a) 
    SHORT(b) 
    ... 
    CHARA(t,nword) 
    FLOATA(dat,nfloats) 
STRUCTEND(datafile) 

的C定義是

#define STRUCT_BEG(ignore) typedef struct { 
#define STRUCT_END(name) } name; 
#define INTEGER(a) int a; 
#define CHARA(a,length) char a[length]; 

的Fortran的定義會是這樣的

#define STRUCT_BEG(name) \ 
    type name \ 
     sequence 
#define STRUCT_END(ignore) end type 
#define INTEGER(a) integer::a 
#define CHARA(a,length) character(len=length):: a 

如果用-e編譯,C編譯器可以用來生成兩個頭文件。