با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، آرایه ها از انواع داده مهمی محسوب می شوند در جلسه قبل از آموزش های دوره فرترن به معرفی آرایه ها پرداختیم این جلسه آرایه های پویا در فرترن را آموزش می بینید. آرایه پویا یک آرایه ای است، که اندازه آن در زمان کامپایل تعیین نشده، اما در زمان اجرای آن مشخص می شود.آرایه های پویا با ویژگی اختصاص داده می شود. تابع allocate در فرترن و تابع deallocate از جمله توابع برای تخصیص حافظه هستند.
در ابتدا آرایه های پویا را با ذکر یک مثال توضیح می دهیم :
1 | real, dimension (:,:), allocatable :: darray |
با این حال، رتبه آرایه، یعنی ابعاد باید ذکر شود، برای تخصیص حافظه به چنین آرایه، از تابع allocate در فرترن استفاده کنید.
1 | allocate ( darray(s1,s2) ) |
پس از استفاده از آرایه، در برنامه، حافظه ایجاد شده باید با استفاده از تابع deallocate آزاد شود :
1 | deallocate (darray) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 |
وقتی کد بالا کامپایل و اجرا می شود، نتیجه زیر را تولید می کند :
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
بیانیه داده می تواند برای بیش از یک آرایه یا برای راه اندازی بخشی از آرایه استفاده شود.
سینتکس بیانیه داده
1 | data variable / list / ... |
مثال زیر این مفهوم را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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 |
وقتی کد بالا کامپایل و اجرا می شود، نتیجه زیر را تولید می کند :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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 |
بیانیه ای که به شما اجازه می دهد تا بسته به نتیجه برخی از شرایط منطقی از بعضی از عناصر یک آرایه در عبارت استفاده کنید.همچنین اگر شرط داده شده درست باشد اجرای عبارت در یک عنصر را اجازه می دهد.
مثال زیر این مفهوم را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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 |
وقتی کد بالا کامپایل و اجرا می شود، نتیجه زیر نشان داده می شود :
1 2 3 4 5 6 7 8 | 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 |
آموزش آرایه های پویا همراه با مثال به پایان رسید با ما همراه باشید تا در جلسه بعد انواع داده های مشتق شده در فرترن را آموزش ببینید.