Fortran内部函数transfer可用于将派生类型转换为实数组或整数数组。在依赖于基元类型数组(整数、实等)的遗留系统中,这可能非常有用。为了坚持。
下面的代码至少在ifort和gfortran上运行,并将一个简单的派生类型示例转换为整数数组(使用解决方案更新的):
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在我的PC上,这是输出(这个结果至少与平台有关):
transfering...
Integer transformation: 42 0 1610612736 1074339512
999 0 -1610612736 1074108825我的问题是,我“猜”到一个30元素长的整数数组足够大,足以存储这个数据结构。有方法可以确定数组需要多大才能存储整个数据结构吗?
发布于 2014-03-12 11:03:41
如果您有一个符合Fortran 2008标准的编译器,或者一个足够兼容的编译器,您将发现内部函数storage_size,它返回用于存储其参数的位数。如果做不到这一点,我所熟悉的大多数编译器都会实现一个非标准函数来实现这个功能;Intel编译器有一个名为sizeof的函数,它返回存储其参数所需的字节数。
https://stackoverflow.com/questions/22348749
复制相似问题