-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;