Pętla for problem

0
var
   i, j  : integer;
begin
     j := 9;
     for i := 0 to j do
     begin
         if ( i = 3 ) or ( i = 6 ) or ( i = 9 ) then
            inc( j );
     end;

pętla wykonuje mi się 10 razy.
a chyba powinna 13, jest jakiś sposób, żeby zaktualizować tą zmienną j ? czy to optymalizator mi takie cuda robi?

0

Bo tak się nie robi. To brzydkie i mylące. Zrób to pętlą repeat until.

4

Nie, powinna się wykonać 10 razy, bo w pętli for licznik jest ustawiany raz (a raczej ilość iteracji); Jeśli chcesz manipulować licznikiem to skorzystaj z pętli while lub repeat;

EDIT: Jeśli koniecznie chcesz manipulować licznikiem to możesz pobrać do niego wskaźnik i wtedy zmieniać jego wartość, ale nie powinno się tego robić - są przecież inne pętle;

EDIT1: A niech stracę:

var
  iCounter: Byte;
  PCounter: PByte;
begin
  for iCounter := 0 to 9 do
  begin
    WriteLn('iCounter: ', iCounter);

    if iCounter = 2 then
    begin
      PCounter := @iCounter;
      PCounter^ := 8;
    end;
  end;
  ReadLn;
end.

W tej pętli wyświetlany jest stan licznika, a następnie jeśli równa się 2 - zostaje pobrany jego adres oraz przypisana nowa wartość; Dzięki temu na wyjściu dostaniemy:

iCounter: 0
iCounter: 1
iCounter: 2
iCounter: 9

Równie dobrze można w ten sposób oprogramować nieskończoną pętlę for, ale tego typu zabiegi trzeba traktować jako ciekawostkę, nie jako technikę wartą zastosowania.

1

Wartości stałych w delphi/pascalu możemy modyfikować bez jakichkolwiek kombinacji.

Nie.

Deklaracja zmienna:typ=wartość; w bloku const jest deklaracją zmiennej. Nowe kompilatory Pascala na podobną deklarację pozwalają w bloku var, jest ona równoznaczna.

Ten FPC to jednak dziwny jest - w Delphi nie przejdzie (i nie powinno), a w FPC stałe traktowane są jak zmienne; W takim razie po co są stałe, skoro można je modyfikować..?

To nie są stałe, to są zmienne. Z tego co się orientuję nawet standard Pascala tak wskazuje.

oraz można to osiągnąć również korzystając ze wskaźników na stałe.

Nie jestem przekonany czy FPC pozwala na pobranie wskaźnika stałej. Nawet jeżeli to FPC stałe umieszcza w sekcji bez dostępu zapisu, więc dostaniesz Access Violation.
(Sprawdzone, FPC nie pozwala pobrać adresu stałej).

To tak gwoli wyjaśnienia ludowi bo widzę że mało kto to ogarnia.

1

jest ona równoznaczna.

No nie do końca.
http://ideone.com/2CzDzf
const zmienna: typ = wartość; tworzy zmienną statyczną.

0
Patryk27 napisał(a):

No nie do końca.
http://ideone.com/2CzDzf
const zmienna: typ = wartość; tworzy zmienną statyczną.

Ciekawe, warto wiedzieć. Zapewne kompilator po prostu wrzuca zmienną do sekcji zmiennych.

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