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

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

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

我迷茫了。感谢您的回复。

最佳答案

这是一个有效的方法。当我尝试将 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/

相关文章:

c++ - C++/Qt - 内存分配如何工作?

c++ - 如何使数组成为 C++ 中函数的参数?

intellij-idea - Intellij 插件 Fortran

fortran - gfortran 中的 ieee_arithmetic 内在模块

c++ - 插槽调用了两次 qt

c++ - 从 QGridLayout 中删除一行

c++ - 回到 C++,带指针的 void 函数,如何制作 get 函数

c - 函数和指向指针的指针

arrays - 为什么数组大小未知?

c - gfortran debugging with gdb : w_powf. c: 没有那个文件或目录