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?
ist aber langsamer, da bei break direkt rausgesprungen wird, bei deiner
Variante aber in jedem Schleifendurchlauf zusätzlich die Variable
ausgewertet werden muss
> 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.
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.
> 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...
;)
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.
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:
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:
1
klaus@i4a:~ > cat t.cpp
2
#include <iostream>
3
4
int main( int nargs, char **args )
5
{
6
size_t i = 0;
7
try
8
{
9
while( ++i, true )
10
{
11
std::cout << "Hallo" << std::endl;
12
if( !(i-5) )
13
{
14
throw "raus!";
15
}
16
}
17
}
18
catch( const char *warum )
19
{
20
std::cout << "bin " << warum << std::endl;
21
}
22
}
23
klaus@i4a:~ > g++ -Wall -Wextra t.cpp && ./a.out
24
t.cpp:3: warning: unused parameter ‘nargs’
25
t.cpp:3: warning: unused parameter ‘args’
26
Hallo
27
Hallo
28
Hallo
29
Hallo
30
Hallo
31
bin raus!
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? :-)
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)
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 ;-)
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.