0

当我使用这 2 个 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

等等...

因此,当程序进入第二个 for(增加 的那个j)时,我i的间隔增加了 256 ......我真的不知道为什么会发生这种情况。

我发现的另一件事是,如果我更改i变量的类型,问题就解决了。如果在 VAR 部分中我放置i : integeri : Range9, ,i则在不应该修改时不会被修改。

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

4

2 回答 2

1

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

(顺便说一句,它是西班牙语) 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变量可以用来查看不同的变量,所以只需要声明一个aux变量。

在某些情况下,前一个可能不起作用。另一种解决方案是将使用子范围定义的所有变量的类型更改为整数、字符、字符串等(视情况而定),仅用于调试,然后再次更改。

翻译结束。

希望这对面临同样错误的其他人有用。顺便说一句,这发生在 free pascal IDE 2.2.2 的调试器中,也许在另一个 IDE/compiler/debugger 的 pascal 中它不会发生。

于 2012-10-08T16:37:29.467 回答
0

I haven't done Pascal in a while, so I might be a bit rusty. The only thing I can think of that is creating your problem is that you created a character range that was interpreted as a byte array, which was then converted to a Digits and then multiplied, which gave you those weird values. But, I could be wrong. I am unfamiliar with 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.

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

于 2012-10-08T15:59:44.227 回答