Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

31

22.02.2013, 17:39

Ja, ja, mach mal. In der Praxis beweist übrigens (meistens) niemand die Korrektheit seiner Schleifen.
;)
Afaik gibt es schon reale Systeme, die komplett bewiesen sind. Mir schwirrt da die Metro in Lausanne im Kopf herum, die führerlos fährt und dessen Steuerungssystem bewiesen korrekt ist. Schleifen gehören da wahrscheinlich auch dazu. Gibt sicher noch mehr Software, die auch im Einsatz ist, die komplett bewiesen sind (iwelche Waffensysteme wahrscheinlich).

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

32

22.02.2013, 18:51

Es gibt Ausnahmen, wo Menschenleben involviert sind.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

m3xx

Alter Hase

  • »m3xx« ist der Autor dieses Themas

Beiträge: 434

Beruf: Student

  • Private Nachricht senden

33

23.02.2013, 18:15

Mh anscheinend hat es ja doch Vorteile, den Zähler im Aktionsteil zu inkrementieren zu lassen, statt im Codeblock :o
Dann werde ich es wohl auch im Aktionsteil weiter belassen.
Wäre es aber eigentlich noch Normgerecht wenn man das Inkrementieren im Codeblock erledigt?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

34

23.02.2013, 18:32

Was heißt für dich normgerecht? Erst mal kannst du das alles machen wie du es selbst für richtig hälst. Wenn du denkst du kannst damit besser arbeiten dann mach es. Die meisten werden eine For-Schleife aber vermutlich so benutzen, wie sie vorgesehen ist. Ansonsten kannst du ja auch eine While-Schleife benutzen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

m3xx

Alter Hase

  • »m3xx« ist der Autor dieses Themas

Beiträge: 434

Beruf: Student

  • Private Nachricht senden

35

24.02.2013, 01:28

Mh aber in der While-Schleife ist es nicht möglich einen Variable zu initialisieren, die nur einen Gültigkeitsbereich innerhalb des Codeblocks hat oder? Korriger mich wenn ich irre. Das Problem ist ich hatte vor knapp einem Jahr C++ iwie aus dem Auge verloren die Lust ging verloren --> Bin grad dabei alles neu zu lernen derzeit (For-Schleife bzw Modulo benutze das Buch von Heiko^^) Regt mich natürlich auf das ich diesen Fehler begangen habe. Bin jetz tierisch angestachelt C++ zu lernen, dismal verstehe ich es aber auch leichter und es macht um einiges mehr Spaß, obwohl es noch die Projekte ohne richtiges Ergebnis sind.

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

36

24.02.2013, 01:56

Ja, so ohne weitere ist es mit der While-Schleife nicht möglich.

man könnte aber folgendes machen, was ab und an sowieso sehr praktisch ist wenn man z.B. „Scoped Objects“ (Als Beispiel ein Objekt das beim Erstellen Ressourcen belegt und beim Zerstören erst wieder frei gibt, so kann man z.B. vermeiden, dass sich die Zerstörung beim mehreren Objekten bis zum Hauptblockende hinzieht und dann so ungünstiges verhalten verursacht.) benutzt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
{
   int i = 0;

   while (i < 100)
   {
      i++;
      std::cout << i;
   }
}
:love: := Go;

37

24.02.2013, 10:00

Der Vorteil der for-Schleife liegt schon darin, dass man direkt auf den ersten Blick genau sieht, wie oft zu ausgeführt wird. Dieses 'genau' muss dabei nicht heißen 17 mal, sondern kann auch heißen "Für jedes Element eines Containers". Der Vorteil ist dann halt, dass man im Codeblock fast machen kann, was man will, ohne eine Endlosschleife zu erhalten. Natürlich kann man da Blödsinn machen, so dass dies nicht mehr gilt, aber komischen Blödsinn kann man beim Programmieren ja immer und überall machen.
Achja: Rekursive Funktionen haben auch sehr große Ähnlichkeiten mit Schleifen. Ich erwähne das nur, weil es für ein Problem immer mehrere Lösungen gibt, und die Verantwortung des Programmierers es ist, die beste zu finden. Und zu 'beste' zählt sicherlich auch, dass der Code gut Lesbar bleibt, weil irgendwann muss man den garantiert noch einmal anpacken.
Lieber dumm fragen, als dumm bleiben!

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

