将C-string和fortran-string混合在一个文件中

时间:2010-11-15 23:37:06

标签: c++ string fortran

我在一个文件中混合使用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,所有声明都是正确的。是吗?

还应该把任何其他问题放在这里吗?任何潜在的错误?

3 个答案:

答案 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函数只是坚持它,那么你不需要做任何事情。