Unicode 为什么每次子例程调用时计数器变量都会意外增加?
[社论:我读过,但(事后看来,它最终与这里的每一个问题都是相关的,即“为什么计算机会出现故障?”)这个答案并不是对我问题的回答。这个问题是问为什么一个标准机构会在语言中设计一个特定的特性。而且,这个答案并没有回答我的问题,我的问题是问我在调试这个问题时遗漏了什么。]Unicode 为什么每次子例程调用时计数器变量都会意外增加?,unicode,fortran,do-while,gfortran,Unicode,Fortran,Do While,Gfortran,[社论:我读过,但(事后看来,它最终与这里的每一个问题都是相关的,即“为什么计算机会出现故障?”)这个答案并不是对我问题的回答。这个问题是问为什么一个标准机构会在语言中设计一个特定的特性。而且,这个答案并没有回答我的问题,我的问题是问我在调试这个问题时遗漏了什么。] 问题:为什么下面显示的这个Fortran程序(ExtreaseVelisting.f08+unicodeSupport.f08)的输出表明Fortran的DO-WHILE有一个主要错误 下面是输出,后面是环境描述,最后是两个文件的源
问题:为什么下面显示的这个Fortran程序(ExtreaseVelisting.f08+unicodeSupport.f08)的输出表明Fortran的DO-WHILE有一个主要错误 下面是输出,后面是环境描述,最后是两个文件的源代码: 意外输出 十六进制现在为:2500H
2500─
2501━
2502│
2503┃
2504┄
2505┅
2506┆
2507┇
2508┈
2509┉
250A┊
250B┋
250摄氏度┌
250D┍
250E┎
250F┏
十六进制现在是:2510H
十六进制现在是:2520H
十六进制现在是:2530H
十六进制现在为:2540H
十六进制现在是:2550H
十六进制现在是:2560H
十六进制现在是:2570H
跑完;退出值为0;实时:530ms;用户:0毫秒;系统:0毫秒 预期产量 我希望每个“十六进制现在是:xxxxH”行之间有16行细节,例如打印在2500H和2510H行之间的细节 以前解决此问题的尝试 这个项目是我在一个更大的项目中试图解决的一个问题。由于该项目存在问题(其中一个问题是在Fortran中使用Unicode),我创建了这个项目来隔离Unicode问题。起初,我将微不足道的unicodeSupport模块与主程序合并在同一个文件中。我将其删除到自己的文件中。不,这不重要,也不影响结果。这个程序非常简单,我看不到任何可能出错的地方。因此,我来到SO,希望新的眼睛发现我的错误。否则,是时候向gFortran提交错误报告了 环境 我工作的环境是:
操作系统:Ubuntu 17.10 IDE:Netbeans 8.2 JDK:Oracle(版本1.8.0_161-b12) 编译器:gFortran 7.2.0 编译器标志:-std=f2008ts-fno不安全的数学优化-FRONING math-fsignaling NAN <强> > Geeo61 61:强:在BASIC,Pascal,FORTRAN,C,PROlog,C++,java等4个基础上发展(按我学习顺序顺序排序) Extravelisting.f08
此处声明的变量
计数器
INTEGER :: hex, counter=0, point
通过在初始化行上定义其值,具有save
属性
第二次输入子例程时,其值将为16,因此不会出现循环
从声明行中删除=0
,然后写入
counter = 0
之后。以后,如果您认为您在Fortran中发现了一个“主要错误”,请尽可能少地创建一个示例来说明同样的问题。@francescalus:这就是我试图做的。。。“最小”过于主观。。。这是我的最小。。你的眼睛会是什么样子?;)(在Fortran中,一个只有一个文件的项目是最小的,不是吗?)。“为什么这个Fortran程序的输出……如下所示表明Fortran的DO-WHILE有一个主要的bug?”不用担心。我同意“初始化意味着保存”并不是这些问题的一个直观来源(如果这真的是一个糟糕的问题,我会投反对票,不会回头看).不过,将困难的案例剥离到最低限度是一项非常有价值的技能。你的视野非常好。我很高兴这是我的错误。我讨厌提交错误报告。:)
INTEGER :: hex, counter=0, point
counter = 0