Pascal收银程序出现Range check error错误,请求排查问题
Pascal收银程序Range Check Error问题排查
错误原因
你遇到的Range check error核心原因是变量y在每次循环中持续自增,而gotoxy函数的行参数不能超过终端屏幕的最大行数(默认通常为25行)。当y的值超出屏幕可用行数范围时,就会触发越界错误。
此外还有两个潜在问题:
- 若直接回车输入空的
kode,jumlah的输入步骤会被跳过,但jumlah会保留之前的残留值,可能导致计算异常 - 未处理用户输入非整数到
jumlah的情况,会触发输入格式错误
修复后的代码
uses crt; var harga, jumlah, total, totalCost: integer; nama, kode: string; y : integer = 3; maxScreenRows: integer; // 存储屏幕最大行数 begin clrscr; maxScreenRows := screenheight; // 获取当前屏幕的实际行数 repeat gotoxy(50, 1); write('TOKO AMANAH MURAH'); gotoxy(50, 3); write('Nama Item | Jumlah Barang | Total'); gotoxy(1,4);write('Kode barang : ');readln(kode); // 输入空kode时直接退出循环,避免后续错误 if kode = '' then break; gotoxy(1,5);write('Jumlah barang : '); // 处理非整数输入,循环直到输入有效 while not TryStrToInt(readln, jumlah) do begin gotoxy(1,6); write('输入无效,请输入数字!'); gotoxy(1,5); write('Jumlah barang : '); end; gotoxy(1,6); write(' '); // 清除错误提示 if kode = 'susu' then begin nama := 'SUSU KOTAK'; harga := 2000; end else if kode = 'kopi' then begin nama := 'Kopi Cair' ; harga := 3000; end else begin nama:= 'Invalid'; harga := 0; end; total := harga * jumlah; totalCost := totalCost + total; // 检查y是否超过屏幕最大行数,超过则重置到列表起始行 y := y + 1; if y >= maxScreenRows - 1 then // 留一行固定显示总计 y := 4; gotoxy(50, y); write(nama , ' | ' , jumlah , ' | Rp' , total); gotoxy(50, maxScreenRows - 1); write('Total: Rp', totalCost); until kode = ''; end.
关键修复点
- 通过
screenheight获取屏幕实际行数,当y接近屏幕底部时重置到列表起始行,避免gotoxy行参数越界 - 提前判断空
kode并直接退出循环,跳过jumlah输入步骤,避免使用残留值 - 用
TryStrToInt处理jumlah的非整数输入,避免输入格式错误 - 将总计固定显示在屏幕倒数第二行,防止被滚动的列表覆盖
内容的提问来源于stack exchange,提问作者RexGuard
相关产品推荐
相关产品推荐

