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

时间:2017-07-11 04:50:28

标签: fortran gfortran fortran90

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

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

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

2 个答案:

答案 0 :(得分:2)

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

例如,您希望从文件读取值,直到到达文件末尾,而不知道有多少值。

我能想到三种方式:

  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
    

答案 1 :(得分:1)

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

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