微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。