我在一个文件中混合使用C-string和fortran-string有一个问题。
假设我正在使用固定长度为9的名称字符串,我将长度定义为宏
#define NAME_LEN 9
在.c文件中。
现有fortran函数,我们将它命名为fortran_function(char* name)
现在我必须在c函数中调用这个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个字符的以null结尾的字符串传递给c_function,所有声明都是正确的。是吗?
还应该把任何其他问题放在这里吗?任何潜在的错误?
答案 0 :(得分:2)
如果我没记错的话,还有一个问题。 Fortran不使用以null结尾的字符串;相反,它用0x20(空格)填充缓冲区的右端。因此,如果您有权访问Fortran源代码,我会修改函数签名,以将传入的字符串的长度作为参数。否则,您可能会崩溃代码的Fortran端。
答案 1 :(得分:2)
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期望的终止空字符等。
答案 2 :(得分:1)
这些电话没有区别。 c编译器将它们全部视为char *。在c中使用它之前,您必须确保将null终止。如果你只是在fortran一侧使用字符串并且c函数只是坚持它,那么你不需要做任何事情。