C++ 函数中的字符数组与 Fortran 调用程序中的字符数组不对应

问题描述

系统:

Mac OSX Catalina
GCC 10,GFORTRAN 10

我有一个调用 C++ void 函数的简单 Fortran 程序。目的是根据我在示例中找到的内容将字符串从 Fortran 传递到 C++ 的玩具示例,但有些地方不对

# subf.f90
program main
  use iso_c_binding
  character(len=256),target :: a_string

  interface
     subroutine print_string(fortran_string) Bind(C)
       use iso_c_binding
       TYPE(C_PTR) :: fortran_string
     end subroutine print_string
  end interface

  a_string = "Hello world" // C_NULL_CHAR
  print *,"trying to print: ",trim(a_string)
  print *,"a string of length: ",len(trim(a_string)) - 1
  call print_string(C_LOC(a_string))
end program main
// sub.cpp
#include <iostream>
#include <string>
#include <cstring>

extern "C" {
  void print_string(const char * fortran_string);
}

void print_string(const char* fortran_string) {
  std::string forstring(fortran_string);
  std::cout << "sizeof fortran_string: " << sizeof fortran_string << std::endl
            << "strlen of fortran_string: " << strlen(fortran_string) << std::endl
            << "first char: " << fortran_string[0] << std:: endl
            << ".length(): " << forstring.length() << std::endl
            << "the actual string: `" << forstring << "`" << std::endl;
}

我用 g++-10 sub.cpp -c && gfortran subf.f90 sub.o -o sub -lstdc++ && ./sub 编译和运行

一个字符似乎总是p,传入的字符串大小总是一样的,但是p是从哪里来的?,为什么字符串是垃圾?为什么大小与我从 fortran 发送的不匹配?

这是一个示例输出

> ./sub
 trying to print: Hello world
 a string of length:           11
sizeof fortran_string: 8
strlen of fortran_string: 6
first char: p
.length(): 6
the actual string: `p$??`

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)