Compiler errors 错误无法分配给命名常量
我用Fortran编写了一个非常简单的程序:Compiler errors 错误无法分配给命名常量,compiler-errors,fortran,Compiler Errors,Fortran,我用Fortran编写了一个非常简单的程序: parameter(m_box=7) ! Number of urns (not a real parameter) parameter(max_dens=4) ! Maximum density computed parameter(beta=4.5) real*8 p(0:m_box*max_dens),mbeta,xnorm real*8 hist(0:m_box*(m
parameter(m_box=7) ! Number of urns (not a real parameter)
parameter(max_dens=4) ! Maximum density computed
parameter(beta=4.5)
real*8 p(0:m_box*max_dens),mbeta,xnorm
real*8 hist(0:m_box*(max_dens**2),0:(max_dens*m_box)**2)
real*8 Pi(0:(max_dens*m_box)**2)
integer sum2,sumq
n_balls=m_box*max_dens
n2_balls=m_box*(max_dens**2)
nq_balls=(m_box*max_dens)**2
n2half=(int(sqrt(n2_balls/2.))+1)**2 ! Valore massimo per il quale ho tutta la statistica
mbeta=-beta
freq=log(20.)
xnorm=0.
do n=0,n_balls
p(n)=(n+1.)**mbeta ! Urns
xnorm=xnorm+p(n)
enddo
do n=0,n_balls
p(n)=p(n)/xnorm
enddo
do i=0,n2_balls
do j=0,nq_balls
pi(i)=0
hist(i,j)=0
enddo
enddo
do n1=0,n_balls
do n2=0,n_balls
do n3=0,n_balls
do n4=0,n_balls
do n5=0,n_balls
do n6=0,n_balls
do n7=0,n_balls
sum2=n1**2+n2**2+n3**2+n4**2+n5**2+n6**2+n7**2
sumq=(n1+n2+n3+n4+n5+n6+n7)**2
if(sum2 .le. n2_balls .and. sumq .le. nq_balls)hist(sum2,sumq)=
& hist(sum2,sumq)+p(n1)*p(n2)*p(n3)*p(n4)*p(n5)*
& p(n6)*p(n7)
if((sum2 .eq. n2half) .and. (sumq .eq. nq_balls))Pi(n1)=
& Pi(n1)+p(n1)*p(n2)*p(n3)*p(n4)*p(n5)*
& p(n6)*p(n7)!*p(n8)*p(n9)*p(n10)
enddo
enddo
enddo
enddo
enddo
enddo
write(102,*)n1,Pi(n1)
enddo
sumhist=0
do i=0,n2_balls
do j=0,nq_nqballs
sumhist=sumhist+hist(i,j)
if(hist(i,j).ne.0)write(100,*)i,hist(i,j)
if(hist(i,j).ne.0)write(101,*)1.*i/m_box,-log(1d0*hist(i,j))/m_box
enddo
enddo
print*,'Normalizzazione della P = ',sumhist
end
当我编译时,我得到一个错误:
ERROR CANNOT ASSIGN TO A NAMED CONSTANT f:45:55.
我确实犯了一个愚蠢的错误,但我不知道在哪里。我很确定if语句是正确的,因为我在另一个程序中使用了它,它起了作用。您正在混合制表符和空格。在Fortran中不能这样做,在固定格式Fortran中也不能这样做。将选项卡转换为空格后,我的编辑器中的代码是这样的:
do n1=0,n_balls
do n2=0,n_balls
do n3=0,n_balls
do n4=0,n_balls
do n5=0,n_balls
do n6=0,n_balls
do n7=0,n_balls
sum2=n1**2+n2**2+n3**2+n4**2+n5**2+n6**2+n7**2
sumq=(n1+n2+n3+n4+n5+n6+n7)**2
if(sum2 .le. n2_balls .and. sumq .le. nq_balls)hist(sum2,sumq)=
& hist(sum2,sumq)+p(n1)*p(n2)*p(n3)*p(n4)*p(n5)*
& p(n6)*p(n7)
if((sum2 .eq. n2half) .and. (sumq .eq. nq_balls))Pi(n1)=
& Pi(n1)+p(n1)*p(n2)*p(n3)*p(n4)*p(n5)*
& p(n6)*p(n7)!*p(n8)*p(n9)*p(n10)
enddo
enddo
您可以看到,第一个与符号和缩进错误
必须将所有制表符转换为空格,并且不得再次使用制表符。此外,还必须修复缩进。有几行可能太长,您必须打断它们
将编辑器设置为在按TAB键时使用空格。哪一行是引用行?我想这应该是固定格式的源代码,所以请仔细注意您呈现的代码的格式:您可能需要进一步缩进,但实际上这不是有效的代码。请使用一些空格。代码很可怕,几乎不可读。很难检查错误。例如if(hist(i,j).ne.0)write(100,*)i,hist(i,j)
至少应该是if(hist(i,j).ne.0)write(100,*)i,hist(i,j)
。我会在那里放更多的空间。还可以使用空格缩进嵌套的do循环。@francescalus我认为Stackoverflow在复制粘贴时会占用几个空格,并将它们视为代码块的缩进,而不是代码块本身内部的缩进。@VladimirF是的,很可能这个代码块只需要在每行上放回四个空格。我只是不愿意在没有确认帖子所有者是否打算将其作为固定格式源(自由格式的中断继续可能是问题所在)的情况下这样做。我回滚了您的编辑。它没有使任何有用的东西,但使代码更加缩进。你的“符号”的位置完全错了。