【问题标题】:Runtime Error 201 at fpcfpc 上的运行时错误 201
【发布时间】:2013-12-01 18:49:16
【问题描述】:

我一直在写一个关于猜数字的游戏,我必须将一个 4 位数字分隔成它的数字并将数字放入一个数组中。但是,该部分使用 fpc 时不断给我运行时错误 201。但是当我使用 ideone.com 时它给了我想要的东西。我不知道。这可能是一个错误吗?对不起我的英语。

program game;
var
    number : array [1..4] of integer;
    z, i, j: integer;
    number_4digit: integer;
begin
     readln(number_4digit);
     for i := 4 downto 1 do begin
        j := i;
        z := number_4digit;
        while z > 10 do begin
            z := z div 10;
     end;   
     number[5-i] := z;
     repeat
           z := z * 10;
           j := j - 1;
     until j = 1;
     number_4digit:= number_4digit - z;
     write(number[5-i], ' ');  
end;    
end.

编辑:我解决了问题。感谢 Marco van de Voort。

repeat
      z := z * 10;
      j := j - 1;
until j = 1;

我把这个部分改成了这个。

while j > 1 do begin
 z := z * 10;
     j := j - 1;
end;    

【问题讨论】:

    标签: runtime-error pascal freepascal


    【解决方案1】:

    运行时错误 201 是范围检查错误。

    使用-gl 编译,您将看到程序在运行时错误中崩溃的位置。这是第 16 行 (z := z * 10;),这意味着您的 z 正在溢出。请注意,integer 是 FPC 中的有符号 16 位类型(最大 2^15 - 1 = 32767)。

    【讨论】:

    • 啊,不错。我忘记了 FPC 默认仍默认为 16 位有符号整数;我使用 Delphi,默认情况下在 32 位平台上使用 32 位整数。
    • 而溢出的原因是因为在for i循环结束时j = 1。所以当它进入repeat-until循环时,它会循环,我猜是65534次——所以程序试图将z乘以10^65534。
    • 好吧,为什么它会循环 65534?j = 1 应该循环 12 次吗?很抱歉,我是编程和帕斯卡的初学者。
    • 我知道可能为时已晚,但这就是为什么:在重复循环之前,您的 i = 1。然后,从中减去 1,使其为 0。而且,由于 0 不等于为一,程序不断减法。并且有 65534 个可能的整数值(从 -2^8 到 2^8-1),i 在每个可能的值中变化。
    【解决方案2】:
    1. 在 for 循环之后 J 始终为 1。
    2. 然后在重复循环中递减(到 j=0)。
    3. 它不等于 1,因此它再次减小到 -1 直到 -32768,然后滚动到 32767
    4. 然后进一步 32767 到 1。

    总的来说,重复完成了 65536 +/-1 次。从代码中我不清楚 J 变量的含义。更多评论。

    【讨论】:

    • 我在那里使用 j 作为计数器。该部分的代码用于数字值。我使用 while 循环而不是 repeat-until 循环解决了这个问题。因此避免了 j 的不等式。谢谢。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多