如果交换cntCaseTbl(Z:Int64):Int64,则下限超过上限和重复案例标签:Int64;案例表中出错

dpiehjr4  于 2022-09-21  发布在  其他
关注(0)|答案(1)|浏览(241)

我在以下代码中收到以下错误:
下限超过上限

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

重复案例标签

我能做什么?

我尝试了所有不带Int64()和带Int64()的方法,但都没有用。

你自己试试吧,不管你输入CAST与否,错误都是存在的。

下面有几种方法可以做到这一点,但我想知道为什么这段代码会出错:

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;
lrpiutwd

lrpiutwd1#

在第131行,1000000000099999999999是类型转换为Int64Integer,它们都在Integer的范围之外,因此它们在转换之前溢出,从而导致第一个值小于第二个值,因此出现错误。

其他线路也是如此。

这在Delphi的文档中进行了描述:

案例语句
CASE语句可以为深度嵌套的IF条件语句提供一种可读的替代方法。CASE语句的格式为:

case selectorExpression of
  caseList1: statement1;
   ...
  caseListn: statementn;
end

其中选择器表达式是序数类型小于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;

相关问题