Mit break aus for(..;..;..) raus?
-
merker schrieb:
Weil die Laufbedingungen voneinander unabhängig sind obwohl sie zusammen eine Schleife (Einheit, Kontrollstruktur) bilden.
Würde man zu "Testzwecken" eine oder mehrere Laufbedingungen auskommentieren, würde man "irgendwas" aber nicht die Schleife testen.
Und, weiter?
-
Eine Schleife -> Eine Laufbedingung.
Das ist eigentlich alles soweit.

pale dog schrieb:
aber ist das nicht egal?
wenn beide bedingungen vorhersehbar sind, kann man doch ganz genau bestimmen, wie sich die schleife verhalten wird.Das ist gut gesagt ! Man bestimmt, wie sich die Schleife verhalten wird. Sowas ist kein Test.
-
merker schrieb:
pale dog schrieb:
aber ist das nicht egal?
wenn beide bedingungen vorhersehbar sind, kann man doch ganz genau bestimmen, wie sich die schleife verhalten wird.Das ist gut gesagt ! Man bestimmt, wie sich die Schleife verhalten wird.
ja, und?

das geht doch aucht bei mehreren abbbruchbedingungen?
-
merker schrieb:
Schleifen mit mehr als einer Laufbedingung sind nicht validierbar !
Würde mich auch interessieren warum nicht.
void my_strncpy(char* dest, char const* src, size_t length) { while (length && *src) { *dest++ = *src++; length--; } if (length) memset(dest, 0, length); }Wo ist da jetzt das Problem?
Und wenn du jetzt sagst das gilt nicht als "mehr als einer Laufbedingung", dann sage ich: definiere "mehr als einer Laufbedingung"
-
halte die aussage "Schleifen mit mehr als einer Laufbedingung sind nicht validierbar !" für unhaltbar. natürlich sind auch schleifen mit mehr als einer laufbedingung validierbar.
allerdings vertrete ich trotzdem die auffassung: je weniger laufbedingungen, desto gut

die verwendung von kontrollstrukturen wie break und continue sorgt, korrekt angewendet, für wesentlich bessere lesbarkeit eines stückes code.
das beispiel von hustbaer setzt kenntnis der funktionsweise von C voraus, um den code verstehen zu können. man muss wissen, dass C den wert 0 als bool'schen ausdruck akzeptiert. zudem muss man wissen, was der dereferenzierungsopertor * tut.
natürlich könnte man jetzt argumentieren, dass sich niemand ohne C kenntnis einen C quellcode angucken sollte. aber ich bin der meinung, dass man code so gestalten sollte, dass er die einfachst mögliche verständnis bei fremdlesern ermöglicht. das hat nun natürlich nicht direkt was mit "break" zu tun, ist aber allgemeingültig.
-
hustbaer schrieb:
Und wenn du jetzt sagst das gilt nicht als "mehr als einer Laufbedingung" ...
Deine while-Schleife gilt ohne weiteres als mit "mehr als einer Laufbedingung" (hat zwei, um genau zu sein). Nun teste sie mal !

-
merker schrieb:
Deine while-Schleife gilt ohne weiteres als mit "mehr als einer Laufbedingung" (hat zwei, um genau zu sein). Nun teste sie mal !

nun spann uns nicht so auf die folter. was ist schwierig am testen?
-
Es gibt kein Testverfahren !
Angenommen man testet "length" mit Werten von 0..20 : Welchen Wert (und mit welcher Begründung) soll "*src" dabei haben ?
Kein Test -> Keine Validierung

-
Sorry, ich dachte es geht hier um Beweisbarkeit. Und beweisbar is die allemal, da wette ich meinen Hintern drauf.
-
merker schrieb:
Es gibt kein Testverfahren !
Angenommen man testet "length" mit Werten von 0..20 : Welchen Wert (und mit welcher Begründung) soll "*src" dabei haben ?
Kein Test -> Keine Validierung

Testverfahren wofuer? Was willst Du ueberhaupt validieren?
-
@keinlehrer:
Wie soll ich es sonst machen? Ein template "dereferenziere_zeiger" schreiben? OMFG...Ich bin auch für leserlichen Code, aber ich erwarte mir schon grundlegende C++ Kenntnisse. Irgendwo muss natürlich Schluss sein, das gilt aber eben in beide Richtungen. Code wird auch dadurch unleserlich und schwer verständlich dass er zu "verbose" ist, u.a. da solcher Code dazu tendiert erheblich länger zu sein als "vernünftiger" Code.
@merker:
Doh!?
Wie willst du mit Tests überhaupt irgendwas was praktisch anwendbar ist validieren. Du müsstest sämtliche möglichen Fälle testen. Anderenfalls musst du einen Beweis führen, und dann sind wir nichtmehr beim Testen sondern beim Beweisen. Und beweisen sollte sich so eine einfache strncpy Funktion allemal lassen.Oder anders rum: zeig mir eine Implementierung von strncpy die mit Tests validierbar ist, oder zumindest deutlich einfacher zu beweisen. Den Returnwert darfst du natürlich auch gerne unterschlagen wie ich das getan habe

