GnuCOBOL v2.2使用疑问:命令行输入、清屏及INTEGER-OF-DATE异常
解答你的COBOL自学疑问
嘿,刚上手COBOL就碰到这些细节问题太正常了,我来帮你逐个捋清楚:
1. 在线平台(TutorialsPoint/JDoodle)如何输入内容
GnuCOBOL本身用ACCEPT语句接收用户输入,但在线平台的交互逻辑和本地命令行不一样——它们不是实时的交互式窗口,你需要在运行代码前,把要输入的内容提前填到平台提供的「输入框」里(一般在代码编辑区下方或侧边栏)。比如你的代码里有ACCEPT DATA1,就把目标数值写在输入框中,运行时程序会自动读取这里的内容。如果是本地安装的GnuCOBOL,编译后直接在命令行运行程序,就能实时输入了。
2. 清理终端的替代方案
DISPLAY WINDOW ERASE是COBOL针对图形界面窗口的扩展命令,GnuCOBOL v2.2并没有实现这个功能,所以会报错。你可以用终端原生的清屏方式:
- 如果你用的是Linux/macOS终端,或者支持ANSI转义序列的窗口,直接用ANSI清屏码:
DISPLAY X"1B[2J" - 或者调用系统命令(跨平台通用):
*> Windows系统清屏 CALL "SYSTEM" USING "cls" *> Linux/macOS系统清屏 CALL "SYSTEM" USING "clear"
3. INTEGER-OF-DATE函数返回0的问题
这个问题的核心是函数参数格式不匹配:INTEGER-OF-DATE要求输入的日期必须是8位的YYYYMMDD格式,但你的代码里DATA1和DATA2都是6位的YYMMDD(比如180516对应20180516),函数无法识别这种格式,所以返回0。
修改方案如下:
- 把日期变量改成8位长度
- 获取系统日期时指定YYYYMMDD格式(GnuCOBOL支持这个扩展语法)
- 手动补全固定日期的年份为4位
修改后的代码:
WORKING-STORAGE SECTION. 77 DATA1 PIC 9(08). *> 改为8位存储YYYYMMDD 77 DATA2 PIC 9(08) VALUE 19930217. *> 补全为4位年份的完整日期 77 INTEIRO-1 PIC 9(08). 77 INTEIRO-2 PIC 9(08). 77 DIAS PIC 9(05). PROCEDURE DIVISION. ACCEPT DATA1 FROM DATE YYYYMMDD *> 以YYYYMMDD格式获取系统日期 MOVE FUNCTION INTEGER-OF-DATE (DATA1) TO INTEIRO-1 MOVE FUNCTION INTEGER-OF-DATE (DATA2) TO INTEIRO-2 COMPUTE DIAS = INTEIRO-2 - INTEIRO-1 DISPLAY X"0A" DATA1 " " DATA2 DISPLAY INTEIRO-1 " " INTEIRO-2 DISPLAY "DIAS: " DIAS
这样修改后,函数就能正确计算日期对应的整数,进而算出两个日期的天数差了。
内容的提问来源于stack exchange,提问作者Humberto Fialho
相关产品推荐
相关产品推荐

