doppelte for-Schleifen



  • Hallo,

    ich ein Anfänger und habe die hoffnung, dass mit trotzdem jemand antwortet.
    Ich habe ein fertiges Skript bekommen und muss ein paar Modifikationen daran vornehmen. So weit, so gut oder auch nicht.

    In diesem Skript kommen vermehrt folgende aufeinanderfolgende For-Schleifen vor:

    if (posindex_picture==1) 
       {for(x=0;x<pict_get_xsize(p)-1;x++)
        for(y=0;y<pict_get_ysize(p)-1;y++) {pict_get_color(p,x,y)[RED]=lum;
                                            pict_get_color(p,x,y)[GRN]=lum;
                                            pict_get_color(p,x,y)[BLU]=lum;
                                           }
        cut_view_2(p);
        pict_write(p,file_out);
        exit(1);
       }
    

    Nun weiß ich, dass ";" eine solche Schleife als eindeutig beenden würde, aber hier steht hinter der ersten Schleife gar nichts. Daher meine Frage: wie sind hier die Beziehungen zu einander?

    D.h. ist

    for(x=0;x<pic(p)-1;x++)
    for(y=0;y<pic(p)-1;y++) {pic(p,x,y)[RED]=lum;}
    

    gleich dem:

    for(x=0;x<pic(p)-1;x++) {for(y=0;y<pic(p)-1;y++) {pic(p,x,y)[RED]=lum;}
                            }
    

    oder dem:

    for(x=0;x<pic(p)-1;x++) {}
    for(y=0;y<pic(p)-1;y++) {pic(p,x,y)[RED]=lum;}
    

    Und sollte es erstere Version sein, was schließt die For-Schleife dann ein? Woran kann ich das erkennen. Gibt es da eine Regel?

    Vielen Dank für jede Antwort.
    Sandra



  • enthält eine Schleife nur eine Anweisung, kann die geschweifte Klammer weggelassen werden. Eine ganze Schleife gilt als eine Anweisung.

    also ist

    for(x=0;x<pic(p)-1;x++)
    for(y=0;y<pic(p)-1;y++) {pic(p,x,y)[RED]=lum;}
    

    das gleiche wie

    for(x=0;x<pic(p)-1;x++) {
    for(y=0;y<pic(p)-1;y++) {pic(p,x,y)[RED]=lum;}
    }
    


  • ergy1983 schrieb:

    D.h. ist

    for(x=0;x<pic(p)-1;x++)
    for(y=0;y<pic(p)-1;y++) {pic(p,x,y)[RED]=lum;}
    

    gleich dem:

    for(x=0;x<pic(p)-1;x++) {for(y=0;y<pic(p)-1;y++) {pic(p,x,y)[RED]=lum;}
                            }
    

    oder dem:

    for(x=0;x<pic(p)-1;x++) {}
    for(y=0;y<pic(p)-1;y++) {pic(p,x,y)[RED]=lum;}
    

    Und sollte es erstere Version sein, was schließt die For-Schleife dann ein? Woran kann ich das erkennen. Gibt es da eine Regel?

    Das erste ist richtig. Du musst geschweifte Klammern nicht notieren, wenn du als Schleifen- bzw. Blockrumpf nur eine Zeile notieren willst, z.B. so:

    for(int i=0;i<10;++i)
      cout << "hallo welt";
    

    Wenn nun diese eine Zeile auch wieder eine for-Anweisung ist, ist diese Anweisung eben der Schleifenrumpf und wird x mal durchlaufen.

    Aber hör mal, deine Code-Einrückung ist ja grauenhaft, sorry. 🙂 Liegt sicher daran, dass du hier fremden Code bearbeitest. Trotzdem solltest du dir mal ansehen, wie es besser/richtig gemacht wird (denn dein Code ist in meinen Augen kaum lesbar, und auch nicht konsistent eingerückt):

    http://de.wikipedia.org/wiki/Einrückungsstil



  • Vielen Dank für die schnellen Antworten.

    Und ja, ich weiß, es ist grauenhaft eingerückt. Wollte es nur nicht verändern, weil ich mir an genau der oben genannten stelle nicht sicher war.

    Also nochmals. Vielen Dank



  • Ich würde übrigens empfehlen, auf solche Einzeilen-Schleifenrümpfe zu verzichten. Dann kann - gerade bei Anfängern - schnell mal sowas passieren:

    for(int i=0;i<10;++i)
      cout << "tach";  //gehört zur Schleife
      cout << "welt";  //gehört NICHT zur Schleife
    

    Außerdem bin ich persönlich der Meinung, dass Klammern einfach besser und strukturierter aussehen. Na ja, jeder wie er will.



  • Sicherlich richtig _matze,
    aber wenn eine for-schleife mehrere Dimensionen behandelt, wie hier mit x und y, und du erwarten kannst, dass da wirklich nie etwas dazu kommt, dann sieht es ohne Klammern und richtig eingerückt noch eine Spur sauberer aus - und weist dadurch eigentlich auch darauf hin, dass nur mehrere Dimensionen durchlaufen werden, und sonst nix Besonderes dran ist.



  • Wobei es der Performanz meist zuträglich ist in der äußeren Schleife y zu durchlaufen und in der inneren x. So als Bonusantwort um den Dozenten zu nerven. 😉



  • Bitsy schrieb:

    Sicherlich richtig _matze,
    aber wenn eine for-schleife mehrere Dimensionen behandelt, wie hier mit x und y, und du erwarten kannst, dass da wirklich nie etwas dazu kommt, dann sieht es ohne Klammern und richtig eingerückt noch eine Spur sauberer aus - und weist dadurch eigentlich auch darauf hin, dass nur mehrere Dimensionen durchlaufen werden, und sonst nix Besonderes dran ist.

    Ich sehe es halt so, dass es mit Klammern sauberer aussieht. Aber wie gesagt, jeder wie er will. Ist letztlich Geschmacksache, solange man konsistent einrückt (und andere das auch noch halbwegs lesen können 😉 ).


Anmelden zum Antworten