38

24.02.2013, 11:36

Mh anscheinend hat es ja doch Vorteile, den Zähler im Aktionsteil zu inkrementieren zu lassen, statt im Codeblock :o
Dann werde ich es wohl auch im Aktionsteil weiter belassen.

Was heißt hier anscheinend? Auf jeden Fall!
Public Service Summary:

Zudem, ob man es nun zugeben will oder nicht, vergisst man gern das Inkrement/Dekrement, wenn man es nicht oben rein schreibt. Beim Öffnen der Schleife denkt man noch: "Ah joar, den Counter zähle ich weiter unten durch". Nach dem ersten Programmlauf fasst man sich dann an die Stirn, weil man's eben doch wieder vergessen hat, nachdem man die ersten 5 Zeilen innerhalb der Schleife geschrieben hat.

Zudem erleichtert eine For-Schleife mit vorhandenem Inkrement/Dekrement die Wartbarkeit deutlich. Man findet nach 3 Monaten nämlich noch immer sofort raus, wie oft die Schleife wohl vermutlich laufen wird, was nicht sofort ersichtlich wäre, würde man das irgendwo im restlichen Kram der Schleife erledigen. Gerade Anfänger tendieren ja dazu so eine Schleife mal eben länger als 10 Zeilen werden zu lassen und da müsste man schon ziemlich lange suchen, bis man es hat. So will kein Mensch auf Dauer debuggen, das strengt tierisch an.

Wenn man den Zähler im Schleifenrumpf erhöht/verringert, funktioniert continue nicht so, wie man es wollen würde.

Fazit: Da du im Schleifenrumpf in der Regel das aktuelle (gerade im Bedingungsteil geprüfte) Element und nicht schon das nachfolgende behandeln willst, erfordert ein konsistenter Iterationszustand praktisch immer die Aktion am Ende des Schleifenrumpfes. Aber das Ende ist nicht nur verdammt weit weg, sondern muss mit continue nicht mal in jedem Durchlauf erreicht werden. Mit dem Aktionsteil hast du im Schleifenkopf der for-Schleife unüberbrückbar alles zusammen, was zusammen gehört. Deshalb: for-Schleife wenn möglich, while-Schleife wenn die for-Schleife den Code unvertretbar umständlich macht.

Tipp 1: Jeder Teil der for-Schleife ist optional. Eine while-Schleife ist dann sinnvoll, wenn deine for-Schleife so aussieht: for(; Bedingung; ). Lassen sich mindestens 2 Teile der for-Schleife sinnvoll ausfüllen, solltest du auch for benutzen.

Tipp 2: Wurde bereits kurz in diesem Thread angedeutet: Bei der Entfernung einzelner Elemente in einer Schleife empfiehlt sich meist Rückwärtsiteration. Iterierst du vorwärts, musst du bei jeder Entfernung die Iteratorposition korrigieren, um das nächste, von hinten nachgerutschte und sich nun an derselben Position befindliche Element nicht zu überspringen. Iterierst du rückwärts, hast du alle nachrutschenden Elemente bereits betrachtet und kannst unbeirrt weiter nach vorne iterieren. Achtung: Bei Entfernung aus Containern muss der Iterator ggf. trotzdem ersetzt werden, erase-Methoden geben dir i.d.R. einen gültigen Iterator auf das nächste Element zurück. Diesen Iterator musst du im Gegensatz zur Vorwärtsiteration bei der Rückwärtsiteration dann jedoch nicht in seiner Position korrigieren.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CodingCat« (24.02.2013, 11:43)


Werbeanzeige