Delphi - debugowanie, iteracja pętli

0

Witam

Chodzi o to że jak debuguje program, to podczas obserwowania zmiennej 'i', konkretnie w pętli for i := 1 to 3
zamiast iść kolejno od 1 do 3, to zmienna maleje

Nie korzystam w pętli ze zmiennej 'i', traktuje ją tylko do odczytu
pętla jest w procedurze i zmienna 'i' jest prywatna, zadeklarowana tylko dla tej procedury

Nie rozumiem o co chodzi
Będę bardzo wdzięczny za pomoc

Korzystam z wersji Embarcadero RAD Studio 2010

Z góry bardzo dziękuje za pomoc
Piotrek

0

Chodzi o to że jak debuguje program, to podczas obserwowania zmiennej 'i', konkretnie w pętli for i := 1 to 3
zamiast iść kolejno od 1 do 3, to zmienna maleje

Czyżbyś nie umiał użyć debuggera?

Nie korzystam w pętli ze zmiennej 'i', traktuje ją tylko do odczytu
pętla jest w procedurze i zmienna 'i' jest prywatna, zadeklarowana tylko dla tej procedury

Nie można używać zmiennej która jest iteratorem do zapisywania rzeczy, przynajmniej w FPC.

Nie rozumiem o co chodzi
Będę bardzo wdzięczny za pomoc

kod.

0

http://www.digipedia.pl/usenet/thread/21/981989/

a teraz napisz, że szukałeś i że nigdzie nie pisało

0

często korzystam z debuggera i jak dotąd nie miałem żadnych problemów
To dodatkowo wydaje mi się nielogiczne

nie rozumiem po co mi napisałeś że nie można, przecież wiem, specjalnie to napisałem
Żeby było wiadomo że nic takiego nie miało miejsca, żeby szukać problemu gdzie indziej

Nic nie wniosłeś swoją odpowiedzią, a dzięki za zainteresowanie tematem ;)

0
wójek google napisał(a):

http://www.digipedia.pl/usenet/thread/21/981989/

a teraz napisz, że szukałeś i że nigdzie nie pisało

Dzięki za odpowiedź

Szczerze to szukałem, ale bez powodzenia niestety,
zawsze najpierw szukam, a dopiero wchodzę na forum
i z doświadczenia wiem, że szybciej jest wyszukać w google i niż napisać i czekać na odpowiedź
ale ten problem wydał mi się na tyle dziwny że wolałem zapytać i sprecyzować dokładnie co u mnie występuje

Pozdrawiam

ps: problem rozwiązany :)
przed fragmentem kodu wystarczy dodać {$OPTIMIZATION OFF}
bo inaczej Delphi optymalizując kod odwraca kierunek pętli
Nie ma to nic wspólnego z umiejętnością obsługiwania debuggera

0
PiortekZ15 napisał(a):

Nic nie wniosłeś swoją odpowiedzią, a dzięki za zainteresowanie tematem ;)

Bo ty swoją coś wniosłeś, powiedziałem żebyś dał kod, na złość nie dałeś.

Zresztą, ktoś użył googla i znalazł że to 'optymalizacja' (srsly bitch, optymalizacja tego? Są miliony rzeczy które można zoptymalizować, ale oni odwracają pętlę żeby oszczędzić paru taktów maszynowych - bitch, please). Też mogłeś pogooglować, byłoby szybciej.

0
-123oho napisał(a):
PiortekZ15 napisał(a):

Nic nie wniosłeś swoją odpowiedzią, a dzięki za zainteresowanie tematem ;)

Bo ty swoją coś wniosłeś, powiedziałem żebyś dał kod, na złość nie dałeś.

Zresztą, ktoś użył googla i znalazł że to 'optymalizacja' (srsly bitch, optymalizacja tego? Są miliony rzeczy które można zoptymalizować, ale oni odwracają pętlę żeby oszczędzić paru taktów maszynowych - bitch, please). Też mogłeś pogooglować, byłoby szybciej.

ok, sorry
nie skumałem że prosisz o kod

następnym razem pogoogluje dokładniej ;)
Pozdrawiam

0
PiortekZ15 napisał(a):

ok, sorry
nie skumałem że prosisz o kod

Jak ktoś pisze "kod" to znaczy że chodzi o to żebyś dał kod.

następnym razem pogoogluje dokładniej ;)
Pozdrawiam

Mnie też by to zdziwiło że pętla działa odwrotnie, dlatego też postawiłem na twoje marne umiejętności debuggowania/błędy w kodzie.
Następnym razem po prostu wyłączaj optymalizację na czas debuggowania, przecież to podstawa. Całkowite ich wyłączenie to głupota.
No i jak zwykle google najlepszym przyjacielem programisty.

0
-123oho napisał(a)

Mnie też by to zdziwiło że pętla działa odwrotnie

No i pętla nie działa odwrotnie (to by było naprawdę dziwne); Pod debugger'em widać owszem, że iterator jest odliczany od tyłu i nawet nie po indeksach, ale w ciele pętli ma prawidłową wartość;

Zobacz na ten przykład:

program Foo;

{$APPTYPE CONSOLE}

const
  aMtx: array [0 .. 4] of String = ('Pierwszy',
                                    'Drugi',
                                    'Trzeci',
                                    'Czwarty',
                                    'Piaty');
var
  I: Byte;
begin
  for I := 0 to 4 do
    WriteLn(aMtx[I]);
end.

Ten kod służy do wyświetlenia wszystkich wartości z macierzy aMtx; Dziwne jest to, że pod debugger'em wartość iteratora I rozpoczyna się od 5, a kończy na 1... Ale pomimo tego, że wartość w macierzy pod indeksem 5 nie istnieje, nie otrzymuję błędu i do tego dostaję prawidłowe wyjście:

