簡體   English   中英

將C字符串和fortran字符串混合在一個文件中

[英]Mix C-string and fortran-string in one file

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

假設我正在使用固定長度9的名稱字符串,我定義了一個長度宏,例如

#define NAME_LEN 9

在.c文件中。

有一個現有的fortran函數,我們將其命名為fortran_function(char* name)

現在我必須在ac函數中調用此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,所有聲明都是正確的。 那正確嗎?

還有其他需要關注的地方嗎? 有潛在的錯誤嗎?

如果我沒記錯的話,這里還有另外一個陷阱。 Fortran不使用以null終止的字符串; 而是使用0x20(空格)填充緩沖區的右端。 因此,如果您可以訪問Fortran源,則可以修改函數簽名,以傳入字符串的長度作為參數。 否則,您可能會使代碼的Fortran崩潰。

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

另一個改進是在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期望的終止空字符,等等。

這些電話沒有區別。 c編譯器會將它們全部視為char *。 您只需要確保在將其用於c之前將其終止為null。 如果您僅在fortran端使用字符串,而c函數僅保留了該字符串,則您無需執行任何操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM