“无法分配给命名常量”(重新分配变量)

问题描述 投票:0回答:3

我正在使用标志

f
进行一些错误检查。当我想执行另一次检查时,Fortran(或者可能是 gfortran)不会让我重新分配它的值。

integer, dimension(:,:), allocatable :: A
integer :: f, n        

write (*, *) "Give an integer n > 0. n = "

   read (*, IOSTAT=f) n

   do while(f /= 0)
      print *, "Error with input. Please try again."
      read (*, IOSTAT=f) n
   end do

   write (*, "(a, i5)") "You have entered n = ", n

   allocate(A(n), STAT=f)
   if (f /= 0) 
      print *, "Error: not enough memory for A."
   end if

注意:我认为复制粘贴可能会弄乱我的间距。

f
已被声明为整数(而不是参数整数):
integer :: f

我是 Fortran 的初学者,所以我很可能犯了一些难以想象的错误!

fortran gfortran
3个回答
8
投票

这个错误消息令人困惑,但问题是

   if (f /= 0) 
      print *, "Error: not enough memory for A."
   end if

应该是

   if (f /= 0) then
      print *, "Error: not enough memory for A."
   end if

0
投票
   implicit none
   integer :: f, n
   integer, dimension(:,:), allocatable :: A


   write (*, *) "Give an integer n > 0. n = "
   read (*, *, IOSTAT=f) n

   do while (f /= 0)
      print *, "Error with input. Please try again."
      read (*, IOSTAT=f) n
   end do

   write (*, "(a, i5)") "You have entered n = ", n

   allocate(A(n,n), STAT=f)
   if (f /= 0) then
      print *, "Error: not enough memory for A."
      !exit program. How do I do this?
   end if

这似乎有效。

(1) 正如 Vladimir F 指出的那样,Fortran 想要

if (<condition>) then <stuff> endif

(2)正如我在上面的评论中提到的,我应该写

allocate(A(n,n), STAT=f)

感谢您的所有帮助!这个答案只是为了完整性 - 弗拉基米尔是真正回答这个问题的人。


0
投票

@弗拉基米尔F.

谢谢。我遇到了同样的问题,但只需简单地将单词的排列更改为您编写的方式即可解决问题。我正在写:

如果 ( n == 1 ) 则调用 expTot

代替:

如果 ( n == 1 ) 那么 “新线路”致电 expTot

我不敢相信这么简单的文字排列真的会造成这么大的伤害。

© www.soinside.com 2019 - 2024. All rights reserved.