Fortran - Dinamik massivlər

Fortran-da Dinamik Massivlər

Dinamik massiv ölçüsü tərtib zamanı məlum olmayan, lakin icra zamanı məlum olan massivdir.

Dinamik massivlər allocatable atributu ilə bəyan edilir.

Məsələn:

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

Massivin rütbəsi (yəni ölçüləri) göstərilməlidir. Belə massiv üçün yaddaş ayırmaq üçün allocate funksiyasından istifadə edilir:

allocate(darray(s1, s2))

Massivdən istifadə etdikdən sonra ayrılmış yaddaşı deallocate funksiyası ilə azad etməlisiniz:

deallocate(darray)

Nümunə

Aşağıdakı nümunə yuxarıda müzakirə olunan anlayışları nümayiş etdirir:

program dynamic_array
implicit none

   ! rütbə 2-dir, lakin ölçü məlum deyil
   real, dimension(:,:), allocatable :: darray
   integer :: s1, s2
   integer :: i, j

   print*, "Massivin ölçüsünü daxil edin:"
   read*, s1, s2

   ! yaddaş ayır
   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

Yuxarıdakı kod tərtib və icra edildikdə, aşağıdakı nəticə yaranır:

Massivin ölçüsünü daxil edin: 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 İfadəsinin İstifadəsi

data ifadəsi bir neçə massivi və ya massiv bölməsini ilkinləşdirmək üçün istifadə edilə bilər.

data ifadəsinin sintaksisi:

data dəyişən / siyahı / ...

Nümunə

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 *, 'A massivi:'
   do j = 1, 5
      print *, a(j)
   end do

   print *, 'B massivi:'
   do i = lbound(b, 1), ubound(b, 1)
      write(*,*) (b(i, j), j = lbound(b, 2), ubound(b, 2))
   end do

   print *, 'C massivi:'
   do j = 1, 10
      print *, c(j)
   end do

end program dataStatement

Yuxarıdakı kod tərtib və icra edildikdə, aşağıdakı nəticə yaranır:

A massivi:
 7
 8
 9
 10
 11
B massivi:
 1 1 1
 2 2 2
 3 3 3
C massivi:
 4
 2
 5
 2
 6
 2
 7
 2
 8
 2

Where İfadəsinin İstifadəsi

where ifadəsi məntiqi şərtin nəticəsinə əsasən bir massiv elementini ifadədə istifadə etməyə imkan verir. Əgər şərt doğru olarsa, ifadə həmin element üçün icra edilir.


Nümunə

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 *, 'A massivi:'

   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 *, 'Where ifadəsindən sonra A massivi:'
   do i = lbound(a, 1), ubound(a, 1)
      write(*,*) (a(i, j), j = lbound(a, 2), ubound(a, 2))
   end do

end program whereStatement

Yuxarıdakı kod tərtib və icra edildikdə, aşağıdakı nəticə yaranır:

A massivi:
 0 1 2 3 4
-1 0 1 2 3
-2 -1 0 1 2
Where ifadəsindən sonra A massivi:
 5 5 5 5 5
 1 5 5 5 5
 1 1 5 5 5