基本上,这是我的问题。我正在用我的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_();
}
声明具有与实际返回类型不同的返回类型的函数会导致段错误吗?
我很茫然。感谢您的回复。
答案 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。