-
alos schrieb:
Simon2 schrieb:
also schrieb:
ich hab jetzt die ersten paar seiten gelesen und da hat keiner geschrieben, dass man dieschleife in ne funktion paken und dann return machen kann, darum schreibich es jetzt mal.
Hättest mal bis zur 4. lesen sollen:
Seite 4 suche nach return -> 0 treffer.
OK, dann hättest Du halt mit Verstand suchen sollen

Gruß,
Simon2.
-
Jester schrieb:
- Was genau bedeutet für euch "mathematisch validierbar"?
- Warum sind while-Schleifen in C++ grundsätzlich nicht validierbar?Mathematisch validierbar heisst, dass man eine exakte Laufzeitanalyse durchführen kann. Und sobald nicht kalkulierbare Faktoren mitspielen, zB Benutzereingaben oder externe Signale, ist das nicht mehr möglich. Das zweite war wohl etwas unglücklich formuliert. Rein von der Definition einer while würde ich es so formulieren. Wenn man auf reale Anwendungen schaut, wäre es wohl richtiger zu sagen, while Schleifen sind nicht grundsätzlich validierbar, egal ob mit oder ohne break.
-
Simon2 schrieb:
alos schrieb:
Simon2 schrieb:
also schrieb:
ich hab jetzt die ersten paar seiten gelesen und da hat keiner geschrieben, dass man dieschleife in ne funktion paken und dann return machen kann, darum schreibich es jetzt mal.
Hättest mal bis zur 4. lesen sollen:
Seite 4 suche nach return -> 0 treffer.
OK, dann hättest Du halt mit Verstand suchen sollen

Gruß,
Simon2.
Post mal den Link dazu (links oben neben der uhrzeit die url)
-
also schrieb:
...
Post mal den Link dazu (links oben neben der uhrzeit die url)pale dog schrieb:
Jester schrieb:
Simon2 schrieb:
while(irgendeine Bedingung && !(erste Operation erfolgreich)) zweite OperationWieso nicht ?
Mach bitte aus erste Operation was zwei- oder dreizeiliges.

bool erste_operation_erfolgreich() { ... }4 zeilen

7. Post von oben.
Gruß,
Simon2.
-
Nicht die Abbruchbedinung in ne Funktion, sondern die ganze Schleife.
void machWasInDerSchleifeFunktion() { for(...) { if(...) return; } }
-
groovemaster schrieb:
Jester schrieb:
- Was genau bedeutet für euch "mathematisch validierbar"?
- Warum sind while-Schleifen in C++ grundsätzlich nicht validierbar?Mathematisch validierbar heisst, dass man eine exakte Laufzeitanalyse durchführen kann. Und sobald nicht kalkulierbare Faktoren mitspielen, zB Benutzereingaben oder externe Signale, ist das nicht mehr möglich.
Das stimmt nicht wirklich. Es mag Fälle geben, wo das so ist. Trotzdem ist das nicht immer beim Anliegen von Benutzereingaben oder externen Signalen der Fall. Die meisten Echtzeitsysteme überwachen irgendwas externes und haben sehr genaue Laufzeitschranken.
Diese Art der Validierbarkeit ist jedenfalls völlig unabhängig von der Anzahl der Bedingungen und ob break verwendet wird oder nicht.
-
also schrieb:
Nicht die Abbruchbedinung in ne Funktion, sondern die ganze Schleife.
void machWasInDerSchleifeFunktion() { for(...) { if(...) return; } }Was sollte bei einem return anders sein als bei einem break ?
(Obwohl ich zugeben muss, dass ich so ein return auch öfter verwendet habe als ein break).Gruß,
Simon2.
-
Simon2 schrieb:
Was sollte bei einem return anders sein als bei einem break ?
findest du schon selber raus :p
-
also schrieb:
Simon2 schrieb:
Was sollte bei einem return anders sein als bei einem break ?
findest du schon selber raus :p
Klar: Gar nichts.
Wollte eigentlich nur wissen, wo Du falsch denkst, aber anscheinend liegt Dir das nicht. :pGruß,
Simon2.