在 fortran90 中填充未知大小的数组

Filling an array with unknown size in fortran90

我想在 fortran90 中填充一个大小未知的数组。 这是 MATLAB 中的等效代码:

for i=1:10
 A[i] = i
end

我知道我可以通过尺码,但是 我如何在不传递数组大小的情况下在 fortran90 中执行此操作。我读到我们可以使用指针,但我真的不知道如何处理指针

我知道您想在知道数组的最终大小之前开始向数组添加元素。

例如,您想从文件中读取值直到到达文件末尾,但不知道有多少个值。

我想到了三种方式:

  1. 创建一个足够大小的数组,并记住最后的值。

     integer :: a(200), n
     n = 1
     do
         a(n) = <value>
         if (<finished>) exit
         n = n + 1
     end do
    
     <use a(1:n)>
    
  2. 创建两个可分配数组,当你到达一个数组的末尾时,将另一个变大,然后交换它们:

     integer, allocatable :: a(:), tmp(:)
     integer :: i, n
     n = 8
     allocate(a(n))
     i = 1
     do
         if (i > n) then 
             allocate(tmp(2*n))
             tmp(1:n) = a(:)
             call move_alloc(tmp, a)
             n = n * 2
         end if
         a(i) = <value>
         if (<finished>) exit
         i = i + 1
     end do
     allocate(tmp(i))
     tmp(:) = a(1:i)
     call move_alloc(tmp, a)
    
  3. 我不再推荐这个了。指针可能会造成混淆并产生奇怪且难以调试的错误。但我将其留给后代:创建一个链表(此处使用堆栈)

     type t_node
         integer :: value
         type(t_node), pointer :: next => NULL()
     end type t_node
    
     type(t_node), pointer :: list, tmp
     integer, allocatable :: a(:), i, n
    
     nullify(list)
     nullify(tmp)
    
     do
          allocate(tmp)
          tmp % value = <value>
          tmp % next => list
          list => tmp
          nullify(tmp)
          if (<finished>) exit
          n = n + 1
     end do
     allocate(a(n))
     do i = n, 1, -1
         a(i) = list % value
         tmp => list
         list => list % next
         deallocate(tmp)
     end do
    

我读你的问题的方式,你有一个子程序需要填充一个数组,但该数组的大小未知,你不想传入大小。所以你不想要这个:

SUBROUTINE FILL( A, N )
    INTEGER N
    INTEGER A(N)
    INTEGER I
    DO I=1,N
        A(I) = I
    END DO
END SUBROUTINE FILL

相反,您想获取数组的 SIZE

SUBROUTINE FILL( A )
  INTEGER A(:)
  INTEGER I
  DO I=1,SIZE(A)
     A(I) = I
  END DO
END SUBROUTINE FILL