Fortran - Mảng động

A dynamic array là một mảng, kích thước của mảng này không được biết tại thời điểm biên dịch, nhưng sẽ được biết vào thời điểm thực thi.

Mảng động được khai báo với thuộc tính allocatable.

Ví dụ,

real, dimension (:,:), allocatable :: darray

Thứ hạng của mảng, tức là, kích thước phải được đề cập, tuy nhiên, để cấp phát bộ nhớ cho một mảng như vậy, bạn sử dụng allocate chức năng.

allocate ( darray(s1,s2) )

Sau khi mảng được sử dụng, trong chương trình, bộ nhớ được tạo sẽ được giải phóng bằng cách sử dụng deallocate chức năng

deallocate (darray)

Thí dụ

Ví dụ sau đây minh họa các khái niệm đã thảo luận ở trên.

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

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

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

Sử dụng Tuyên bố Dữ liệu

Các data câu lệnh có thể được sử dụng để khởi tạo nhiều hơn một mảng hoặc khởi tạo phần mảng.

Cú pháp của câu lệnh dữ liệu là -

data variable / list / ...

Thí dụ

Ví dụ sau thể hiện khái niệm -

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

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

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

Sử dụng Tuyên bố Vị trí

Các wherecâu lệnh cho phép bạn sử dụng một số phần tử của mảng trong một biểu thức, tùy thuộc vào kết quả của một số điều kiện logic. Nó cho phép thực hiện biểu thức, trên một phần tử, nếu điều kiện đã cho là đúng.

Thí dụ

Ví dụ sau thể hiện khái niệm -

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

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

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