在FOR的增量中非常奇怪的行为

时间:2012-10-08 15:23:54

标签: for-loop pascal freepascal

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

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变量在不应该被修改时被修改。

例如,我在ij上有一个监视,如果我在行table[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

依旧......

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

我发现的另一件事是,如果我改变i变量的TYPE,问题就解决了。 如果在VAR部分中我添加了i : integer而不是i : Range9,则i在不应该被修改时不会被修改。

如果有人解释我为什么会这样,我真的很感激。

2 个答案:

答案 0 :(得分:1)

我找到了自己问题的答案......好吧,我没有找到答案,我在我参加的编程课程的论坛板上问了同样的问题,其中一个教授给了我这个链接:

(用西班牙语btw) http://www.fing.edu.uy/inco/cursos/prog1/pm/field.php/FAQ/Laboratorio#toc17

快速翻译:

对于定义为子范围的变量,会发生这种情况。原因不确定;但毫无疑问是调试器的实现错误。有一个'技巧'可以解决这个问题(虽然并非总是如此),以便能够在调试器上看到正确的值:

假设您的程序中有以下变量:

var anything: 1 .. 10;

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

var anything: 1..10;
    aux: integer;  { only for the debugger }

然后,当您定义调试器监视时,不应添加anything变量,而应添加以下表达式:

aux:= anything

aux变量可用于查看不同的变量,因此您只需要声明一个辅助变量。

在某些情况下,之前可能无效。另一种解决方案是将用子范围定义的所有变量的类型更改为整数,字符串,字符串等(视具体情况而定)仅用于调试并将其再次更改。

翻译结束。

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

答案 1 :(得分:0)

我有一段时间没有做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.

参考:ftp://ftp.freepascal.org/pub/fpc/docs-pdf/ref.pdf