我在下面的代码中得到了这个错误:
下限超过上限
如果你交换它们,你会得到一个不同的错误:
重复的案例标签
我能做什么?
我尝试过所有不使用Int64()
和使用Int64()
的方法,但都无济于事。
请自己尝试,无论是否键入强制转换,错误都会存在。
下面有几种方法可以做到这一点,但我想知道为什么这个代码会出现错误:
Delphi不能使用以下内容,因为它不能实现对case语句的64位处理
function cntCaseTbl(Z: Int64): Int64;
begin
case Abs(Z) of
0..9: Exit(1);
10..99: Exit(2);
100..999: Exit(3);
1000..9999: Exit(4);
10000..99999: Exit(5);
100000..999999: Exit(6);
1000000..9999999: Exit(7);
10000000..99999999: Exit(8);
100000000..999999999: Exit(9);
1000000000..9999999999: Exit(10);
10000000000..99999999999: Exit(11);
100000000000..999999999999: Exit(12);
1000000000000..9999999999999: Exit(13);
10000000000000..99999999999999: Exit(14);
100000000000000..999999999999999: Exit(15);
1000000000000000..9999999999999999: Exit(16);
10000000000000000..99999999999999999: Exit(17);
100000000000000000..999999999999999999: Exit(18);
1000000000000000000..9223372036854775807: Exit(19);
end;
end;
在第131行,10000000000
和99999999999
是正在类型广播到Int64
的Integer
,并且它们都在Integer
的范围之外,因此它们在广播之前溢出,从而导致第一个值小于第二个值,因此出现错误。
其他线路也是如此。
这在Delphi的文档中有描述:
案例说明
case语句可以为深度嵌套的if条件语句提供可读的替代方案。案例陈述的形式为:
case selectorExpression of caseList1: statement1; ... caseListn: statementn; end
其中selectorExpression是小于32位的序数类型的任何表达式(大于32位的字符串类型和序数无效(。。。
我建议完全去掉case
,只使用循环,例如:
function cntCaseTbl(Z: Int64): Int64;
begin
Result := 0;
Z := Abs(Z);
while Z > 0 do begin
Inc(Result);
Z := Z div 10;
end;
end;