Fortran動態數組
動態數組是一種數組,其尺寸在編譯時不知道,而是在執行時才已知/確定的。
動態數組的屬性使用 allocatable 聲明。 .
例如,
real, dimension (:,:), allocatable :: darray
數組的秩,即尺寸,必須提到但是,分配內存以這樣的陣列,可以使用allocate函數。
allocate ( darray(s1,s2) )
該陣列使用後,在該程序中,所創建的存儲器應該使用 deallocate 函數解除
deallocate (darray)
示例
下面的例子演示了上面討論的概念。
program dynamic_array implicit none !rank is 2, but size not known
real, dimension (:,:), allocatable :: darray
integer :: s1, s2
integer :: i, j print*, "Enter the size of the array:" read*, s1, s2 ! allocate memory
allocate ( darray(s1,s2) ) do i = 1, s1 do j = 1, s2
darray(i,j) = i*j print*, "darray(",i,",",j,") = ", darray(i,j) end do end do deallocate (darray) end program dynamic_array
當上述代碼被編譯和執行時,它產生了以下結果:
Enter the size of the array: 3,4
darray( 1 , 1 ) = 1.00000000
darray( 1 , 2 ) = 2.00000000
darray( 1 , 3 ) = 3.00000000
darray( 1 , 4 ) = 4.00000000
darray( 2 , 1 ) = 2.00000000
darray( 2 , 2 ) = 4.00000000
darray( 2 , 3 ) = 6.00000000
darray( 2 , 4 ) = 8.00000000
darray( 3 , 1 ) = 3.00000000
darray( 3 , 2 ) = 6.00000000
darray( 3 , 3 ) = 9.00000000
darray( 3 , 4 ) = 12.0000000
使用data語句
data 語句可用於初始化多個陣列,或用於陣列部分的初始化。
data 語句的語法是:
data variable / list / ...
示例
下面的例子演示了這一概念:
program dataStatement implicit none
integer :: a(5), b(3,3), c(10),i, j
data a /7,8,9,10,11/ data b(1,:) /1,1,1/ data b(2,:)/2,2,2/ data b(3,:)/3,3,3/ data (c(i),i=1,10,2) /4,5,6,7,8/ data (c(i),i=2,10,2)/5*2/ Print *, 'The A array:' do j = 1, 5 print*, a(j) end do Print *, 'The B array:' do i = lbound(b,1), ubound(b,1) write(*,*) (b(i,j), j = lbound(b,2), ubound(b,2)) end do Print *, 'The C array:' do j = 1, 10 print*, c(j) end do end program dataStatement
當上述代碼被編譯和執行時,它產生了以下結果:
The A array:
7
8
9
10
11
The B array:
1 1 1
2 2 2
3 3 3
The C array:
4
2
5
2
6
2
7
2
8
2
使用where語句
where語句可以使用數組中的某些元素在一個表達式,根據一些邏輯條件的結果。它允許表達的執行在一個元素上,如果給定的條件爲真。
例子
下面的例子演示了這一概念:
program whereStatement implicit none
integer :: a(3,5), i , j do i = 1,3 do j = 1, 5 a(i,j) = j-i end do end do Print *, 'The A array:' do i = lbound(a,1), ubound(a,1) write(*,*) (a(i,j), j = lbound(a,2), ubound(a,2)) end do where( a<0 ) a = 1 elsewhere
a = 5 end where Print *, 'The A array:' do i = lbound(a,1), ubound(a,1) write(*,*) (a(i,j), j = lbound(a,2), ubound(a,2)) end do end program whereStatement
當上述代碼被編譯和執行時,它產生了以下結果:
The A array:
0 1 2 3 4
-1 0 1 2 3
-2 -1 0 1 2
The A array:
5 5 5 5 5
1 5 5 5 5
1 1 5 5 5