Fortran 90中能否定义非连续索引数组?求可行方案
在Fortran 90中定义带有非连续索引的数组
在Fortran 90中是否可以定义带有非连续索引的数组?
你给出的代码报错,核心原因是Fortran要求显式声明的数组必须具备常量形状——你用(/1,3/)这种数组构造器来指定维度,属于非常量的形状描述,编译器自然会抛出The module or main program array 'test' at (1) must have constant shape的错误。
那有没有办法实现类似“非连续索引数组”的需求?当然有,Fortran提供了几种实用方式来模拟这种行为:
方法1:用指针创建非连续数组视图
先声明一个常规的基础数组,再通过指针关联到它的非连续元素,这样指针就能当作“非连续索引数组”来使用:
program example implicit none integer, target :: base(3) ! 基础数组,下标覆盖1-3 integer, pointer :: test(:) ! 将指针关联到base的第1、第3个元素 test => base([1,3]) ! 此时操作test就等同于操作base的对应非连续元素 test(1) = 10 test(2) = 30 print *, base ! 输出结果为 10, 0, 30 end program example
方法2:分配数组结合索引赋值
如果不需要和原数组关联,也可以直接创建新数组,把对应非连续索引的元素赋值进去:
program example implicit none integer :: test(2) integer :: base(3) = [1,2,3] ! 把base的非连续元素赋值给test test = base([1,3]) print *, test ! 输出结果为 1, 3 end program example
方法3:用数组构造器直接生成
如果是要初始化一个对应非连续逻辑索引的数组,也可以用数组构造器直接生成:
program example implicit none integer :: test(2) ! 直接构造对应非连续索引逻辑的数组 test = [(i, i=[1,3])] print *, test ! 输出结果为 1, 3 end program example
需要注意的是:Fortran本身并不支持直接声明下标为非连续整数(比如直接指定下标是1和3)的数组,因为数组的下标范围必须是连续的整数区间。但通过上面的方法,你完全可以实现“访问非连续位置元素”的需求,效果和你想要的“非连续索引数组”一致。
内容的提问来源于stack exchange,提问作者mzp
相关产品推荐
相关产品推荐

