数组
目录
基本使用
定义数组: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
需要注意的是:
- Datatype 除基本数据类型(
integer
,real
,complex
,logical
)外,也可以是用type
自定义的类型 - 数组的大小(
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