从下面的代码可以看出,当它询问您是继续还是停止程序时,按“;”等其他键。或“,”它读起来好像你按下了“Y”或“y”键,但你没有。所以,我在问这是编译器中的错误,还是代码的问题?
program vols
!Calculates difference in volume of 2 spheres
implicit none
real :: rad1,rad2,vol1,vol2
character :: response
do
print *, 'Please enter the two radii'
read *, rad1,rad2
call volume(rad1,vol1)
call volume(rad2,vol2)
write(*,10) 'The difference in volumes is, ',abs(vol1-vol2)
10 format(a,2f10.3)
print *, 'Any more? - hit Y for yes, otherwise hit any key'
read *, response
if (response /= 'Y' .and. response /= 'y') stop
end do
end program vols
!________________________________________________
subroutine volume(rad,vol)
implicit none
real :: rad,vol,pi
!calculates the volume of a sphere
pi=4.0*atan(1.0)
vol=4./3.*pi*rad*rad*rad
!It's a little quicker in processing to do r*r*r than r**3!
end subroutine volume
最佳答案
如果没有关于您的确切输入的更多详细信息,我们无法断定这是 gfortran 中的错误。相反,程序的一个特性可能会导致“混淆”行为。
为了获得响应,程序使用列表导向的输入。这会导致不直观的结果。例如,对于 someone writing a calculator ,当有人输入 *
或 /
时会发生什么可能会令人惊讶。
在计算器示例中,*
涉及重复计数,/
涉及记录分隔符。对于这个问题,,
也有特殊的意义。在列表导向输入中 ,
是一个值分隔符,并且 read *, x
与该字符一起显示不会将 x
设置为值 ','
。
相反,输入语句
read *, response
当有输入时
,
将来到
,
并看到“哈哈,用户告诉我没有指定值”。这与空行形成对比,其中输入处理继续等待一个值。这个值分隔符与列表导向输入的另一个特性相结合:允许空值。空值完成输入语句,但保持相应的值不变(未设置为空白)。
这意味着如果输入像
1 1
y
1 1
,
在第二遍中,字符
response
与值 'y'
保持不变。同样,对于1 1
,
response
与其未定义状态保持不变:不允许程序将其值与 'y
'.如何解决这个问题?只需使用适当的格式:
read '(A)', response
这样,输入
,
被视为字符而不是值分隔符。尽管在问题的列表导向输入中以特殊方式处理逗号,但分号不是。如果您看到带有分号输入的意外行为,那么这可能会引起关注。我没有看到我可以使用的 gfortran 发生这种情况。
但是,分号可能很特殊。当十进制编辑模式是
COMMA
(而不是默认的 POINT
)时,分号被视为值分隔符而不是逗号(现在在 1,23
等值中充当小数分隔符)。 COMMA
不是连接的默认模式。关于fortran - 此代码是否演示了 GFortran 中的错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60189406/