Fortran - อาร์เรย์

อาร์เรย์สามารถจัดเก็บคอลเล็กชันตามลำดับที่มีขนาดคงที่ขององค์ประกอบประเภทเดียวกัน อาร์เรย์ใช้ในการจัดเก็บชุดข้อมูล แต่มักจะมีประโยชน์มากกว่าที่จะคิดว่าอาร์เรย์เป็นชุดของตัวแปรประเภทเดียวกัน

อาร์เรย์ทั้งหมดประกอบด้วยตำแหน่งหน่วยความจำที่อยู่ติดกัน ที่อยู่ต่ำสุดสอดคล้องกับองค์ประกอบแรกและที่อยู่สูงสุดขององค์ประกอบสุดท้าย

หมายเลข (1) หมายเลข (2) หมายเลข (3) หมายเลข (4)

อาร์เรย์สามารถเป็นมิติเดียว (เช่นเวกเตอร์) สองมิติ (เช่นเมทริกซ์) และฟอร์แทรนช่วยให้คุณสร้างอาร์เรย์ได้สูงสุด 7 มิติ

การประกาศอาร์เรย์

อาร์เรย์ถูกประกาศด้วย dimension แอตทริบิวต์

ตัวอย่างเช่นหากต้องการประกาศอาร์เรย์หนึ่งมิติที่มีชื่อว่า number ของจำนวนจริงที่มี 5 องค์ประกอบคุณต้องเขียน

real, dimension(5) :: numbers

แต่ละองค์ประกอบของอาร์เรย์ถูกอ้างอิงโดยการระบุตัวห้อย องค์ประกอบแรกของอาร์เรย์มีตัวห้อยหนึ่งตัว หมายเลขอาร์เรย์ประกอบด้วยตัวแปรจริงห้าตัว ได้แก่ ตัวเลข (1) ตัวเลข (2) ตัวเลข (3) ตัวเลข (4) และตัวเลข (5)

ในการสร้างอาร์เรย์สองมิติ 5 x 5 ของจำนวนเต็มชื่อเมทริกซ์คุณเขียน -

integer, dimension (5,5) :: matrix

คุณยังสามารถประกาศอาร์เรย์ที่มีขอบเขตล่างที่ชัดเจนได้เช่น -

real, dimension(2:6) :: numbers
integer, dimension (-3:2,0:4) :: matrix

การกำหนดค่า

คุณสามารถกำหนดค่าให้กับสมาชิกแต่ละคนเช่น

numbers(1) = 2.0

หรือคุณสามารถใช้การวนซ้ำ

do i  =1,5
   numbers(i) = i * 2.0
end do

องค์ประกอบอาร์เรย์หนึ่งมิติสามารถกำหนดค่าได้โดยตรงโดยใช้สัญลักษณ์รูปมือสั้น ๆ ที่เรียกว่าตัวสร้างอาร์เรย์เช่น

numbers = (/1.5, 3.2,4.5,0.9,7.2 /)

