我的问题是有一个子程序进行计算并生成一个我以前不知道大小的数组。我发现的最佳解决方案是使用type(ragged)
并使用各种可分离的可分配数组(station%trac
):
module ragged_module
type ragged
real,allocatable,dimension(:)::trac
end type ragged
end module ragged_module
program chrag
use ragged_module
implicit none
type (ragged), allocatable, dimension (:) :: station
(...)
call calculation(station, othervariables)
call calculus(station1D,othervariables) !station need to be seen as an 1D array here
end program chrag
但是,我需要使变量station
像一维数组一样(传递给另一个子程序)。如果我正在使用2D数组,那将很容易,因为我知道如何访问内存,但在类型的情况下我没有发现。
有一种简单的方法吗?或者我应该声明一个可分配的数组,然后在分配必要的长度后将station
的每个组件的值传递给这个新的1D数组?我担心的是因为我正在使用大型数组,而我的旧解决方案是使用move_alloc
使我的代码变得非常慢的原因。
答案 0 :(得分:0)
没有简单的方法将伪数组station(:)%trac
打包到rank-1数组中。我不认为任何“聪明”使用旧的Fortran技巧,例如将等级1数组的第一个元素等同于station(1)%trac(1)
,即使您的编译器接受这样的声明,也会起作用。这种技巧取决于内存中数组元素的特定布局,标准无法保证。你可以尝试,但我不会对成功寄予很大希望。
根据您的使用模式,写入和读取不规则阵列,您可以采用不同的设计,例如
type :: ragged_array
integer, dimension(:), allocatable :: indices
real, dimension(:), allocatable :: elements
end type ragged_array
其中参差不齐的数组中的所有条目都存储在rank-1数组elements
中。当然,indices
保存参差不齐的数组中每个'行'的开始(或结束)的索引。这种方法使得填充参差不齐的数组变得更加困难,并从中提取“行”。如果您想要调整除最后一行之外的任何“行”的长度,那就太可怕了。
但它的优点是所有元素都存储在一级数组中,可以在一个gulp中进行处理,并避免在整理数据时制作大型数组的临时副本。
您选择,比我们更了解您的应用程序。