在 fortran90 中填充未知大小的数组
Filling an array with unknown size in fortran90
我想在 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)>
创建两个可分配数组,当你到达一个数组的末尾时,将另一个变大,然后交换它们:
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
我读你的问题的方式,你有一个子程序需要填充一个数组,但该数组的大小未知,你不想传入大小。所以你不想要这个:
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
我想在 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)>
创建两个可分配数组,当你到达一个数组的末尾时,将另一个变大,然后交换它们:
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
我读你的问题的方式,你有一个子程序需要填充一个数组,但该数组的大小未知,你不想传入大小。所以你不想要这个:
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