2010-11-15 51 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