我想在fortran90中填充一个未知大小的数组。 这是MATLAB中的等效代码:
for i=1:10
A[i] = i
end
我知道我可以通过这个尺寸,但是 如何在没有传递数组大小的情况下在fortran90中执行此操作。我读到我们可以使用指针,但我真的不知道如何处理指针
答案 0 :(得分:2)
我知道你想在知道数组的最终大小之前开始向数组中添加元素。
例如,您希望从文件读取值,直到到达文件末尾,而不知道有多少值。
我能想到三种方式:
创建一个足够大小的数组,并记住最终值。
integer :: a(200), n
n = 1
do
a(n) = <value>
if (<finished>) exit
n = n + 1
end do
<use a(1:n)>
创建两个可分配数组,当你到达一个数组的末尾时,将另一个更大,并交换它们:
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)
创建链接列表(此处使用堆栈)
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