我得到了以下代码,它应该正确地访问矩阵位置,但是我总是遇到这种访问违规行为......
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]
是一个未占用的索引,这就是为什么我不是触摸它。
为何违反访问权限?
答案 0 :(得分:6)
在Delphi中,动态数组(你可以调用SetLength的任何数组,而不是像编译array[1..5] of integer
那样在编译时声明它的边界)从0开始索引,而不是从1开始。因此将数组视为如果它使用基于1的索引而不是基于0的索引,则会溢出数组的边界并尝试写入未分配给您的内存,这可能会导致访问冲突。
答案 1 :(得分:4)
动态数组始终从0
开始。
因为
SetLength(tabla, minterms.Count+1, minterms_essentials.Count+1);
tabla
的最高第一索引为minterms.Count
。
现在,想想
for i := 0 to minterms.Count-1 do
begin
tabla[i+2,1] := minterms[i];
当i
为minterms.Count-1
时,i+2
为minterms.Count+1
。因此,您尝试访问tabla[minterms.Count+1]
。但这不存在,因为正如我们所看到的,tabla
的最大可能第一个索引是minterms.Count
。
因此,您尝试访问不存在的内容。
答案 2 :(得分:3)
阵列从零开始,最大值。 index是Count-1
因此,如果minterms.Count等于3,则setlength(...,4)==>索引在0和3之间。
for i := 0 to minterms.Count-1 do
会做得很好,但是在循环体中将i + 2改为i。