下限超过上限和重复案例标签,如果您交换它们 cntCaseTbl(Z : Int64): Int64;事例表中的错误



我在下面的代码中得到了这个错误:

下限超过上限

如果你交换它们,你会得到一个不同的错误:

重复的案例标签

我能做什么?

我尝试过所有不使用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行,1000000000099999999999是正在类型广播到Int64Integer,并且它们都在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;

相关内容

  • 没有找到相关文章

最新更新