2010-11-15 69 views
1

我有一個問題,在一個文件中混合C字符串和fortran字符串。在一個文件中混合C字符串和fortran字符串

認爲我與名字符串與固定長度的9打,我在一個.c文件定義的長度宏象

#define NAME_LEN 9 

有一個現有的FORTRAN功能,讓我們將其命名爲fortran_function(char* name)

現在我已經打電話給在交流功能這個FORTRAN功能,讓我們的名字

c_function(char name[]) { 

    fortran_function(name) 

} 

現在的問題是,我應該如何聲明c_function簽名?

c_function(char name[]) 
c_function(char name[NAME_LEN +1]) 

c_function(char name[NAME_LEN]) 

在什麼情況下,我應該用9名的長度或10?

我的理解是,只要你傳遞了一個以空字符結尾的9個字符的字符串給c_function,所有的聲明都是正確的。是對的嗎?

任何其他問題應該放在這裏?任何潛在的錯誤?

+1

爲了得到你應該張貼實際的Fortran程序接口,並提供一些完整的答案指示作爲對的Fortran程序如何使用該參數。如果Fortran代碼沒有使用MSB指C互操作性功能,那麼答案也可能編譯器特有的。 – IanH 2014-01-30 03:17:30

回答

1

如果我沒有記錯的話,還有一個疑難問題。 Fortran不使用以空字符結尾的字符串;相反,它用0x20(空格)填充緩衝區的右端。因此,如果您有權訪問Fortran源代碼,我將修改函數簽名以將傳入的字符串的長度作爲參數。否則,您可能會崩潰代碼的Fortran一側。

1

這些調用沒有任何區別。 C編譯器會將它們全部視爲char *。你只需要確保你null在它在c中使用之前終止它。如果你只使用fortran方面的字符串,而c函數只是堅持它,那麼你不需要做任何事情。

+0

拾音是正確的位置,但是,戴維下面說,你應該讓Fortran代碼知道是怎麼回事跟蹤長度。 – JimR 2010-11-16 04:29:05

1

Dave是正確的,標準的Fortran字符串概念是固定長度的,在右側填充空格。 (Fortran現在也具有可變長度的字符串,但這些並不常見,並且與C互操作會非常棘手)。如果要固定長度,則在Fortran代碼中使用相同的參數NAME_LEN,並使用相同的值。戴夫建議增加一個長度參數可能會更好。

另外一個改進是使用上的Fortran側ISO C綁定工具(每個註釋糾正!)

subroutine Fort_String_code (my_string), bind (C, name="Fort_String_code") 
use iso_c_binding 
integer, parameter :: NAME_LEN = 9 
character (kind=c_char, len=1), dimension (NAME_LEN), intent (inout) :: my_string 

等。「綁定」的名字是由C可調用的Fortran名稱例程 - 它可能與Fortran名稱不同。還提供了作爲ISO_C_BINDING的部分是符號C_NULL_CHAR,你可以在Fortran代碼中使用,以提供終止空字符C期望等

+0

當然,+ 1.0D6等等,但是「如果類型是字符,那麼當且僅當它的值爲1時,長度類型參數纔可以互操作。」 – IanH 2014-01-30 03:12:49