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