Skip to content

数组

目录

基本使用

定义数组:Datatype Name (Size) => 数组的数据类型,数组变量的名字,数组的大小,如:

Fortran
program array
  implicit none
  ! 定义数组
  integer :: array1(5)
  integer :: i, val
  do i = 1, 5
  read (5,*) val
  array1(i) = val * val
  end do
end program array

需要注意的是:

  1. Datatype 除基本数据类型(integer, real, complex, logical)外,也可以是用 type 自定义的类型
  2. 数组的大小(Size)只能是整型的常数、常量或函数输入的变量

常量(静态变量的声明采用 parameter),如:

Fortran
program array
  implicit none
  integer, parameter :: j = 5
  integer :: array1(j)
  integer :: i, val
  do i = 1, 5
  read (5,*) val
  array1(i) = val * val
  end do
end program array

在此例中,如果去掉静态变量声明(parameter),编译将无法通过。除此之外,也可以利用 子例程 (subroutine) 来实现用变量给数组长度赋值,如:

Fortran
subroutine array(j)
  implicit none
  integer :: j
  integer :: array1(j)
  integer :: i, val
  do i = 1, 5
    read (5,*) val
    array1(i) = val * val
  end do
subroutine array(j)

需要注意的是,与 C/C++ 等主流语言不同的是,Fortran 中数组的内存分配方式为列展开——即对于多维数组,Fortran 数组在内存中是从高维逐次展开,这意味着写循环嵌套时,应将高维展开项置于内层!下面实现一 C/C++ - Fortran 程序来说明这点(Fortran 没有原生操纵内存的方法)

Fortran
program main
  implicit none
  integer :: i, j, k, val = 1
  integer :: array(3, 3, 3)
  do i = 1, 3
    do j = 1, 3
      do k = 1 ,3
        array(i, j, k) = 1 * 100 + j * 10 + k
      end do
    end do
  end do
  ! C 程序接口
  call check_storage(array)
end program main
C
// C 程序调用部分,主函数逻辑略
void check_storage_(int *array)
{
  int i;
  for (i = 0; i < 9; i++) printf ("value %d is %d at %lx\n", i + 1, array[i], &(array[i]));
}

以下是输出内容

txt
value 1 is 111 at 7ffd7c8f7200
value 2 is 211 at 7ffd7c8f7204
value 3 is 311 at 7ffd7c8f7208
value 4 is 121 at 7ffd7c8f720c
value 5 is 221 at 7ffd7c8f7210
value 6 is 321 at 7ffd7c8f7214
value 7 is 131 at 7ffd7c8f7218
value 8 is 231 at 7ffd7c8f721c
value 9 is 331 at 7ffd7c8f7220

动态数组分配

使用 allocatable/allocate声明来实现动态数组分配,使用时需要手动释放内存,即配合 deallocate 使用,如:

Fortran
program array
  implicit none
  integer :: i, j, k, val, sz = 300
  integer, allocatable :: array1(:, :, :,)
  allocate(array1(sz, -1 : sz + 2, sz))
  do val = 1, 10000
    do k = 1, sz
      do j = -1, sz + 2
        do k = 1, sz
          array1(i, j, k) = val
        end do
      end do
    end do
  end do
  deallocate(array1)
end program array

重复分配但未释放时,运行时会报错

当然,将 allocatable 声明与 dimension 连用时,可不用 deallocate 来手动释放内存,如:

Fortran
program array
  implicit none
  integer :: i, j, k, val, sz
  integer, allocatable, dimension (:, :, :,) :: array1, array2
  read (5, *) val, sz
  allocate(array1(val, val, val))
  allocate(array2(sz, -1 : sz + 2, sz))
end program array

数组的内容设置

基于 CC BY-NC-SA 4.0 许可发布