Порушення доступу в Delphi?

Я отримав наступний код, який повинен правильно acess позиції матриці, проте я завжди отримую це порушення доступу ...

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] would an unoccupied index, that's why I'm ain't touching it.

Чому порушення доступу?

0
@RobKennedy Як я можу встановити діапазон перевірки?
додано Автор diegoaguilar, джерело
Краще запитати, чому ви вимкнули перевірку діапазону.
додано Автор Rob Kennedy, джерело
Це в параметрах компілятора вашого проекту.
додано Автор Rob Kennedy, джерело
@JerryDodge: Це не "повний реальний код", але достатньо, щоб показати, де проблема.
додано Автор Mason Wheeler, джерело
Чи навіть вищезгаданий код компілюється? Це не виглядає як повний справжній код ...
додано Автор Jerry Dodge, джерело
Я маю на увазі, я знаю, "фальшивий код", як правило, прийнятно, але коли це discombobulated безлад коду в спробі зробити зразок одиниці, що тільки вказує на мене, що ОП не дійсно намагаються відтворити питання.
додано Автор Jerry Dodge, джерело

7 Відповіді

У Delphi динамічні масиви (будь-який масив, на який можна викликати SetLength, на відміну від оголошення його меж під час компіляції, як масив [1..5] цілого числа ) індексуються починаючи з 0, а не 1. Отже, розглядаючи ваш масив, як якщо б він використовував індексацію на основі 1, а не індексацію на основі 0, ви переповнюєте межі масиву і намагаєтеся записати в пам'ять, що не виділено вам, що може призвести до порушення доступу.

6
додано

У Delphi динамічні масиви (будь-який масив, на який можна викликати SetLength, на відміну від оголошення його меж під час компіляції, як масив [1..5] цілого числа ) індексуються починаючи з 0, а не 1. Отже, розглядаючи ваш масив, як якщо б він використовував індексацію на основі 1, а не індексацію на основі 0, ви переповнюєте межі масиву і намагаєтеся записати в пам'ять, що не виділено вам, що може призвести до порушення доступу.

6
додано

У Delphi динамічні масиви (будь-який масив, на який можна викликати SetLength, на відміну від оголошення його меж під час компіляції, як масив [1..5] цілого числа ) індексуються починаючи з 0, а не 1. Отже, розглядаючи ваш масив, як якщо б він використовував індексацію на основі 1, а не індексацію на основі 0, ви переповнюєте межі масиву і намагаєтеся записати в пам'ять, що не виділено вам, що може призвести до порушення доступу.

6
додано

Динамічні масиви завжди починаються з 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 .

Тому ви намагаєтеся отримати доступ до того, чого не існує.

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 .

Тому ви намагаєтеся отримати доступ до того, чого не існує.

4
додано

Масиви починаються з нуля, а макс. індекс - граф-1

Therefore, if minterms.Count equals three, setlength(..., 4) ==> Index between 0 and 3.

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

буде робити добре, але змінювати i + 2 в i в тілі петлі.

3
додано

Масиви починаються з нуля, а макс. індекс - граф-1

Therefore, if minterms.Count equals three, setlength(..., 4) ==> Index between 0 and 3.

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

буде робити добре, але змінювати i + 2 в i в тілі петлі.

3
додано