Pierwszy
Drugi
Trzeci
Czwarty
Piaty

Jeśli posłużę się wskazówkami o wyłączeniu optymalizacji:

program Foo;

{$APPTYPE CONSOLE}

const
  aMtx: array [0 .. 4] of String = ('Pierwszy',
                                    'Drugi',
                                    'Trzeci',
                                    'Czwarty',
                                    'Piaty');
var
  I: Byte;
begin
  {$OPTIMIZATION OFF}

  for I := 0 to 4 do
    WriteLn(aMtx[I]);
end.

W dalszym ciągu kod będzie działał poprawnie i dostanę takie samo wyjście; W drugim przypadku iterator I będzie indeksowany tak, jak to sobie zażyczyłem (od 0 do 4);

Zmiana wartości iteratora w debugger'ze to tylko sztuczki, które w żadnym wypadku nie wpływają na jego wartość w programie i tym samym nie powodują błędów; Sprawdź sam; Jeżeli jednak pętla sprawia problemy i powoduje błędy to nie dlatego, że optymalizacja "zmienia" Ci wartość iteratora, tylko dlatego, że kod sam w sobie jest zbugowany;

0

No i pętla nie działa odwrotnie (to by było naprawdę dziwne); Pod debugger'em widać owszem, że iterator jest odliczany od tyłu i nawet nie po indeksach, ale w ciele pętli ma prawidłową wartość;

Skąd wiesz że optymalizator nie zmienił tablicy tak żeby pasowało do tego jak odlicza.

Ten kod służy do wyświetlenia wszystkich wartości z macierzy aMtx; Dziwne jest to, że pod debugger'em wartość iteratora I rozpoczyna się od 5, a kończy na 1... Ale pomimo tego, że wartość w macierzy pod indeksem 5 nie istnieje, nie otrzymuję błędu i do tego dostaję prawidłowe wyjście:

Czyli: Optymalizator zmienił tablicę inaczej po prostu by się nie opłacała taka 'optymalizacja'.

Zmiana wartości iteratora w debugger'ze to tylko sztuczki, które w żadnym wypadku nie wpływają na jego wartość w programie i tym samym nie powodują błędów; Sprawdź sam;

Sprawdzić nie mam jak, nie mam komercyjnego delphi. Natomiast nie wierzę że optymalizator ma takie coś że zmienia wartość w trakcie pętli. Pewnie po prostu sprawdza czy da się zmienić pętlę i jeżeli tak to to robi przy okazji zmieniając odpowiednie struktury. Spróbuj użyć iteratora do jakichś skomplikowanych obliczeń.

0
-123oho napisał(a)

Skąd wiesz że optymalizator nie zmienił tablicy tak żeby pasowało do tego jak odlicza.

Czyli: Optymalizator zmienił tablicę inaczej po prostu by się nie opłacała taka 'optymalizacja'.

Na pewno zmienił, bo kod by się wysypał (indeks wyszedłby poza zakres);

-123oho napisał(a)

Sprawdzić nie mam jak, nie mam komercyjnego delphi. Natomiast nie wierzę że optymalizator ma takie coś że zmienia wartość w trakcie pętli. Pewnie po prostu sprawdza czy da się zmienić pętlę i jeżeli tak to to robi przy okazji zmieniając odpowiednie struktury.

To zależy co rozumiesz przez "w trakcie pętli"; Mnie nigdy się nie przydażyło, żeby optymalizator pozmieniał mi iterator i on sam powodował przez to błędy; Kiedy może - zmienia, kiedy nie - pozostawia go bez zmian;

Jeśli użyję takiej konstrukcji:

for I := 0 to 4 do
  WriteLn(I, ': ', aMtx[I]);

indeksy nawet z optymalizacją idą w debugger'ze tak, jak widać w definicji pętli, a kod dalej działa poprawnie;

-123oho napisał(a)

Spróbuj użyć iteratora do jakichś skomplikowanych obliczeń.

I założę się, że sam optymalizator nie zepsuje oliczeń, nic nie pozmienia i błędów nie spowoduje; Piszę z głowy, bo kompilatora pod ręką też nie mam;

Nie ma co snuć znów jakichś teorii spiskowych, optymalizator nie powoduje błędów w kodzie, robi je programista;

0

To zależy co rozumiesz przez "w trakcie pętli"; Mnie nigdy się nie przydażyło, żeby optymalizator pozmieniał mi iterator i on sam powodował przez to błędy; Kiedy może - zmienia, kiedy nie - pozostawia go bez zmian;
indeksy nawet z optymalizacją idą w debugger'ze tak, jak widać w definicji pętli, a kod dalej działa poprawnie;

No właśnie. Tylko dlaczego piszesz tak:

Pod debugger'em widać owszem, że iterator jest odliczany od tyłu i nawet nie po indeksach, ale w ciele pętli ma prawidłową wartość;

Prawidłową wartość? On ciągle ma tą zmienioną, po prostu optymalizator zrobił to tak żeby wszystko pasowało pod to nowe odliczanie.

I założę się, że sam optymalizator nie zepsuje oliczeń, nic nie pozmienia i błędów nie spowoduje; Piszę z głowy, bo kompilatora pod ręką też nie mam;

Nie ma co snuć znów jakichś teorii spiskowych, optymalizator nie powoduje błędów w kodzie, robi je programista;

Wszystko może spowodować błędy, zdarzało mi się że optymalizator z FPC wchodził w drogę i psuł kod (co prawda to były dosyć ekstremalne przypadki ale się zdarza). Nothing is impossible.
Ale tutaj jak widać optymalizator nie powoduje błędu a jedynie zdziwienie.

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