ustawianie długości tablib dynamicznych

0

Mam tablicę dynamiczną:

var
  Arr: array of array of byte;

i procedurę:

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j: byte;
begin
  for i := 1 to 5 do
  begin
    SetLength(Arr,i);                    //-1

    for j := 0 to 5 do
    begin
      ShowMessage('i= '+IntToStr(i));    //(kontrola w fazie projektowania)   -2
      SetLength(Arr[i],4);               //-3
    end;
  end;
end;

Wydaje się poprawna, tymczasem już przy pierwszym obrocie pętli w lini //3 mam Acces Violation (00408255)

Wydaje mi się dziwne że po zmianie kodu w lini nr.3 na "SetLength(Arr[i-1],4);" obie pętle prawidłowo wykonują się do końca
Nie mogę jednak zgodzić się na taki trik ze względu na późniejsze komplikacje kodu (którego tutaj nie ma sensu przytaczać)
Czy ktoś z was może mi wyjaśnić przyczynę błędu?? :)

0

Przecież to logiczne tablice dynamiczne zawsze indeksowane są od 0 podczas gdy pierwsza pętla u Ciebie zaczyna się od i równego 1 a więc tablica przy pierwszymobiegu pętli ma rozmiar 1 (przez SetLength(Arr,i); ) a dalej przez SetLength(Arr[i],4); odwołujesz się do drugiego elementu tablicy (indeks 1 ma drugi element tablicy pierwszy ma indeks 0).

0
procedure TForm1.Button1Click(Sender: TObject);
    var  i,j:  byte;
    begin
       SetLength(Arr,5);
       for i := 0 to 4 do                                                                              
        begin
                                                                               
            SetLength(Arr[i],6);                                                          
            for j := 0 to 5 do
            begin
         
              
            end;
        end;
    end;

Powinno działać i ustawianie wielkości wyrzuciłem przed pętlę bo niepotrzebnie ustawiasz wielkość w każdym obiegu pętli. Wystarczy raz.

0

Ustawienie długości w każdym obiegu pętli jest zamierzone ponieważ w procedurze którą napiszę na bazie tej procedury (po wykryciu istoty błędu), długość tablicy będzie zwiększana o 1 przy każdym obrocie.

Ta procedura jest uproszczona i służy tylko identyfikacji błędu.:)

1

Przecież napisałem co powoduje błąd trzeba:

  var Arr: array of array of byte;
    i, j:  byte;
begin
  for i := 1 to 5 do
  begin
    SetLength(Arr, i);                                                                       //-1
    for j:= 0 to 5 do
    begin
      ShowMessage('i= ' + IntToStr(i));    //(kontrola w fazie projektowania)   -2
      SetLength(Arr[i - 1], 4); //<--- TU MA BYC i - 1                                                                 //-3
    end;
  end;
end;
0

Ustawienie długości w każdym obiegu pętli jest zamierzone ponieważ w procedurze którą napiszę na bazie tej procedury (po wykryciu istoty błędu), długość tablicy będzie zwiększana o 1 przy każdym obrocie.
Tablica dynamiczna już będzie:var Arr:array of array of array of byte;, a do tej nabardziej zagłębionej "podtablicy" będzie wpisywana pewna liczba
Zatem wydłużanie wewnątrz pętli nie wynika z mojej bezmyślności

kAzek Dzięki, wypróbuję z zerem na początku (chociaż i to już próbowałem - może nieprawidłowo)

0
procedure TForm1.Button1Click(Sender: TObject);
    var  i,j:  byte;
    begin
        for i := 0 to 2 do
        begin
            SetLength(Arr,i+1);

            for j := 0 to 2 do
            begin

                SetLength(Arr[i+1],4);

            end;
        end;
    end;

Też nie działa - błąd Access Violation przy SetLength(Arr[i+1],4);

0

@Delefi czyasz posty czy nie? Wyżej podałem poprawny kod.

0

@kAzek o Ty hakierze. Skąd to umiesz?

Ktoś się podszył pod mój nick , czy moderator to widzi?

Zrozumiałem , dostęp do pierwszego elementu tablicy uzyskuje się przez index "0"

      for i := 0 to 2 do
        begin
            SetLength(Arr,i+1);
            for j := 0 to 2 do
            begin

                SetLength(Arr[i],4); 

            end;
        end;

Ten kod działa tak jak trzeba

1 użytkowników online, w tym zalogowanych: 0, gości: 1