' *'和' /'读取声明未在输入中识别

时间:2016-04-26 11:27:47

标签: fortran

我开始学习Fortran,我正在做一个小案例测试程序,用户输入两个实数并选择算术运算符(来自+ - * /)。当用户选择" *"

时,会出现以下错误
F6502 : read <con> - positive integer expected in repeat field

如果用户选择&#34; /&#34;编译器执行默认情况,并显示此消息

invalid operator, thanks
the result is 0.000000E+00

该计划如下。

program operateur
implicit none

   CHARACTER(LEN=1) :: oper 
   real::a,b,res
   print*,'Give the first number a :'
   read*,a
   print*,'Give the second number b :'
   read*,b
   print*,'which operation ?'
   read*,oper
   !print*,'donnez a,b,oper :'
  ! read(*,*)a,b,oper

               select case (oper)

                  case ('+')      
                  res=a+b

                  case ('-')       
                  res=a-b

                  case ('*')       
                  res=a*b


                  case ('/')       
                  res=a/b           

                  case default
                  print*, "Invalid Operator, thanks" 

               end select

   print*,'the result is ',res 

end program operateur

2 个答案:

答案 0 :(得分:7)

FORTRAN输入和输出格式规则相当复杂。每个输入和ouptut语句都有两个具有特殊含义的参数。例如

  READ (10,"(2I10)") m,n

第一个参数是文件描述符。这是10。第二个参数"(2I10)"格式说明符。如果您使用星号(*)作为格式说明符,则可以启用列表控制的格式化模式。

如名称所示,列出有向输入由输入运算符的参数列表控制。

1。为什么星号(*)在列表导向输入模式中是特殊的?

输入列表分为一个或多个输入记录。每个输入记录的格式为ck*ck*,其中c是文字常量,k是整数文字常量。例如,

  5*1.01

作为k*c方案的实例被解释为数字1.01

的5个副本
   5*

被解释为空输入记录的5个副本。

符号星号(*)在列表导向输入模式中具有特殊含义。某些编译器运行时会在列表导向输入中遇到没有整数常量的星号时报告运行时错误,其他编译器会读取星号。例如,GNU Fortran编译器因标准符合性而闻名,因此其运行时将接受*。其他编译器运行时可能会失败。

2。什么是斜杠(/)?

逗号(,),斜杠(/)和一个或多个空格()的序列在列表中被视为记录分隔符 - 指令输入模式。

在这种模式下,没有简单的方法可以自行输入斜杠。

3。可能的解决方案:明确指定格式

使运行时接受单斜杠或星号的方法是通过明确指定格式来离开列表导向的输入模式:

read (*,"(A1)") oper

应该允许您输入任何单个字符。

答案 1 :(得分:-1)

好的,那么正确的源代码是

program operateur
implicit none

CHARACTER(LEN=1) :: oper 
real::a,b,res
print*,'Give the first number a :'
read*,a
print*,'Give the second number b :'
read*,b
print*,'which operation ?'
read (*,"(A1)") oper


           select case (oper)

              case ('+')      
              res=a+b

              case ('-')       
              res=a-b

              case ('*')       
              res=a*b


              case ('/')       
              res=a/b           

              case default
              print*, "Invalid Operator, thanks" 

           end select

   print*,'the result is ',res 

end program operateur