You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:49:57