确定内存中的 Fortran 派生类型大小

Posted

技术标签:

【中文标题】确定内存中的 Fortran 派生类型大小【英文标题】:Determine Fortran derived type size in memory 【发布时间】:2014-04-16 10:10:28 【问题描述】:

Fortran 内部函数transfer 可用于将派生类型转换为实数或整数数组。在依赖原始类型(整数、实数等)数组进行持久性的遗留系统中工作时,这可能非常有用。

下面的代码至少在ifortgfortran 上运行,并将简单的派生类型示例转换为整数数组(已更新解决方案):

program main
    implicit none

    integer, parameter :: int_mem_size = storage_size(1)

    type subtype
       integer a
       double precision b
    end type subtype

    type :: mytype
         integer :: foo
         double precision :: bar
         type(subtype) :: some_type
    end type

    type(mytype)  :: my_var
    type(subtype) :: my_subtype

    ! Old version: integer :: x(30)
    integer, allocatable :: x(:)
    integer :: mem_size

    !Allocate array with required size
    mem_size = storage_size(my_var)
    allocate(x(mem_size/int_mem_size))

    my_subtype%a = 1
    my_subtype%b = 2.7

    my_var%foo = 42
    my_var%bar = 3.14
    my_var%some_type = my_subtype

    write(*,*) "transfering..."
    x = transfer(my_var, x)
    write(*,*) "Integer transformation:", x

end program main

在我的电脑上,这是输出(这个结果至少取决于平台):

 transfering...
 Integer transformation:                    42           0  1610612736  1074339512         
 999           0    -1610612736  1074108825

我的问题是我已经“猜到”了一个 30 元素长的整数数组足够大来存储这个数据结构。有没有办法确定数组需要多大才能存储整个数据结构?

【问题讨论】:

【参考方案1】:

如果您有一个兼容 Fortran 2008 的编译器,或者一个足够兼容的编译器,您会发现内部函数 storage_size 返回用于存储其参数的位数。我熟悉的大多数编译器都没有实现非标准函数来执行此操作;英特尔 Fortran 编译器有一个名为 sizeof 的函数,它返回存储其参数所需的字节数。

【讨论】:

这似乎可以解决问题,谢谢!我已经更新了示例代码,以向任何感兴趣的人反映此解决方案

以上是关于确定内存中的 Fortran 派生类型大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Fortran 派生类型或类中实现类型绑定写入语句输出

Fortran - 可分配派生类型的可分配数组

在 Fortran 90 中使用二维数组与派生类型数组

派生数据类型中的 Fortran、参数和静态表

在 fortran 中命名派生类型的良好做法

Fortran 派生类型包含可从 C 访问的指针