2

基本上,这是我的问题。我正在从我的 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_();
}

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

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

4

3 回答 3

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;

}
于 2010-03-25T02:41:53.543 回答
1

由于第二行声明了一个与函数名相同的名称,它声明了函数返回的类型,即255个字符的定标字符串。但从理论上讲,这并没有告诉我们内部 API —— 那是编译器的问题。我不知道“errmsg”来自哪里——它必须在其他地方声明——也许是迈克尔安德森建议的一个全局变量。或者这可能是一个错误,该行应该是 c_error_message = "ERROR MSG"。(无需指定子字符串范围——字符串的其余部分将用空格填充。)IMO,从 C 调用 Fortran(反之亦然)的最佳方法是使用 ISO C绑定,这将导致 Fortran 编译器使用与 C 兼容的接口。我还没有完成返回字符串的函数,

于 2010-03-25T02:18:39.587 回答
0

FORTRAN 函数返回分配给函数名称的值。返回的类型由函数定义指定,在这种情况下,它返回一个 255 个字符长的字符串。我认为类型不匹配是您出现段错误的原因。那么你应该使用什么 C 类型呢?我不知道。

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

这是F95 快速参考

于 2010-03-25T02:23:56.807 回答