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

基本的に、私はテーブルを生成しています。ループでは、2 番目のループで列タグと行タグを埋めようとしています。私の知る限り、配列は 1 から始まります。

tabla[1][1]占有されていないインデックスになるので、触れていません。

なぜアクセス違反?

4

3 に答える 3

7

Delphi では、動的配列 ( のようにコンパイル時に境界を宣言するのではなく、SetLength を呼び出すことができる任意の配列array[1..5] of integer) は、1 からではなく 0 から始まるインデックスが付けられます。 0 から始まるインデックスを使用すると、配列の境界をオーバーフローし、自分に割り当てられていないメモリに書き込もうとして、アクセス違反が発生する可能性があります。

于 2013-06-25T22:01:22.480 に答える
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

したがって、存在しないものにアクセスしようとします。

于 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 に答える