基本上,这是我的问题。我从我的 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_();
}
声明一个返回类型与实际返回类型不同的函数会导致段错误吗?
我迷茫了。感谢您的回复。
最佳答案
这是一个有效的方法。当我尝试将 ISO C 绑定(bind)与返回字符串的函数一起使用时,编译器表示反对。因此,如果您使用子例程参数:
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;
}
关于c++ - FORTRAN 函数返回数组导致段错误(从 C++ 调用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2512528/