繁体   English   中英

在 Fortran 和 C++ 之间传递复杂的数据结构

[英]Passing complex data structures between Fortran and C++

背景:我的任务是在现有的大型 Fortran 代码基础和使用 Qt 的现代 C++ GUI 之间创建互操作性。 我正在使用基于 Qt 6.2.2(MSVC 2019,64 位)的 Qt Creator 6.0.2 和带有 Intel Fortran 编译器的 VS 2019 Pro。

我已经能够在 Fortran 和 Qt 之间成功传递基本数据类型和简单结构/UDT,但是当我尝试进入更复杂的数据结构时,我遇到了很多问题和困惑。 我花了很多时间在谷歌上搜索,但我能找到的所有内容都仅限于基本数据类型示例。

所以我的问题最终是你是否在 Fortran 中有一个如下所示的数据结构:

module example
   type top_struct
      type(sub_struct), allocatable :: sStruct(:)
      complex         , allocatable :: complex1(:)
      real            , allocatable :: real1(:, :)
      integer         , allocatable :: ints1(:, :)
      character       , allocatable :: label1(:)
   end type top_struct
   
   type sub_struct
      complex         , allocatable :: complex2(:)
      real            , allocatable :: real2(:, :)
      integer         , allocatable :: ints2(:, :)
      character       , allocatable :: label2(:)
   end type sub_struct
end module

您将如何在 C++ 和 Fortran 中实现允许您在它们之间来回传递此结构的代码?

我发现其他使用解决方法指针讨论的问题在 Fortran 中的可分配与 C++ 中的 std::vector 之类的东西之间没有直接关联,但他们没有给出任何示例来说明如果数据在内部如何处理这个问题结构/UDT。

任何帮助将不胜感激!

除非您的结构是bind(C) ,否则不能保证 C(++) 和 Fortran 之间的精确对应。 编译器可以选择使用不同的填充或类似的。 但是你不能用可分配的组件创建一个bind(C)结构。 剩下的就是黑客。

作为一种解决方法,您可以使用指向那些可分配数组的type(c_ptr)指针创建一个代理结构,并将该代理传递给 C(++)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM