Gast
#1709595
Hallo
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Beendet das break nur die innere Schleife oder beide?
|
Anzeige
|
ganz einfache c frage (break, verschachteltes for)
Gast
#1709595
Hallo
Beendet das break nur die innere Schleife oder beide? Ohne label nur die innere... Was spricht eigentlich dagegen es auszuprobieren?
Gast
#1709615
Selbst ist der Mann... Läubi .. schrieb: > Ohne label nur die innere... Was spricht eigentlich dagegen es > auszuprobieren? oder gar ein Buch zu lesen?
Gast
#1709660
OK, danke, bin mittlerweile durch ausprobiern auch draufgekommen. @link zu warum ä als ae schreiben, aber dann scharf ß.
Gast
#1709668
Linux schrieb: > warum ä als ae schreiben, aber dann scharf ß. Das 'ß' habe ich übersehen... ;-) Läubi .. schrieb: > Ohne label nur die innere... Was spricht eigentlich dagegen es > auszuprobieren? was heist denn ohne Label? wie sieht es denn mit aus? da steht halt irgendwo noch ein label: dabei. Platz kannst du dir fast frei aussuchen (wo halt ausführbare Anweisungen stehen dürfen in Funktionen).
Gast
#1709819
Klar kann man irgendwo ein Label hinschreiben. Aber was für eine Änderung erwartest du dir davon?
Gast
#1709846
break = böse es geht auch ohne, z.B.:
oder so ähnlich ist aber langsamer, da bei break direkt rausgesprungen wird, bei deiner Variante aber in jedem Schleifendurchlauf zusätzlich die Variable ausgewertet werden muss
Gast
#1709995
Warum verwaendert ihr nicht einfach eine goto Anweisung? Vielleicht so:
@ mp (Gast)
>Warum verwaendert ihr nicht einfach eine goto Anweisung?
Weil das Böse^3 ist!
MfG
Falk
Gast
#1710726
> ist aber langsamer, da bei break direkt rausgesprungen wird, bei deiner > Variante aber in jedem Schleifendurchlauf zusätzlich die Variable > ausgewertet werden muss Da kann ich ja nur lachen, als ob 2 Taktzyklen kritisch wären. Falls dus wirklich Böse^10 machen willst kannst auch Inline-Assembler verwenden und explizit die Code-Addresse angeben an der du landen willst. Man man man, wir leben im 21. Jahrhundert, dort hat break KEINE daseinsberechtigung. Wirklich KEINE! PS: Ja du wirst jetzt aggresiv reagieren und es trotzdem antworten, und in 2 Tagen kommt ein neuer Post "Misteriöser Fehler im Programm" und niemand wird ihn finden. Break = Böse! Versteht das einfach mal! bla schrieb: > Da kann ich ja nur lachen, als ob 2 Taktzyklen kritisch wären. Das kommt auf den Prozessor an. sind die Register belegt ist das ein Laden von einer Adresse, eine Auswertung und eine logische Verknüpfung mit der restlichen Bedingung. Das kann in verschachtelten Schleifen (zB Imageprozessing) einen durchaus relevanten Anteil haben. > Man man man, wir leben im 21. Jahrhundert, dort hat break KEINE > daseinsberechtigung. Wirklich KEINE! Man sieht, dass du offensichtlich keine Ahnung von der Industrie hast. Wenn man nur 10Cent sparen kann um einen billigeren Controller zu benutzen, dann wird das gemacht. Bei einem Absatz größer 1Mio Stück kann man schon mal einen Ingenieur 1 Jahr lang Code optimieren lassen. bla schrieb: > PS: > Ja du wirst jetzt aggresiv reagieren und es trotzdem antworten, und in 2 > Tagen kommt ein neuer Post "Misteriöser Fehler im Programm" und niemand > wird ihn finden. von mir sicherlich nicht.
Gast
#1710747
Wenn die Alternative ein "verstecktes break" ist (in Form eines Flags, welches bewirkt, dass an denselben Codestellen ab sofort nix mehr/was anderes gemacht wird), ist ein echtes break alles andere als böse. Bei einem versteckten break (Flag) muss man immer erstmal nachschauen, wo es noch gesetzt/gelöscht wird, was noch davon abhängt, und ob es nicht gar ein verstecktes goto ist. Wenn ich break lese, weiß ich, dass ab jetzt die Schleife nicht mehr weiter bearbeitet wird. Punkt.
Gast
#1710761
> Man man man, wir leben im 21. Jahrhundert, dort hat break KEINE > daseinsberechtigung. Wirklich KEINE! Vor allem haben religiöse und quasireligiöse Glaubenskriege ihre Daseinsberechtigung verloren. Warum kein goto oder break, wenn's Sinn macht und der Gott des Chips (aka Developer) es so WILL? Und er sagte: Spring!, und der Prozessor sprang, und er sah dass er gut sprang! bla schrieb: > Man man man, wir leben im 21. Jahrhundert, dort hat break KEINE > daseinsberechtigung. Wirklich KEINE! Die Einen orientieren sich beim programmieren am C-Standard, die Anderen scheinbar am Kalender... ;) bla schrieb: > Break = Böse! > Versteht das einfach mal! Das ist gequirlter Quatsch. Versteh das mal einfach.
Gast
#1710811
Kommen nicht in switch-case-Blöcken Haufenweise breaks vor, oder lebe ich hinterm mond, dass ich noch sowas benutze und nicht lieber ein verschachteltes If-else baue? Sven schrieb: > Kommen nicht in switch-case-Blöcken Haufenweise breaks vor... Ja, aber auch da sind sie inzwischen böse! Lieber von dort mit einem goto hinter das switch springen. C ist insgesamt böse. Mit oder ohne goto. Stimmt. Ich sollte vielleicht doch zu BASIC wechseln. Oder C++ nehmen und dabei alles weglassen, was C ist. Vielleicht geht das ja? Da kommt man notfalls mit einer Exception aus einer Schleife raus:
Hmm, eine komische Exception-Klasse die du da wirfst... Ich kann werfen, was ich will. Wir sind hier doch nicht bei Java!
Klaus Wachtler schrieb: > Ich kann werfen, was ich will. Richtig, aber dann kündige nicht C++ an und schreib dann sonstwas... Ist das nicht C++? Der gcc übersetzt das.
Gast
#1710892
Wenn schon Java dann richtig : class WatteBauschchenException extends Exception ... und hackt doch nicht auf dem armen bla so rum, der traut sich ja nicht mal ein richtigen alias zu benutzen. Soll er uns doch mal die Lösung für das 21 Jahrhundert für das gestellte Problem zeigen. Ich bin gespannt ob da noch was kommt und lerne gerne dazu. Klaus Wachtler schrieb: > Ist das nicht C++? > Der gcc übersetzt das. Ich habe eben nochmal nachgelesen, also throw nimmt eigentlich nur Klassen entgegen. Man kann sogar ein std::string werfen, dann ist aber die Frage: wer räumt den geworfenen String wieder ab? Deine Version mit dem stack text ist schon etwas komisch und vielleicht auch nur eine GCC Erweiterung (wie auch die Ranges bei der switch() Anweisung) - oder er erstellt implizit ein std::string. Obwohl, das kann wieder nicht sein, weil implizit würde Stack Objekt voraussetzen und der würde mit verlassen der Funktion wieder abgeräumt werden und somit würde jeder äußere Handler in die Grütze greifen. Das wiederrum lässt einen auch wieder zu der Aussage verleiten: der geworfene String darf kein lokaler sein, weil sonst im äußeren Handler der String schon wieder weg ist... Fragen über Fragen, aber so ein Konstrukt wie deins, ist mir noch nicht untergekommen. Ich vermute eine GCC Erweiterung. Ich würde mal behaupten, es ist kein Standard C++. U.R. Schmitt schrieb: > Wenn schon Java dann richtig : > class WatteBauschchenException extends Exception ... Sorry, aber ich wollte doch gar nicht Java nehmen! Ich schrub C++! Kann es sein, daß wir irgendwie aneinander vorbeischreiben und -werfen? > und hackt doch nicht auf dem armen bla so rum, der traut sich ja nicht > mal ein richtigen alias zu benutzen. Was ist denn sein richtiger Alias? Blabla? Thomas K. schrieb: > Ich habe eben nochmal nachgelesen, also throw nimmt eigentlich nur > Klassen entgegen. Wer sagt das? Das wäre mir neu. Kann sein, daß es an mir vorbeigegangen ist... Der gcc schluckt es aber wirklich:
Thomas K. schrieb: > Man kann sogar ein std::string werfen, dann ist aber > die Frage: wer räumt den geworfenen String wieder ab? Der unwinding-Mechanismus. Wie bei allen automatischen und temporären Variablen. Thomas K. schrieb: > Deine Version mit > dem stack text ist schon etwas komisch... Vielleicht nicht unbedingt empfehlenswert, zugegeben. Aber was hat das mit dem Stack zu tun? Thomas K. schrieb: > oder er > erstellt implizit ein std::string. nein, ich fange doch ein const char* Thomas K. schrieb: > und der würde mit > verlassen der Funktion wieder abgeräumt werden und somit würde jeder > äußere Handler in die Grütze greifen. Das wiederrum lässt einen auch > wieder zu der Aussage verleiten: der geworfene String darf kein lokaler > sein, weil sonst im äußeren Handler der String schon wieder weg ist... Man kann in C++ werfen, was man will. Es wird bei Bedarf ein temporäres Objekt als Kopie angelegt, und das fliegt dann durch die Gegend.. Klaus Wachtler schrieb: > Fragen über Fragen, aber so ein Konstrukt wie deins, ist mir noch nicht > untergekommen. Ist es deshalb falsch? :-)
Gast
#1710911
Klaus Wachtler schrieb: > Was ist denn sein richtiger Alias? Blabla? Ne das schreibt er nur :-) Jungs mal im Ernst (bitte nicht nochmal die Diskussion was ist besser C++ oder Java) aber wenn ich versuche die Diskussion mit dem throw in c++ zu verstehen, habe ich in der gleichen Zeit in Java für ein gesamtes Programm das Fehlerhandling geschrieben. Manchmal ist weniger doch mehr. (No offend, Gerätetreiber, Systemprogramme und vor allem Microcontroller will ich nicht in Java programmieren). Schönes Wochenende. Auch ohne jetzt den Längenvergleich provozieren zu wollen, aber: Was ist in C++ da schwieriger als in Java? In Java muß man eine Standardklasse für Ausnahmen nehmen, in C++ sollte man das wg. Verständlichkeit, kann aber prinzipiell alles werfen, niemand verbietet es. C++ halt. Nimmt man also die Standardklasse, sind doch beide ziemlich gleich. Wenn man jetzt aus vielen vielen ganzvielen ineinander verschachtelten Schleifen heraus will, dann ist ein goto nicht nur gut, sondern sogar optimal. :-) (aber auch so ziemlich der einzige Anwendungsfall, in dem man es verwenden sollte) Ich glaube ich verkneife mir jetzt die Frage, ob deine ganz vielen ineinandergeschachtelten Schleifen nicht auch böse sind :-)
Gast
#1710956
Mark Brandis schrieb: > Wenn man jetzt aus vielen vielen ganzvielen ineinander verschachtelten > Schleifen heraus will, dann ist ein goto nicht nur gut, sondern sogar > optimal. :-) (aber auch so ziemlich der einzige Anwendungsfall, in dem > man es verwenden sollte) Ich wüßte noch einen zweiten, und zwar das Aufräumen im Fehlerfall, wobei man das in C++ auch mit RAII machen kann. Klaus Wachtler schrieb: > Ich glaube ich verkneife mir jetzt die Frage, ob deine ganz > vielen ineinandergeschachtelten Schleifen nicht auch böse sind :-) Man sollte sich zumindest sehr gut überlegen, ob man die nicht in mehrere Funktionen aufteilt. Ganz allgemein würde ich sagen, daß es ganz besonders böse ist, irgendwas ganz allgemein als "böse" zu bezeichnen. Thomas K. schrieb: > Ich habe eben nochmal nachgelesen, also throw nimmt eigentlich nur > Klassen entgegen. Aber nicht im Standard. Gleich das erste Beispiel dort im Abschnitt "Throwing an exception" benutzt ein String-Literal als Exception, mit dem dazugehörigen "catch(const char* p) ...". Offenbar hat sich da jemand davon in die Irre führen lassen, dass immer die Rede von einem "Object" ist, das geworfen wird. Ein "Object" meint aber nicht nur Instanzen von Klassen, auch z.B. ein Integer oder ein Pointer fallen durchaus darunter. Andreas Klaus Wachtler schrieb: > Ich glaube ich verkneife mir jetzt die Frage, ob deine ganz > vielen ineinandergeschachtelten Schleifen nicht auch böse sind :-) Also bis zu drei sind sicher drin, mehr als das? Hm. In der Mathematik gibt es ja bis zu unendlich vielen Dimensionen, auch wenn ich nie so ganz verstanden habe wozu man die braucht ;-) Mark Brandis schrieb: > In der Mathematik > gibt es ja bis zu unendlich vielen Dimensionen, auch wenn ich nie so > ganz verstanden habe wozu man die braucht ;-) Unter anderem um Probleme zu beschreiben, die jeder Mensch Tag für Tag löst, ohne sich über die mathematischen Hintergründe Gedanken zu machen ;-) Beispiel: du willst einen neuen Rechner kaufen. Dabei spielen Kriterien wie Prozessor, Mainboard, Arbeitsspeicher, Hersteller, Festplattengrösse, Bildschirmauflösung, Preis und und und eine Rolle. Mathematisch betrachtet ist also die Auswahl deines neuen Rechners ein Problem mit locker 10 und mehr Dimensionen, die noch dazu teils komplex voneinander abhängen (die Wahl des Mainboards hängt vom Prozessor ab etc.). Andreas Vlad Tepesch schrieb: > bla schrieb: >> Da kann ich ja nur lachen, als ob 2 Taktzyklen kritisch wären. > Das kommt auf den Prozessor an. Das kommt vor allem auf die Anwendung an. Vor einigen Jahren (~1996) arbeiteten Kollegen mit einem Simulationsprogramm und hatten dort mit tage- und wochenlangen Berechnungen zu kämpfen. Ich schaute mir den Quellcode an und konnte durch minimale Umstellungen von Schleifen schon etwa eine Verzehnfachung des Durchsatzes erreichen! Und mit ein paar anderen Optimierungen zusammen ergab sich nochmals eine Steigerung um 10%. Auch heute gibt es Simulationen und andere Berechnungen mit einem gigantischen Rechenleistungsbedarf, so dass auch dort schon minimale Optimierungen gewaltige Auswirkungen haben können. Es geht ja nicht darum, dass die o.g. zwei Taktzyklen nur einmalig ausgeführt werden sollen, sondern dass ggf. zehnzausend Prozessoren sie jeweils pro Sekunde eine Million Male ausführen müssen! Andreas Schweigstill schrieb: > Auch heute gibt es Simulationen und andere Berechnungen mit einem > gigantischen Rechenleistungsbedarf, so dass auch dort schon minimale > Optimierungen gewaltige Auswirkungen haben können. In dem Bereich wird auch heute immer noch oft FORTRAN eingesetzt, da einerseits die Compiler dafür meines Wissens immer noch ein bisschen besser optimieren können als C-Compiler, andererseits gerade im mathematischen Bereich dafür Bibliotheken existieren, in denen Jahrzehnte der Optimierung stecken. Aber bei jemandem, der meint, break wäre nicht mehr zeitgemäss, da wir ja im 21. Jahrhundert sind, würde da vermutlich der Kopf explodieren oder so ;-) Andreas Andreas Ferber schrieb: > In dem Bereich wird auch heute immer noch oft FORTRAN eingesetzt, da > einerseits die Compiler dafür meines Wissens immer noch ein bisschen > besser optimieren können als C-Compiler, Hmm, ich glaube, das ist mittlerweile eher ein Gerücht, das der FORTRAN-Fraktion das Gefühl vermitteln soll, softwaretechnisch immer noch auf der Höhe zu sein. Für bestimmte Rechnerarchitekturen gibt es bei HPF (High Performance FORTRAN) auch leistungsfähige Konzepte zur Nutzung von massiv parallelen Systemen. Ich hatte mich hinsichtlich des damaligen Projektes überhaupt nicht zu den Programmiersprache geäußert, die dafür eingesetzt wurde. Schleifenkonstrukte, die sich umstellen lassen, gibt es in den meisten Programmiersprachen, insbesondere dem großen Haufen der imperativen. Aber es war in der Tat ein C-Programm. Es lief damals im Hintergrund auf den OS/2-Rechnern der Arbeitsgruppe sowie später auch auf verschiedenen UNIX-Systemen (Sun, DEC Alpha) im Uni-Rechenzentrum. > andererseits gerade im > mathematischen Bereich dafür Bibliotheken existieren, in denen > Jahrzehnte der Optimierung stecken. Nicht nur Bibliotheken, sondern auch komplette Programmpakete dienen da als Vorlage. Und an einigen Instituten lehren die Dozenten eben auch nur FORTRAN, weil sie keine andere Programmiersprache kennen. Für den jeweiligen Anwendungsfall, nämlich die Erweiterung vorhandener (FORTRAN-)Programmpakete, mag das ja auch völlig ausreichend sein. Nicht jeder Wissenschaftler hat schließlich Lust, als Programmierer oder SW-Entwickler zu arbeiten/verenden. <historischeverklaerung> Ich finde, das alte DQS (Distributed Queuing System) von VMS immer noch unübertroffen! Zwar gibt es unter UNIX/Linux auch schon haufenweise Ansätze, aber das Aufsetzen eines neuen Rechners in einem VAX-Cluster und die Bereitstellung der Ressourcen war damit trivial. </historischeverklaerung> Andreas Ferber schrieb: > Beispiel: du willst einen neuen Rechner kaufen. Dabei spielen Kriterien > wie Prozessor, Mainboard, Arbeitsspeicher, Hersteller, > Festplattengrösse, Bildschirmauflösung, Preis und und und eine Rolle. > Mathematisch betrachtet ist also die Auswahl deines neuen Rechners ein > Problem mit locker 10 und mehr Dimensionen, die noch dazu teils komplex > voneinander abhängen (die Wahl des Mainboards hängt vom Prozessor ab > etc.). Ja gut, aber ich meine jetzt Räume mit mehr als 3 Dimensionen. Das kann man sich nicht mehr anschaulich vorstellen, und die Mathematiker behaupten meines Wissens nach, dass man auch Räume mit z.B. 26 Dimensionen mit senkrecht zueinander stehenden Vektoren aufspannen kann, wenn ich das richtig mitbekommen habe. Ich halte das ja für Humbug ;-)
Gast
#1711704
es ist nicht zeitkritisch, die Schleife wird ~3000 * 32*16 mal durchlaufen, ausserdem ist das bissl if nicts gegen das strcmp das danach steht.
Gast
#1711707
Und ausserdem ist break gut, ich verwende es häufig. goto dagegen mag ich nicht in C. Mark Brandis schrieb: > Räume mit z.B. 26 > Dimensionen mit senkrecht zueinander stehenden Vektoren aufspannen kann, > wenn ich das richtig mitbekommen habe. Ich halte das ja für Humbug ;-) Oh, das ist ganz einfach. Mögliche Einheitsvektoren für einen solchen Raum sind: (1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), (0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), . . . (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1) Räume mit mehr als drei Ortsachsen kann man sich behelfsweise unter Zuhilfenahme andersartiger Achsen vorstellen, so z.B. einer Zeitachse. Betrachtet man ein stationäres vierdimensionales System, so kann man sich einfach eine dreidimensionale Schnittebene vorstellen, die man durch den vierdimensionalen Raum bewegt. Dadurch hat man die vierte Dimension gedanklich in einen zeitlich veränderlichen Parameter transformiert. Um einen besseren räumlichen Eindruck zu gewinnen, muss man sich nur vorstellen, wie es aussieht, wenn man unterschiedliche Raumachsen zur Zeitachse macht. Hat man jedoch ein zeitlich veränderliches System, darf man die Zeitachse des Systems und die Hilfszeitachse in Gedanken nicht miteinander verwechseln. Auch für höhere Dimensionen gibt es Konzepte, sich das ganze zu veranschaulichen. Mark Brandis schrieb: > Ja gut, aber ich meine jetzt Räume mit mehr als 3 Dimensionen. Das kann > man sich nicht mehr anschaulich vorstellen, muss man auch nicht. Solange man damit rechnen kann genügt das. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|