返回数组的FORTRAN函数导致段错误(从C ++调用)

时间:2010-03-25 01:08:12

标签: c++ pointers fortran return-value fortran-iso-c-binding

基本上,这是我的问题。我正在用我的C ++代码调用其他人的FORTRAN函数,这给我带来了麻烦。一些代码:

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_();
}

声明具有与实际返回类型不同的返回类型的函数会导致段错误吗?

我很茫然。感谢您的回复。

3 个答案:

答案 0 :(得分:2)

这是一种有效的方法。当我尝试使用返回字符串的函数的ISO C Binding时,编译器反对。因此,如果您使用子例程参数:

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;

}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

我找到了这个Using C with FORTRAN页面,作者强烈建议使用FORTRAN子程序并将它们称为C函数,返回类型为void。

这是F95 quick reference