fortran - 此代码是否演示了 GFortran 中的错误?

标签 fortran gfortran

从下面的代码可以看出,当它询问你是继续还是停止程序时,按其他键,如“;”或“,”它读起来就像你按下了“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/

相关文章:

linux - 写入 fifo(命名管道)

ubuntu - 我想将 makefile 的编译器从 pgi 更改为 gfortran,我想知道如何更改 FC 和 FFLAGS 以使其工作

pointers - 通过指针访问类型后派生类型中 Fortran 字符串的奇怪行为

c - 将 Fortran 数组传递给 C

c++ - 同时安装ifort和icc

string - 在Fortran中读取带空格的字符串

f77 未格式化二进制文件的内容

c++ - MIXED_STR_LEN_ARG 与 gfortran

c - 无法链接到 libgfortran.a

makefile - 使用静态库进行编译的通用 Gfortran Makefile