gpt4 book ai didi

recursion - 如何防止在递归 Fortran 子例程中定义的变量在内部调用时更新?

转载 作者:行者123 更新时间:2023-12-04 04:59:59 25 4
gpt4 key购买 nike

使用以下代码,当变量 aa1等于 2,我希望递归子程序创建 2 个长度为 4(maxdev=4)​​的嵌套 do 循环。

我试图通过变量 count 控制嵌套级别( count1 在子程序中)。但是,当子程序被自身调用时,count1 的值不会在第一次调用中保留。我希望外循环保留 count1 的值1 和第二个循环具有 count1 的值2、体现嵌套层次。

我不确定如何指定程序以实现这一目标。相反,当创建内循环的调用返回到外循环时,count1 的值在外循环中已更改并反射(reflect)它在内循环中增加的内容。

program fragarrays
implicit none

integer::gridres,maxdev,a,count
integer, allocatable:: x(:)

open(unit=1,file='D:/output11.txt',status='unknown')

gridres=2

maxdev=gridres*gridres

do a = 1,2
count=0
allocate(x(a))
call assigncell(a,maxdev,count,x)
deallocate(x)
end do

contains

recursive subroutine assigncell(a1,maxdev1,count1,x1)
integer:: a1,maxdev1,b
integer::count1
integer,dimension(a1):: x1

count1=count1+1
do b=1,maxdev1
x1(count1)=b
write (1,*)count1,x1(count1),b,a1
if(count1.lt.a1)then
call assigncell (a1,maxdev1,count1,x1)
end if

end do

end subroutine assigncell

end program fragarrays

最佳答案

制作 count1一个局部变量而不是一个参数。它的变化是因为它隐含了一个 inout参数和调用应该改变它。作为局部变量,它对于子程序的每次调用都是唯一的。例如:

module MyMod
contains
recursive subroutine assigncell(a1,maxdev1,count1_arg,x1)
integer, intent (in):: a1,maxdev1
integer, intent (in)::count1_arg
integer,dimension(a1):: x1
integer :: count1, b

count1 = count1_arg
write (*, *) "entering subr. with", a1, count1
count1=count1+1
write (*, *) "changed to: a1, count1=", a1, count1
do b=1,maxdev1
x1(count1)=b
write (1,*)count1,x1(count1),b,a1
if(count1.lt.a1)then
call assigncell (a1,maxdev1,count1,x1)
end if

end do
write (*, *) "still at: a1, count1:", a1, count1

end subroutine assigncell

end module MyMod

program fragarrays
use MyMod
implicit none

integer::gridres,maxdev,a,count
integer, allocatable:: x(:)

open(unit=1,file='output11.txt',status='replace')

gridres=2

maxdev=gridres*gridres

do a = 1,2
count=0
allocate(x(a))
write (*, *) "calling with", a, count
call assigncell(a,maxdev,count,x)
deallocate(x)
end do


end program fragarrays

附言制作 count1 的另一种方法子程序局部参数:给该参数 VALUE属性:
...
recursive subroutine assigncell(a1,maxdev1,count1,x1)
integer, intent (in):: a1,maxdev1
integer, VALUE ::count1
integer,dimension(a1):: x1
integer :: b

write (*, *) "entering subr. with", a1, count1
...

关于recursion - 如何防止在递归 Fortran 子例程中定义的变量在内部调用时更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16259228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com