0

我得到了以下代码,它应该可以正确访问矩阵位置,但是我总是遇到这种访问冲突......

var
tabla : array of array of string;

....
implementation

SetLength(tabla, minterms.Count+1, minterms_essentials.Count+1);

for i := 0 to minterms.Count-1 do
begin
  tabla[i+2,1] := minterms[i];
end;

for i := 0 to minterms_essentials.Count-1 do
begin
  tabla[1, i+2] := minterms_essentials[i];
end;

end

基本上,我正在生成一个表格,并且在循环中我试图在第二个循环中填充列标签和行标签。据我所知,数组从 1 开始。

tabla[1][1]会是一个未占用的索引,这就是为什么我没有触摸它

为什么访问冲突?

4

3 回答 3

7

在 Delphi 中,动态数组(可以调用 SetLength 的任何数组,而不是像在编译时声明其边界array[1..5] of integer)从 0 开始索引,而不是从 1 开始。因此,将数组视为使用基于 1 的索引在基于 0 的索引中,您会溢出数组的边界并尝试写入未分配给您的内存,这可能会导致访问冲突。

于 2013-06-25T22:01:22.480 回答
4

动态数组总是从0.

因为

SetLength(tabla, minterms.Count+1, minterms_essentials.Count+1);

的最高可能的第一个索引tablaminterms.Count

现在想想

for i := 0 to minterms.Count-1 do
begin
  tabla[i+2,1] := minterms[i];

什么时候,i是。因此,您尝试访问. 但这并不存在,因为正如我们所见,最大可能的第一个索引是。minterms.Count-1i+2minterms.Count+1tabla[minterms.Count+1]tablaminterms.Count

因此,您尝试访问不存在的东西。

于 2013-06-25T22:00:40.760 回答
3

数组从零开始,最大值。索引是 Count-1

因此,如果 minterms.Count 等于 3,则 setlength(..., 4) ==> 索引介于 0 和 3 之间。

for i := 0 to minterms.Count-1 do

会很好,但在循环体中将 i+2 更改为 i 。

于 2013-06-25T22:00:50.783 回答