[英]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.