ganz einfache c frage (break, verschachteltes for)

Gast #1710726
Lesenswert?

>       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!
#1710735
Lesenswert?

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
Lesenswert?

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
Lesenswert?

> 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!
#1710856
Lesenswert?

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:
1
#include <iostream>
2

3
int main( int nargs, char **args )
4
{
5
  size_t i = 0;
6
  try
7
  {
8
    while( ++i, true )
9
    {
10
      std::cout << "Hallo" << std::endl;
11
      if( !(i-5) )
12
      {
13
        throw "raus!";
14
      }
15
    }
16
  }
17
  catch( const char *warum )
18
  {
19
    std::cout << "bin " << warum << std::endl;
20
  }
21
}
Gast #1710892
Lesenswert?

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.
#1710895
Lesenswert?

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++.
#1710897
Lesenswert?

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?
#1710906
Lesenswert?

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? :-)
Gast #1710911
Lesenswert?

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.
#1710914
Lesenswert?

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.
Gast #1710956
Lesenswert?

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.
#1711014
Lesenswert?

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
#1711553
Lesenswert?

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
(Firma: Schweigstill IT) Persönliche Seite #1711557
Lesenswert?

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!
#1711568
Lesenswert?

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
(Firma: Schweigstill IT) Persönliche Seite #1711647
Lesenswert?

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>
#1711695
Lesenswert?

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 ;-)
(Firma: Schweigstill IT) Persönliche Seite #1711718
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren