我在Fortran上编写了一个递归程序来计算npoints
个ndim
维的组合,如下所示。我首先在MATLAB上编写了这个程序,它运行得非常好。但是在Fortran中,我的问题是在第一次迭代之后,它为点列表分配了荒谬的值,没有任何解释。有人可以帮我一把吗?
PROGRAM MAIN
IMPLICIT NONE
INTEGER :: ndim, k, npontos, contador,i,iterate, TEST
integer, dimension(:), allocatable :: pontos
print*, ' '
print*, 'npoints?'
read *, npontos
print*, 'ndim?'
read *, ndim
k=1
contador = 1
open(450,file= 'combination.out',form='formatted',status='unknown')
write(450,100) 'Comb ','stat ',(' pt ',i,' ',i=1,ndim)
write(450,120) ('XXXXXXXXXX ',i=1,ndim+1)
allocate(pontos(ndim))
do i=1,4
pontos(i)=i
end do
TEST = iterate(pontos, ndim, npontos,k,contador)
end program MAIN
recursive integer function iterate(pontos, ndim, npontos, k,contador)
implicit NONE
integer, intent(in) :: ndim, k, npontos
integer,dimension(:) :: pontos
integer contador,inic,i,j,m
if (k.eq.ndim) then
inic=pontos(ndim)
do i = pontos(ndim),npontos
pontos(k)= i
write(*,*) pontos(:)
contador=contador+1
end do
pontos(ndim)= inic + 1
else
inic = pontos (k)
do j = pontos(k),(npontos-ndim+k)
pontos(k)=j
pontos= iterate(pontos, ndim, npontos, k+1,contador)
end do
end if
pontos(k)=inic+1;
if (pontos(k).gt.(npontos-ndim+k+1)) then
do m =k+1,ndim
pontos(m)=pontos(m-1)+1
end do
end if
end function iterate
答案 0 :(得分:1)
该代码中有太多问题......我停止了调试。这是我到目前为止所做的,这对评论来说太过分了。
这没有意义:
pontos= iterate(pontos, ndim, npontos, k+1,contador)
您正在更改pontos
内的iterate
,并且从不在函数中设置返回值。
您需要a)为递归函数提供结果语句(并实际设置它)或b)将其转换为子例程。由于您要修改至少一个伪参数,因此应使用b)。
由于您使用的是假定形状的伪参数,因此需要明确或使用模块指定函数/子例程的接口。
您的代码中未指定格式100
或格式120
。