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

3

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个回答

4

如果您拥有符合Fortran 2008标准的编译器,或足够兼容的编译器,您将会发现内置函数storage_size,它返回存储其参数所使用的位数。如果无法满足要求,大多数我熟悉的编译器实现了一个非标准函数来完成此操作;Intel Fortran编译器有一个名为sizeof的函数,它返回存储其参数所需的字节数。


看起来这样就可以了,谢谢!我已经更新了示例代码,以反映出这个解决方案,供有兴趣的人参考。 - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接