For loop 在a的增量中有非常奇怪的行为

For loop 在a的增量中有非常奇怪的行为,for-loop,pascal,freepascal,For Loop,Pascal,Freepascal,当我使用这2来初始化二维向量/数组时,我遇到了一个问题: 我定义了以下类型: type Range9 = 0..8; Digit = '0'..'9'; Board = array [Range9,Range9] of Digit; 然后,FOR出现问题的代码部分如下所示: var i : Range9; j : Range9; table : Board; BEGIN for i:=0 to 8 do begin for j

当我使用这2来初始化二维向量/数组时,我遇到了一个问题: 我定义了以下类型:

type
  Range9         = 0..8;
  Digit         = '0'..'9';
  Board    = array [Range9,Range9] of Digit;
然后,FOR出现问题的代码部分如下所示:

var
  i : Range9;
  j : Range9;
  table : Board;
BEGIN

for i:=0 to 8 do begin
  for j:=0 to 8 do begin
    table[i,j] := '0'
  end
end;

END.
现在的问题是,当我调试这部分代码时,出于某种原因,
I
变量在不应该修改的时候被修改了

例如,我在
I
j
上有一块手表,如果我在
表[I,j]的行中放置一个断点:=0
我在手表上看到了这些值:

i    j
0    0
256  1
512  2
768  3
1024 4
1280 5
1536 6
1792 7
2048 8
2049 8
1    0
257  1
513  2
769  3
等等

因此,当程序进入第二个for(增加
j
的程序)时,我的
i
以256的间隔增加。。。我真的不知道为什么会这样

我发现的另一件事是,如果我改变
I
变量的类型,问题就解决了。 如果我在VAR部分中输入了
I:integer
而不是
I:Range9
I
在不应该修改时不会被修改


如果有人能向我解释为什么会发生这种情况,我将不胜感激。

我已经有一段时间没有做Pascal了,所以我可能有点生疏了。我所能想到的唯一一件事就是造成你的问题是你创建了一个字符范围,它被解释为字节数组,然后被转换成一个数字,然后相乘,这给了你那些奇怪的值。但是,我可能错了。我不熟悉FreePascal

Type
    Range9 = 0..8
    Board = Array[Range9,Range9] of Integer;
var
A : Board;
I,J : Integer;
begin
  For I:=0 to 8 do
    For J:=0 to 8 do
       A[I,J]:=I*J;
end.

参考资料:

我找到了我自己问题的答案。。。嗯,我没有找到确切的答案,我在参加编程课程的论坛板上问了同样的问题,一位教授给了我这个链接:

(顺便说一句,是西班牙语)

快速翻译:

这在定义为子范围的变量中发生。原因不明;但毫无疑问,这是调试器的一个实现错误。有一个“技巧”可以解决这一问题(尽管并不总是如此),即能够在调试器上看到正确的值:

假设程序中有以下变量:

var anything: 1 .. 10;
在程序中添加一个整数变量,该变量不会在程序的任何部分中使用:

var anything: 1..10;
    aux: integer;  { only for the debugger }
然后,在定义调试器监视时,不应添加
anything
变量,而应添加以下表达式:

aux:= anything
aux变量可用于查看不同的变量,因此只需声明一个aux变量

在某些情况下,前一种方法可能不起作用。另一种解决方案是,仅在调试时将使用子范围定义的所有变量的类型更改为integer、char、string等(取决于具体情况),然后再次更改

翻译结束。

希望这对其他面临同样错误的人有用。
顺便说一句,这是在免费的pascal IDE 2.2.2的调试器中发生的,可能在pascal的另一个IDE/编译器/调试器中不会发生。

但是Range9是整数的子范围,只有整数(0,1,2,3,4,5,6,7,8)但仍然是整数。在我使用char的唯一部分是with table中,第二部分中如何可能修改
I
?更奇怪的是,在这段代码的执行结束时,我得到了表数组,所有元素都设置为“0”。所以也许问题出在手表上?正如我之前所说,我没有;我一时没用帕斯卡。所以,我不确定你为什么会得到那个奇怪的乘法错误。但是,我知道为什么表数组中的所有元素都被设置为0。请参见此行:
表[i,j]:=“0”
。该行在遍历数组时将表中的每个值都设置为0。理想情况下,您实际上想要这个:
表[i,j]:=i*j
,或者类似的东西。也许我解释错了。是的,我希望表元素的所有值都设置为“0”。关于乘法i*j,我不知道你从哪里得到的(不要误解我,我没有对上一次说:D)无论如何,我已经找到了为什么会发生这种情况的答案,这是调试器的问题,事实上,
i
有正确的值,但手表显示不正确。无论如何,谢谢你花时间帮助我。