please note that there are no spaces allowed between the brackets ‘( ‘and the back slash ‘/’

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงแนวคิดที่กล่าวถึงข้างต้น

program arrayProg

   real :: numbers(5) !one dimensional integer array
   integer :: matrix(3,3), i , j !two dimensional real array
   
   !assigning some values to the array numbers
   do i=1,5
      numbers(i) = i * 2.0
   end do
   
   !display the values
   do i = 1, 5
      Print *, numbers(i)
   end do
   
   !assigning some values to the array matrix
   do i=1,3
      do j = 1, 3
         matrix(i, j) = i+j
      end do
   end do
   
   !display the values
   do i=1,3
      do j = 1, 3
         Print *, matrix(i,j)
      end do
   end do
   
   !short hand assignment
   numbers = (/1.5, 3.2,4.5,0.9,7.2 /)
   
   !display the values
   do i = 1, 5
      Print *, numbers(i)
   end do
   
end program arrayProg

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

2.00000000    
 4.00000000    
 6.00000000    
 8.00000000    
 10.0000000    
         2
         3
         4
         3
         4
         5
         4
         5
         6
 1.50000000    
 3.20000005    
 4.50000000    
0.899999976    
 7.19999981

คำศัพท์ที่เกี่ยวข้องกับ Array

ตารางต่อไปนี้ให้คำศัพท์ที่เกี่ยวข้องกับอาร์เรย์ -

ระยะเวลา ความหมาย
อันดับ มันคือจำนวนมิติที่อาร์เรย์มี ตัวอย่างเช่นสำหรับอาร์เรย์ชื่อเมทริกซ์อันดับคือ 2 และสำหรับอาร์เรย์ที่มีชื่อตัวเลขอันดับคือ 1
ขอบเขต มันคือจำนวนองค์ประกอบตามมิติ ตัวอย่างเช่นหมายเลขอาร์เรย์มีขอบเขต 5 และอาร์เรย์ชื่อเมทริกซ์มีขอบเขต 3 ในทั้งสองมิติ
รูปร่าง รูปร่างของอาร์เรย์คืออาร์เรย์จำนวนเต็มหนึ่งมิติซึ่งมีจำนวนองค์ประกอบ (ขอบเขต) ในแต่ละมิติ ตัวอย่างเช่นสำหรับเมทริกซ์อาร์เรย์รูปร่างคือ (3, 3) และหมายเลขอาร์เรย์คือ (5)
ขนาด เป็นจำนวนองค์ประกอบที่อาร์เรย์ประกอบด้วย สำหรับเมทริกซ์อาร์เรย์คือ 9 และสำหรับหมายเลขอาร์เรย์คือ 5

การส่งอาร์เรย์ไปยังขั้นตอน

คุณสามารถส่งอาร์เรย์ไปยังโพรซีเดอร์เป็นอาร์กิวเมนต์ได้ ตัวอย่างต่อไปนี้แสดงให้เห็นถึงแนวคิด -

program arrayToProcedure      
implicit none      

   integer, dimension (5) :: myArray  
   integer :: i
   
   call fillArray (myArray)      
   call printArray(myArray)
   
end program arrayToProcedure


subroutine fillArray (a)      
implicit none      

   integer, dimension (5), intent (out) :: a
   
   ! local variables     
   integer :: i     
   do i = 1, 5         
      a(i) = i      
   end do  
   
end subroutine fillArray 


subroutine printArray(a)

   integer, dimension (5) :: a  
   integer::i
   
   do i = 1, 5
      Print *, a(i)
   end do
   
end subroutine printArray

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

1
2
3
4
5

ในตัวอย่างข้างต้นรูทีนย่อย fillArray และ printArray สามารถถูกเรียกด้วยอาร์เรย์ที่มีมิติ 5 เท่านั้นอย่างไรก็ตามในการเขียนรูทีนย่อยที่สามารถใช้สำหรับอาร์เรย์ทุกขนาดคุณสามารถเขียนซ้ำได้โดยใช้เทคนิคต่อไปนี้ -

program arrayToProcedure      
implicit  none    

   integer, dimension (10) :: myArray  
   integer :: i
   
   interface 
      subroutine fillArray (a)
         integer, dimension(:), intent (out) :: a 
         integer :: i         
      end subroutine fillArray      

      subroutine printArray (a)
         integer, dimension(:) :: a 
         integer :: i         
      end subroutine printArray   
   end interface 
   
   call fillArray (myArray)      
   call printArray(myArray)
   
end program arrayToProcedure


subroutine fillArray (a)      
implicit none      
   integer,dimension (:), intent (out) :: a      
   
   ! local variables     
   integer :: i, arraySize  
   arraySize = size(a)
   
   do i = 1, arraySize         
      a(i) = i      
   end do  
   
end subroutine fillArray 


subroutine printArray(a)
implicit none

   integer,dimension (:) :: a  
   integer::i, arraySize
   arraySize = size(a)
   
   do i = 1, arraySize
     Print *, a(i)
   end do
   
end subroutine printArray

โปรดทราบว่าโปรแกรมกำลังใช้ไฟล์ size เพื่อรับขนาดของอาร์เรย์

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

1
2
3
4
5
6
7
8
9
10

ส่วนอาร์เรย์

จนถึงตอนนี้เราได้อ้างถึงอาร์เรย์ทั้งหมดแล้ว Fortran ให้วิธีง่ายๆในการอ้างถึงองค์ประกอบต่างๆหรือส่วนของอาร์เรย์โดยใช้คำสั่งเดียว

ในการเข้าถึงส่วนอาร์เรย์คุณต้องระบุส่วนล่างและด้านบนของส่วนรวมทั้งการก้าว (ส่วนเพิ่ม) สำหรับมิติทั้งหมด สัญกรณ์นี้เรียกว่าsubscript triplet:

array ([lower]:[upper][:stride], ...)

เมื่อไม่มีการกล่าวถึงขอบเขตล่างและบนจะมีค่าเริ่มต้นเป็นขอบเขตที่คุณประกาศและค่าก้าวย่างจะมีค่าเริ่มต้นเป็น 1

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงแนวคิด -

program arraySubsection

   real, dimension(10) :: a, b
   integer:: i, asize, bsize
   
   a(1:7) = 5.0 ! a(1) to a(7) assigned 5.0
   a(8:) = 0.0  ! rest are 0.0 
   b(2:10:2) = 3.9
   b(1:9:2) = 2.5
   
   !display
   asize = size(a)
   bsize = size(b)
   
   do i = 1, asize
      Print *, a(i)
   end do
   
   do i = 1, bsize
      Print *, b(i)
   end do
   
end program arraySubsection

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

5.00000000    
5.00000000    
5.00000000    
5.00000000    
5.00000000    
5.00000000    
5.00000000    
0.00000000E+00
0.00000000E+00
0.00000000E+00
2.50000000    
3.90000010    
2.50000000    
3.90000010    
2.50000000    
3.90000010    
2.50000000    
3.90000010    
2.50000000    
3.90000010

Array Intrinsic Functions

Fortran 90/95 มีขั้นตอนภายในหลายขั้นตอน สามารถแบ่งออกเป็น 7 ประเภท

  • การคูณเวกเตอร์และเมทริกซ์

  • Reduction

  • Inquiry

  • Construction

  • Reshape

  • Manipulation

  • Location