我的问题是,有一个子例程进行计算,并生成一个我以前不知道大小的数组。我发现的最好的解决方案是使用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设置为一维数组(以便传递给另一个子例程)。如果我使用的是二维数组,这将很容易,因为我知道内存访问是如何进行的,但对于我没有发现的类型。
有什么简单的方法可以做到这一点吗?或者我应该声明一个1D可分配数组,然后在分配必要的长度后将station的每个组件的值传递给这个新的1D数组?我担心的是,因为我使用的是大型数组,而我以前的解决方案是使用move_alloc,这使得我的代码非常慢。
发布于 2014-02-13 06:49:59
没有简单的方法可以将伪数组station(:)%trac打包到一个秩1数组中。我不认为任何“聪明”的使用Fortran的老技巧,例如将秩1数组的第一个元素等同于station(1)%trac(1),即使你的编译器接受这样的声明也不会起作用。这种技巧依赖于内存中数组元素的特定布局,而这是标准所不能保证的。你可以试试,但我对成功不抱太大希望。
根据您对参差不齐的数组进行写入和读取的使用模式,可以采用不同的设计,例如
type :: ragged_array
integer, dimension(:), allocatable :: indices
real, dimension(:), allocatable :: elements
end type ragged_array其中参差数组中的所有条目都存储在秩1数组elements中。当然,indices保存着参差不齐的数组中每个“行”的开头(或结尾)的索引。这种方法使得填充参差不齐的数组和从中提取“行”变得更加困难。如果你想调整除最后一行之外的任何“行”的长度,这是非常可怕的。
但它的优点是,所有元素都存储在一个秩1数组中,可以一口气处理,并且避免了在编组数据时创建大型数组的临时副本的需要。
你选择,你比我们更了解你的应用程序。
https://stackoverflow.com/questions/21739899
复制相似问题