2

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

我试图通过变量countcount1在子例程中)控制嵌套级别。但是,当子例程自己调用时,count1第一次调用中不会保留 for 的值。我希望外部循环保留 1 的值,count1第二个循环保留count12 的值,以反映嵌套级别。

我不确定如何指定程序以便实现这一点。相反,当创建内部循环的调用返回到外部循环时,外部循环中的值count1已更改并反映了它在内部循环中的增量。

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
4

2 回答 2

4

制作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

PS 使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
...
于 2013-04-28T03:44:28.110 回答
-1

我认为(我已经 27 年没有做过 Fortran 了)Fortran 通过引用而不是值传递参数。

您需要的是每个递归调用都有自己的一组变量,并在您递归进出时回退。

这个GNU Fortran Doc状态

8.11.1 %VAL() 构造

%VAL(arg)

%VAL() 构造指定参数 arg 将按值传递,而不是按引用或描述符传递。

我注意到这实际上是针对外部定义的函数,以迎合那些用默认通过值传递的语言编写的函数。但我认为对于您的功能,您需要这样做。

CALL assigncell (%VAL(first_var), %VAL(second_var), ... %VAL(last_var))       

再说一次,我没有超过 F77 的 Fortran,所以我的研究和思考可能会离题。

于 2013-04-28T03:29:00.003 回答