for-Schleife Inkrement-Part



  • Hi,

    ich habe hier einen Code-Ausschnitt, dessen Sinn ich nicht wirklich verstehe:

    Alle Variablen sind ints.

    for(int cx = x, cy = y, ty; cx != -2; cx = prev[cx], cy = ty)
    {
       ty = xy[cx];
       yx[cy] = cx;
       xy[cx] = cy;
    }
    

    Wozu eine for-Schleife ? Der Block wird doch eh nur ein einziges Mal durchlaufen, d.h. die Abbruch- und Inkrementbedingung benötigt man ja nicht wirklich. prev[cx] ist immer = -2 und selbst wenn es so wäre, würde ja eh nichts irgendwo hochgezählt werden oder ähnliches ?!

    Im Grunde also:

    cx = x
       cy = y
       yx[cy] = cx;
       xy[cx] = cy;
    

    Auch ty macht keinen Sinn, da die Routine nach dieser Schleife zu Ende ist und selbst bei erneutem Aufruf dieser anfangs eh alles null gesetzt wird.

    Oder übersehe ich irgendetwas ?



  • Wenn prev[cx] immer -2 wäre, dann ist der Code äquivalent zu:

    if (x != -2)
    {   
       yx[y] = x;
       xy[x] = y;   
    }
    

    Aber warum sollte prev[-2] immer -2 sein?



  • Weil ganz am Anfang der Routine

    prev[x)=-2;
    

    gesetzt wird.

    Der Code macht ja, was er soll. Ich verstehe nur nicht, warum man das in eine for-Schleife packt. Eigenartiger Programmierstil 🙄

    Aber, wie gesagt, angenommen prev[cx] wäre nicht -2: Die Schleife sorgt doch eh nicht dafür, dass irgendetwas in- oder dekrementiert oder sonstwas wird. Oder ?

    edit:
    - war dumm.. -



  • Der Code macht ja, was er soll. Ich verstehe nur nicht, warum man das in eine for-Schleife packt. Eigenartiger Programmierstil 🙄

    Aber, wie gesagt, angenommen prev[cx] wäre nicht -2: Die Schleife sorgt doch eh nicht dafür, dass irgendetwas in- oder dekrementiert oder sonstwas wird. Oder ?

    Bin mir nicht sicher, was du damit genau meinst, aber jedenfalls kann die Schleife abhängig von den Werten in prev mehrmals durchlaufen werden.



  • ;kar schrieb:

    Der Code macht ja, was er soll. Ich verstehe nur nicht, warum man das in eine for-Schleife packt. Eigenartiger Programmierstil 🙄

    Aber, wie gesagt, angenommen prev[cx] wäre nicht -2: Die Schleife sorgt doch eh nicht dafür, dass irgendetwas in- oder dekrementiert oder sonstwas wird. Oder ?

    Bin mir nicht sicher, was du damit genau meinst, aber jedenfalls kann die Schleife abhängig von den Werten in prev mehrmals durchlaufen werden.

    Mh, tatsächlich, stimmt. Ich gucke mir gerade eine ganze Reihe von einzelnen Schritten an und (nur) bei denen ist es so, dass prev[x]=-2 ist.

    Wie/was/wo sorgt denn dafür, dass sich etwas innerhalb der Schleife ändert ?
    Also die Schleife wird zum ersten Mal durchlaufen, cx=m_prev[cx] gesetzt und cx!=-2. Und dann ?

    cx und cy ändert sich doch nie ?
    ty ändert sich nie, da sich cx nie ändert und damit ändert sich cy nie.
    cx ändert sich ein einziges Mal, nämlich wenn die Schleife zum ersten Mal durchlaufen wurde. Danach ja auch nie wieder.

    Also ich sehe nicht, wie die Schleife denn z.B. zweimal durchlaufen werden kann bzw. viel eher, dass sie nicht endlos gefangen ist, wenn prev[cx]!=-2 ist.

    😕



  • Progressive schrieb:

    cx und cy ändert sich doch nie ?

    Doch: cx = prev[cx]



  • Die Schleife läuft so lange wie cx! =-2. Und was in cx steht hängt von prev[] ab.



  • ;kar schrieb:

    Progressive schrieb:

    cx und cy ändert sich doch nie ?

    Doch: cx = prev[cx]

    Das ist ja aber nur einmal der Fall, oder ?

    Schlangenmensch schrieb:

    Die Schleife läuft so lange wie cx! =-2. Und was in cx steht hängt von prev[] ab.

    Aber wo wird prev[] denn selbst durchlaufen ? Die Einträge darin werden ja nicht systematisch nacheinander abgerufen.



  • Progressive schrieb:

    Das ist ja aber nur einmal der Fall, oder ?

    Nein, das passiert sooft die Schleife durchlaufen wird, also solange cx != -2.

    Aber wo wird prev[] denn selbst durchlaufen ? Die Einträge darin werden ja nicht systematisch nacheinander abgerufen.

    Das ist zwar richtig, aber inwiefern soll das relevant sein?



  • Nehmen wir mal an prev[]={-2,0,1} und x = n:

    erste Iteration:
    cx = 2, (init teil der Schleife)
    Offensichtlich 2!=-2
    Schleifenrumpf [...]

    2. Iteration: cx=prev[2]=1
    ...
    3. Iteration: cx=prev[1]=0
    ...
    4. Iteration: cx=prev[0]=-2
    Schleifenbedingung nicht mehr erfüllt -> Feierabend.



  • Schlangenmensch schrieb:

    Nehmen wir mal an prev[]={-2,0,1} und x = n:

    erste Iteration:
    cx = 2, (init teil der Schleife)
    Offensichtlich 2!=-2
    Schleifenrumpf [...]

    2. Iteration: cx=prev[2]=1
    ...
    3. Iteration: cx=prev[1]=0
    ...
    4. Iteration: cx=prev[0]=-2
    Schleifenbedingung nicht mehr erfüllt -> Feierabend.

    💡

    Vielen Dank, das habe ich quasi die ganze Zeit gesucht. Mir war das als nicht ersichtlich.
    Super, dankeschön! 🙂


Log in to reply