Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定内存中Fortran派生类型的大小_Fortran_Gfortran_Intel Fortran_Derived Types - Fatal编程技术网

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

确定内存中Fortran派生类型的大小,fortran,gfortran,intel-fortran,derived-types,Fortran,Gfortran,Intel Fortran,Derived Types,Fortran内部函数transfer可用于将派生类型转换为实数或整数数组。在依赖基元类型(整数、实数等)数组进行持久化的遗留系统中工作时,这可能非常有用 下面的代码至少在ifort和gfortran上运行,并将简单的派生类型示例转换为整数数组(使用解决方案更新)): 在我的电脑上,这是输出(此结果至少取决于平台): 我的问题是,我“猜测”了一个30个元素的整数数组足够大,可以存储这个数据结构。是否有一种方法可以确定数组需要多大才能存储整个数据结构?如果您有一个符合Fortran 2008的编译

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

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

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


我的问题是,我“猜测”了一个30个元素的整数数组足够大,可以存储这个数据结构。是否有一种方法可以确定数组需要多大才能存储整个数据结构?

如果您有一个符合Fortran 2008的编译器,或者一个足够符合Fortran 2008的编译器,您将找到内在函数
storage\u size
,它返回用于存储其参数的位数。我所熟悉的大多数编译器都没有实现一个非标准函数来实现这一点;“英特尔Fortran编译器”有一个名为
sizeof
的函数,该函数返回存储参数所需的字节数。

这似乎很管用,谢谢!我已经更新了示例代码,以反映任何感兴趣的人的解决方案
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