2010-03-25 69 views
2

基本上,这是我的问题。我从C++代码中调用别人的FORTRAN函数,这让我很头疼。部分代码:返回数组的FORTRAN函数导致段错误(从C++调用)

function c_error_message() 
character(len = 255) :: c_error_message 
errmsg(1:9) = 'ERROR MSG' 
return 
end 

这就是FORTRAN函数。我的第一个问题是:有没有什么会导致段错误?

如果不是,那么第二:这是什么回报?一个指针? 我想用下面的C语句来调用它:

char *e = c_error_message_(); 

这导致段错误。

c_error_message(); 

这也会导致段错误。

我宣布c_error_message_()早前与下面的代码:

extern"C" { 
    char* c_error_message_(); 
} 

会声明函数用不同的返回类型比实际的返回类型会导致段错误?

我不知所措。感谢您的回复。

回答

2

这是一种可行的方法。当我尝试使用返回字符串的函数来使用ISO C绑定时,编译器提出了反对意见。因此,如果您使用子例程参数:

subroutine fort_err_message (c_error_message) bind (C, name="fort_err_message") 

use iso_c_binding, only: C_CHAR, C_NULL_CHAR 

character (len=1, kind=C_CHAR), dimension (255), intent (out) :: c_error_message 

character (len=255, kind=C_CHAR) :: string 
integer :: i 

string = 'ERROR MSG' // C_NULL_CHAR 

do i=1, 255 
    c_error_message (i) = string (i:i) 
end do 

return 

end subroutine fort_err_message 

Fortran有点尴尬,因为技术上C字符串是一维字符数组。

而C语言代码演示这一原理:

#include <stdio.h> 

void fort_err_message (char chars [255]); 

int main (void) { 

    char chars [255]; 

    fort_err_message (chars); 

    printf ("%s\n", chars); 

    return 0; 

} 
+0

完美工作。万分感谢! – 2010-03-25 20:21:58

+0

你能说明segfault的根源(引擎盖下)是什么原因吗? – 2011-07-08 17:20:07

1

由于第二行声明了与函数名称相同的名称,因此它声明了函数返回的类型,即由255个字符组成的定标器字符串。但从理论上讲,这并没有告诉我们内部的API - 那就是编译器。我不知道“errmsg”来自哪里 - 它必须在其他地方声明 - 可能是Michael Anderson所提出的全球变量。或者,也许这是一个错误,行应该是c_error_message =“错误味精”。 (不需要指定子字符串范围 - 字符串的其余部分将填充空白。)IMO,从C调用Fortran的最佳方法(或反之亦然)是使用ISO C绑定,这将导致Fortran编译器使用C兼容接口。我没有做一个函数返回一个字符串,但已经完成了字符串作为参数。

0

FORTRAN函数返回分配给函数名称的值。返回的类型由函数定义指定,在这种情况下,它将返回一个长度为255个字符的字符串。我认为类型不匹配就是为什么你需要进行分割。那么你应该使用什么C类型?我不知道。

我发现这个Using C with FORTRAN页面,作者强烈建议使用FORTRAN子例程并将它们作为返回类型为void的C函数进行调用。

这是F95 quick reference

+1

的2001“表示使用FORTRAN页C”是过时的,有一些不正确的信息。例如,只有int/INTEGER,float/REAL和double/DOUBLE可以可靠交换的语句不再成立。在过去,连接语言是编译器和平台特定的。通过Fortran 2003的ISO C绑定,Fortran和具有C内部接口的语言可以以非编译器和平台特定的标准方式混合使用。 – 2010-03-25 02:47:57

+0

+1有趣。我不知道。我很长一段时间没有写FORTRAN,你显然已经保持了! – Fred 2010-03-25 04:35:26