for Schleife beenden
-
Hallo,
gebe zu, das diese Version mir nicht bekannt war.
Für die Info's aller, vielen Dank.
Gruß Siegfried
-
@akari
Das mit dem inline wird dir hier auch nichts helfen da der Compiler (zumindest der BCB) Funktionen die for enthlten nicht inline machen wird. Siehe auch Warnung W8027
-
Hallo Sunday
funktionsaufrufe bringen nur unnötigen overhead.
@beppo und epsilon
ihr scheint wohl nicht zu wissen, wie for funktioniert.ein tolle Overheadversion hast Du da vorgeschlagen. Deine Stopprüfung findet exakt x * y * z mal statt. Was glaubst Du ist schneller und braucht weniger Code, ein Prozeduraufruf oder dein Stopptest
Gruß rudiS
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Und hier der verpönte Klassiker, der aber optisch am klarsten zeigt was passieren soll.
Bei der guten Lösung
for (int i = 0; !Stop && i < 10; ++i)
muß aber dennoch meistens ziemlich lange suchen, da meistens noch zusätzlicher Code in der Schleifen steht, um festzustellen, das hier aus 3 Schleifen ausgestigen werden soll.
Die Funktionsaufrufmethode, die nur dazu dient ein goto zu umgehen und brav dem Dogma zu gehorchen ist ja wohl abzulehnen
Dies ist einer der wenigen Fälle, an denen ich wegen der Klarheit eine goto akzeptiere,
bool b=true; for(...)//1. { for(...)//2. { for(...)//3. { if(...) { b = false; goto EndOfLoops; } }//3. if(b==false) break; }//2. if(b==false) break; }//1. EndOfLoops:
-
Sunday schrieb:
@akari:
funktionsaufrufe bringen nur unnötigen overhead.Die Codes die unter dieser Prämisse optimiert werden, möchte ich nicht warten müssen.
Bevor man sowas nötig hat sollte man besser sein Gesamtkonzept und die verwendeten
Algorithmen überprüfen, das bringt in 99% aller Fälle mehr als solche "Korinthen-Kackereien".Obige Aussagen gelten natürlich nur für ein professionelles Umfeld. Für einen
"quick-and-dirty" Hack kann jeder tun was er will sofern das Ergebnis stimmt.
-
Mann kann sachen aus wissentlich mißverstehen. Es ging hier um die Aussage, mehrere Schleifen direkt zu verlassen. um in der äußeren Schleife die Abfrage auf die break Bedingung zu vermeiden wollte man aus dem Teil ein Unterfunktion machen nach dem Motto "if (rc!=fktcall()) break", das ist wirklich Overhead.
Da ist Sunday´s Version um Klassen besser.Mit inlining kann man auch nicht Quatsch den man durch unnötige, sinnlose Funktionsaufrufe künstlich erzeugt, wieder aushebeln.
-
PAD schrieb:
@Redhead
if (rc!=fktcall()) breakDavon war war auch gar keine Rede. Vielleicht solltest du dir den angegebenen
Vorschlag nochmals durchlesen.
-
Sorry redhead, dieser Vorschlag kam am Anfang von Akari
-
Nur damit es auch noch da steht:
try { for(int i=0; i<10; ++i) { for(int j=0; j<10; ++j) { for(int k=0; k<10; ++k) { if(a[i][j][k] == 0) throw; } } } } catch(...) { }
Das würde ich verwenden wenn der Abruch wirklich eine Ausnahme ist. Auf solche verschachtelten Konstruktionen kann man aber imo meistens verzichten...
-
Hm, ich weis zwar jetzt nicht, ob das ISO-Konform ist, aber warum nicht einfach die bereits vorhandenen Bedingungen zu einem Wiederspruch führen:
for (int i = 0; i < 10; ++i) { for (int j = 0; j < 10; ++j) { for (int k = 0; k < 10; ++k) { // abbruch wenn k = 5 if (k == 5) { i = 10; j = 10; break; } } } }
-
MFK schrieb:
*couchzurechtrück*
*popcornhol*Ist noch ein Platz frei?
Hat eigentlich mal jemand gezählt, wie oft wir dieses Thema schon durchgekaut haben?
-
Schreibt man goto´s in C++ so kompliziert?
Ich hoffe für mich ist auch noch ein Platz auf der Couch
-
PAD schrieb:
Schreibt man goto´s in C++ so kompliziert?
Ich hoffe für mich ist auch noch ein Platz auf der Couch
Nein ich hab ja dazugeschrieben ich würde es nur verwenden wenn der Abbruch der Schleife eine Ausnahme ist die dann noch behandelt werden muss.
-
Ich bin in C++ nicht so sattelfest, sonst hätte ich´s zu meiner C goto Lösung dazugeschrieben, für die dieselbe Post(Pre)misse gilt.
-
groovemaster schrieb:
Ist noch ein Platz frei?
PAD schrieb:
Ich hoffe für mich ist auch noch ein Platz auf der Couch
Sicher, setzt euch
Habt ihr spezielle Favoriten?
Die Abbruchvariable-idtiotisch-Finder oder die Funktionsaufruf-wegen-Overhead-Ablehner oder die Dogmatischen-Goto-Verteufler? Oder gar die Exceptions-vor-Missbrauch-Schützer? Von denen hatten wir bis jetzt noch keinen, genau wie von den Bei-auf-Endwert-setzen-der-äußeren-Schleifenvariablen-die-Hände-über-dem-Kopf-Zusammenschlager. Aber die Vorlage ist ja schon da...
-
Beppo schrieb:
goto Befehle werden von C++ Programmierer ungern gesehehen.
c++ programmierer haben ja exceptions
try { for(;;) for(;;) for(int x=0; x<10; x++) { cout << x << endl; if (x == 2) throw(0); // leave all loops } } catch(...) { // intentionally no code here } //... hier geht's weiter
btw: ach wie gut, dass ich c-coder bin. ich darf goto nehmen
edit: mist, sowas stand ja schon hier
-
Natürlich könnte man auch die 3 Schleifen zu einer "vereinfachen":
for(int i=0, j=0, k=0; i<3; ++k<3 ? 0 : (++j<3 ? k=0 : j=0&++i)) { if(...) break; }
*duck-und-weg*
Fireflow^^
-
Hallo,
habe auch den Rest verfolgt. Man sieht, das es verschiedene Möglichkeiten ergibt, eine Aufgabe zu lößen. Ich habe die Version von @Sunday genommen, da diese für mich eine überschaubare Lösung darstellt.
Gruß Siegfried
-
MFK schrieb:
Habt ihr spezielle Favoriten?
MFK schrieb:
die Funktionsaufruf-wegen-Overhead-Ablehner
Definitiv mein Favorit.