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

在fortran90中填充大小未知的数组,fortran,gfortran,fortran90,Fortran,Gfortran,Fortran90,我想用fortran90填充一个大小未知的数组。 这是MATLAB中的等效代码: for i=1:10 A[i] = i end 我知道我可以通过这个尺寸,但是 在fortran90中如何在不传递数组大小的情况下执行此操作。我读到我们可以使用指针,但我真的不知道如何处理指针。我知道您想在知道数组的最终大小之前开始向数组添加元素 例如,您希望从文件中读取值,直到到达文件末尾,而不知道有多少值 我可以想到三种方法: 创建一个足够大的数组,并记住最终值 integer :: a(200), n n

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

for i=1:10
 A[i] = i
end
我知道我可以通过这个尺寸,但是
在fortran90中如何在不传递数组大小的情况下执行此操作。我读到我们可以使用指针,但我真的不知道如何处理指针。我知道您想在知道数组的最终大小之前开始向数组添加元素

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

我可以想到三种方法:

  • 创建一个足够大的数组,并记住最终值

    integer :: a(200), n
    n = 1
    do
        a(n) = <value>
        if (<finished>) exit
        n = n + 1
    end do
    
    <use a(1:n)>
    
    整数::a(200),n n=1 做 a(n)= 如果()退出 n=n+1 结束
  • 创建两个可分配阵列,当到达其中一个阵列的末端时,将另一个阵列变大,然后交换它们:

    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)
    
    integer,可分配::a(:),tmp(:)
    整数::i,n
    n=8
    分配(a(n))
    i=1
    做
    如果(i>n),那么
    分配(tmp(2*n))
    tmp(1:n)=a(:)
    呼叫移动分配(tmp,a)
    n=n*2
    如果结束
    a(i)=
    如果()退出
    i=i+1
    结束
    分配(tmp(i))
    tmp(:)=a(1:i)
    呼叫移动分配(tmp,a)
    
  • 创建链接列表(此处使用堆栈)

    类型t\u节点
    整型::值
    类型(t_节点),指针::next=>NULL()
    端型t_节点
    类型(t_节点),指针::列表,tmp
    整数,可分配::a(:),i,n
    取消(列表)
    无效(tmp)
    做
    分配(tmp)
    tmp%值=
    tmp%next=>list
    列表=>tmp
    无效(tmp)
    如果()退出
    n=n+1
    结束
    分配(a(n))
    i=n,1,-1吗
    a(i)=列表%值
    tmp=>list
    list=>list%下一步
    解除分配(tmp)
    结束
    

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

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

    我可以想到三种方法:

  • 创建一个足够大的数组,并记住最终值

    integer :: a(200), n
    n = 1
    do
        a(n) = <value>
        if (<finished>) exit
        n = n + 1
    end do
    
    <use a(1:n)>
    
    整数::a(200),n n=1 做 a(n)= 如果()退出 n=n+1 结束
  • 创建两个可分配阵列,当到达其中一个阵列的末端时,将另一个阵列变大,然后交换它们:

    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)
    
    integer,可分配::a(:),tmp(:)
    整数::i,n
    n=8
    分配(a(n))
    i=1
    做
    如果(i>n),那么
    分配(tmp(2*n))
    tmp(1:n)=a(:)
    呼叫移动分配(tmp,a)
    n=n*2
    如果结束
    a(i)=
    如果()退出
    i=i+1
    结束
    分配(tmp(i))
    tmp(:)=a(1:i)
    呼叫移动分配(tmp,a)
    
  • 创建链接列表(此处使用堆栈)

    类型t\u节点
    整型::值
    类型(t_节点),指针::next=>NULL()
    端型t_节点
    类型(t_节点),指针::列表,tmp
    整数,可分配::a(:),i,n
    取消(列表)
    无效(tmp)
    做
    分配(tmp)
    tmp%值=
    tmp%next=>list
    列表=>tmp
    无效(tmp)
    如果()退出
    n=n+1
    结束
    分配(a(n))
    i=n,1,-1吗
    a(i)=列表%值
    tmp=>list
    list=>list%下一步
    解除分配(tmp)
    结束
    

  • 按照我理解你的问题的方式,你有一个子例程需要填充一个数组,但是这个数组的大小未知,你不想传递这个大小。所以你不想这样:

    SUBROUTINE FILL( A, N )
        INTEGER N
        INTEGER A(N)
        INTEGER I
        DO I=1,N
            A(I) = I
        END DO
    END SUBROUTINE FILL
    
    相反,您希望获得数组的
    大小

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

    按照我理解你的问题的方式,你有一个子例程需要填充一个数组,但是这个数组的大小未知,你不想传递这个大小。所以你不想这样:

    SUBROUTINE FILL( A, N )
        INTEGER N
        INTEGER A(N)
        INTEGER I
        DO I=1,N
            A(I) = I
        END DO
    END SUBROUTINE FILL
    
    相反,您希望获得数组的
    大小

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


    你知道可分配数组吗?可能重复的Nopm我不知道如何分配你知道可分配数组吗?可能重复的Nopm我不知道如何分配让我们不要忘记
    a=[a,i]
    。等等,什么?你在开我玩笑吗?对于
    a
    一个分配的可分配整数数组,它可能最接近这个问题的MATLAB。我的片段只是一个数组构造函数,在内部赋值时自动重新分配(当然不是F90,但也不是
    move\u alloc
    )。谢谢你的回答,我不知道什么是分配,但我会尝试弄清楚如果你以前从未使用过可分配数组,请查看以下信息:--哦,不要使用指针(就像在我的第三个选项中)直到你确切知道你在做什么。指针可能会非常混乱。我们不要忘记
    a=[a,i]
    。等等,什么?你在开我玩笑吗?对于
    a
    一个分配的可分配整数数组,它可能最接近这个问题的MATLAB。我的片段只是一个数组构造函数,在内部赋值时自动重新分配(当然不是F90,但
    move\u alloc
    )。谢谢你的回答,我不知道什么是分配,但我会尝试找出它。如果你以前从未使用过可分配数组,请查看以下信息:---哦,不要使用指针(如我的第三个选项)直到你确切知道你在做什么。指针可能会非常混乱。我不理解第二个代码,你在
    do
    循环中获取数组的大小是什么意思,循环在
    i.GT.size(A)时结束
    SIZE
    是一个Fortran内部函数,返回数组的维数。哦,好吧,我明白了!我不明白第二个代码,你说在
    do
    循环中获取数组的大小是什么意思,循环在
    i.GT.SIZE(a)时结束
    SIZE
    是一个Fortran内部函数,返回数组的维数。哦,好的,我知道了!