Delphi 4 iteracje

0

Pół dnia straciłem na szukaniu błędu a teraz jak go znalazłem jestem oburzony. Już któryś raz mi się to przytrafia. Pracuje na Delphi 4 Standard. Wcześniej sytuacja była następująca : miałem na formie TMemo i przy zamykaniu chciałem do 1 stringa zrzucić całą zawartość memo. Walnąłem więce pęlte :

s := '';
For i := 0 to Memo1.Lines.Count - 1 do
s := s + Memo1.Lines[i];

(pisze z pamięci, ale wiecie o co chodzi) i przy zamykaniu, jak sobie debugowałem zauważyłem że dziwnie przymula w tym miejscu, zacząłem więc węszyć ! Okazało się, że program wykonuje pętle, nawet gdy Memo1.Lines.Count = 0 !!!!!!!!!!!!! oburzyło mnie to niezmiernie, no ale bogatszy o taką wiadomość dodałem linijkę która załatwiała sprawę :
If Memo1.Lines.Count > 0 then ...

Wszystko grało, do dzisiaj, od rana męczy mnie jeden Access Violation. Debugowałęm w kółko i ciągle to samo, już cuda robiłem. Zwykła procka obsługi buttona i na końcu bum w momencie podstawiania ModalResult := mrOK, nawet jak pozmieniałem, wywaliłem ta linie, to przy zamykaniu foremki to samo. Mieszałem mieszałem, aż w końcu pewnego razu, debbuger zatrzymał sie na jakimś podstawieniu w stylu :

Przekroj.Warstwy[j].dHNiwelety := Odcinki[AktywnyOdcinek].Przekroje[NumerPrzekroju].Warstwy[j].dHNiwelety;

mówie co jest ? powinno byś wszystko ok , no to ciup F5 na początku pętli :

For j := 0 to (Odcinki[AktywnyOdcinek].Przekroje[NumerPrzekroju].IloscWarstw - 1) do

no i co się okazuje ! ? ! ? !

pętla się wykonuje nawet gdy Odcinki[AktywnyOdcinek].Przekroje[NumerPrzekroju].IloscWarstw = 0, a więc on robi pętle
For j := 0 to -1 do
i to robi w nieskończoność, znaczy w końcu się kończy : ( komunikatem Acces Violation - co mnie nie dziwi, bo tablica Warstwy jest skończonych rozmiarów ;] Oczywiście znowu pomogło

If Odcinki[AktywnyOdcinek].Przekroje[NumerPrzekroju].IloscWarstw > 0 then ...

no ale kurcze to nie o to chyba chodzi. Powiedzcie mi co jest nie tak, bo aż strach pomyśleć że przed każdym For będe musiał dać If !!

Z góry dziękuje za odpowiedź.

0

Niestety albo if przed for, albo inna pętla. For kończy gdy wartość zmiennej odpowiada dokładnie zadeklarowanej wartości (=). Jesli potrzebujesz sparawdzania, czy zmienna nie wyszła poza zakres (<,>) to proponuje uzyc while'a, albo repeat'a.

// Więc nie dziw, że dla Memo1.Lines.Count = 0 wykona sie for, bo wykona się w sumie dla Memo1.Lines.Count-1 = -1 ... Czyli dla inta jakieś 2^32 razy ;]

// Do postu poniżej... jakbyś wcześniej napisał, że i to byte... -1 dla byte jest poza zakresem i stad wszystko.

0

Niestety albo if przed for, albo inna pętla. For kończy gdy wartość zmiennej odpowiada dokładnie zadeklarowanej wartości (=). Jesli potrzebujesz sparawdzania, czy zmienna nie wyszła poza zakres (<,>) to proponuje uzyc while'a, albo repeat'a.

// Więc nie dziw, że dla Memo1.Lines.Count = 0 wykona sie for, bo wykona się w sumie dla Memo1.Lines.Count-1 = -1 ... Czyli dla inta jakieś 2^32 razy ;]

nie w tym rzecz, chodziło o typ zmiennej, jak bym miał właśnie integer to by było OK, spójrz :

procedure TForm1.Button1Click(Sender: TObject);
var i,j : Integer;
begin
j := -1;
For i := 0 to j do
ShowMessage('Jeśli widzisz ten komunikat to masz u mnie piwo !');
end;

procedure TForm1.Button2Click(Sender: TObject);
var i : Byte;
j : Integer;
begin
j := -1;
For i := 0 to j do
ShowMessage('Jeśli widzisz ten komunikat to masz u mnie pozdrowienia !');
end;

A tak <ort>w ogóle </ort>sprawę rozwiązuje jedna rzecz : )

{$R+}

0

s := Memo1.Lines.Text :)

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