首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一维数组中创建一个类型不规则数组

在一维数组中创建一个类型不规则数组
EN

Stack Overflow用户
提问于 2014-02-13 05:19:19
回答 1查看 82关注 0票数 0

我的问题是,有一个子例程进行计算,并生成一个我以前不知道大小的数组。我发现的最好的解决方案是使用type(ragged)并使用各种独立的可分配数组(station%trac):

代码语言:javascript
复制
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,这使得我的代码非常慢。

EN

回答 1

Stack Overflow用户

发布于 2014-02-13 06:49:59

没有简单的方法可以将伪数组station(:)%trac打包到一个秩1数组中。我不认为任何“聪明”的使用Fortran的老技巧,例如将秩1数组的第一个元素等同于station(1)%trac(1),即使你的编译器接受这样的声明也不会起作用。这种技巧依赖于内存中数组元素的特定布局,而这是标准所不能保证的。你可以试试,但我对成功不抱太大希望。

根据您对参差不齐的数组进行写入和读取的使用模式,可以采用不同的设计,例如

代码语言:javascript
复制
type :: ragged_array
  integer, dimension(:), allocatable :: indices
  real, dimension(:), allocatable :: elements
end type ragged_array

其中参差数组中的所有条目都存储在秩1数组elements中。当然,indices保存着参差不齐的数组中每个“行”的开头(或结尾)的索引。这种方法使得填充参差不齐的数组和从中提取“行”变得更加困难。如果你想调整除最后一行之外的任何“行”的长度,这是非常可怕的。

但它的优点是,所有元素都存储在一个秩1数组中,可以一口气处理,并且避免了在编组数据时创建大型数组的临时副本的需要。

你选择,你比我们更了解你的应用程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21739899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档