A
array123
Gast
Die Frage steht oben.
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
Bei Systemprogrammierung stellt der Code üblicherweise transparent dar, was tatsächlich passiert. Irgendwelche vom Compiler gestellten Automatismen sind z. B. in einem Treiber wenig hilfreich, weil bestimmte Dinge in bestimmten Kontexten (z. B. in einer Interrupt-Routine) schlicht nicht (automatisch) passieren dürfen. Deshalb macht man dann die Fehlerbehandlung "zu Fuß" und nutzt dann die unmißverständlichsten Keywords der Hochsprache fürs Branching. Aussagekräftige Labels sind da übrigens wesentlich besser als ein Haufen von breaks und Abbruchbedingungen, die man erst entschlüsseln muß.TomH22 schrieb:Ein break kann in diesem Fällen die Sache einfacher machen, allerdings löst es ggf. nicht das Problem, dass man hinterher noch erfolgsabhängig irgendwelche Dinge machen muss, weswegen man die error Variable trotzdem braucht.
In eher "archaischen" Sprachen wie C sind solche Fehlerbehandlungen immer irgendein Gebastel, was schnell unübersichtlich wird. Moderne Sprachen mit Exception Handling (try/catch, etc.) und automatischen Management von Objekt Lebenszyklen erlauben da elegantere und weniger fehleranfällige Lösungen.
Dann mache ich im Fehlerfall einfach ein "throw", und kann im Exception Handler ggf. aufräumen.
SoDaTierchen schrieb:Hier wäre ich vorsichtig. Es ist mehr als gültig, wenn man eine Schleife zum Beispiel aus Performance-Gründen vorzeitig beendet [...]. Breaks sind etwas Gutes und nichts, was man vermeiden sollte.
Schlecht ist in der Regel nur eine Schleife, die ohne Break nie abbricht.
Schleifen kann man für vieles verwenden. [...]
Wie so oft kommt es drauf an. Eine Abbruchbedingung halte ich für notwendig, aber Breaks sind nichts schlechtes.
Micke schrieb:kannst du das bitte etwas ausführen ?
Wie schade, dann erfahren wir doch gar nicht, ob du in theoretischer Informatik fit bist ;D.Micke schrieb:Ich fand die Erwähnung von Rekursionen recht gut, weil sie nicht ohne weiteres durch breaks verlassen werden können. Allerdings zählen diese nicht zu den Schleifen 🙂. Warum ist Stoff für einen anderen Thread.
Ein voreingenommener Vergleich. "Ein fauler Apfel ist besser als eine reife Orange" - ja stimmt. Gotos überführen aber trotzdem gerne mal das Programm in einen nicht vorgesehenen Zustand und werden daher zu Recht überall außerhalb von Assembler Programmierung gemieden.Wechsler schrieb:Aussagekräftige Labels sind da übrigens wesentlich besser als ein Haufen von breaks und Abbruchbedingungen, die man erst entschlüsseln muß.
Das würde ich eher bezweifeln, es wird wohl eher darum gehen, overhead-freie Abstraktionen zu haben, bzw. eher wenig Abstraktion und dafür näher an der Hardware dran. Vermutlich auch historisch bedingt, besser ging es vor 20-30 Jahren eben auch nicht. Das was du schreibst ist keine Maxime, sondern eine zwangsweise Konsequenz, dass man sich bei C besonders schnell in den Fuß schießen kann.Wechsler schrieb:C ist allerdings auch nicht als Lehrsprache entworfen worden, sondern unter der Maxime, daß der Mensch vorm Rechner besser als die Maschine weiß, was er da tut.
Danke, dann verstehe ich langsam, warum das break so unterschiedlich wahrgenommen wird.MichiSauer schrieb:Einfach gesagt sollte die Grundabbruch-Bedingung der Schleife erfüllbar sein in einer endlichen Zeit.
...
Break, Jump to etc. Also alle Bedingungen, die in die Schleife eingreifen sollten immer auch als solche gesehen und genutzt werden.
nur um zum nächsten Rendevous noch etwas mitbringen zu könnenBeBur schrieb:Wie schade, dann erfahren wir doch gar nicht, ob du in theoretischer Informatik fit bist ;D.
Ok, bei einer Interrupt Routine oder ähnlichem Low-level Code gehe ich mit. Aber im Idealfall setzt die Interrupt Routine nur einen Semaphore oder ähnliches und alles andere wird in einem Thread gemacht. Ich habe mittlerweile einiges an Code für STM32 Microcontroller in C++ geschrieben, man kann das erstaunlich gut machen. Und wenn ich ein dünnes C++ Wrapper Objekt um z.B. einen Mutex packe, das im Destructor den Mutex freigibt, dann wird der eben sicher freigegeben wenn das Objekt out-of-scope geht.Wechsler schrieb:Irgendwelche vom Compiler gestellten Automatismen sind z. B. in einem Treiber wenig hilfreich, weil bestimmte Dinge in bestimmten Kontexten (z. B. in einer Interrupt-Routine) schlicht nicht (automatisch) passieren dürfen.
Das ist eine sehe individuelle Sichtweise von Dir, die ich keineswegs als allgemein relevante Empfehlung betrachten würde.MichiSauer schrieb:Wenn ich meine Schleife immer über break verlassen muss schon. Und genau das meinte ich damit eigentlich.
Auch hier gilt: Wenn ein goto den Code klarer und sicherer macht, ist es akzeptabel. Natürlich sollte man immer darüber nachdenken was man tut.BeBur schrieb:Gotos überführen aber trotzdem gerne mal das Programm in einen nicht vorgesehenen Zustand und werden daher zu Recht überall außerhalb von Assembler Programmierung gemieden.
Das sind gute Nachrichten.TomH22 schrieb:Ich habe schon etliche junge Entwickler erlebt, die goto garnicht kennen…
Die Verteufelung hatte schon etwas technischere Gründe. Dijkstra schrieb z.B. einen Artikel (dessen Überschrift er nicht wählte und mit dem erinhaltlich nicht übereinstimmt) "The goto statement considered harmful". Es gab auch ein wichtiges Paper (finde ich grad nicht) das darüber schreibt, dass die Verifikation von Programme mit Goto nicht mehr gut möglich ist. Knuth hat dann einen Artikel veröffentlicht wo das Thema sehr ausführlich beleuchtet wird "Structured Programming with go to Statements".TomH22 schrieb:Die „Verteufelung“ von goto hat hauptsächlich historische Gründe, weil beim Übergang von unstrukturierten Sprachen wie Fortan und BASIC - in den damaligen Ausprägungen - Programierer das goto gewohnt waren und lernen mussten umzudenken.
Zumindest einen Teil (Entfernung des Loops) kenne sogar ich als jemand, der nur selten C++ Programmiert. Aber wenn wir jetzt anfangen, Kuriositäten von C/C++ zu sammeln wird der Thread hier noch auf einige hundert Seiten anwachsen ;-).ZuseZ3 schrieb:Wer kann die Begründung ohne Spicken richtig vorhersagen?
Die undefined behavior gibt es doch aus Performancegründen und C++ musste die daher ebenso wie C haben, da C++ so wenig wie möglich performanceeinbüßen gegenüber C einführen wollte.ZuseZ3 schrieb:Ich würde aber nicht widersprechen, falls jemand den C++ Standard als verbugged beschreiben würde.
Signed integer overflow: If arithmetic on an 'int' type (for example) overflows, the result is undefined. One example is that "INT_MAX+1" is not guaranteed to be INT_MIN. This behavior enables certain classes of optimizations that are important for some code. For example, knowing that INT_MAX+1 is undefined allows optimizing "X+1 > X" to "true". Knowing the multiplication "cannot" overflow (because doing so would be undefined) allows optimizing "X*2/2" to "X". While these may seem trivial, these sorts of things are commonly exposed by inlining and macro expansion.
Jaein. UB ist eine faszinierende Sache, aber im Endeffekt geht es halt darum den User auf der einen Seite einzuschränken, damit compiler auf der anderen Seite mehr optimierungsspielraum haben.BeBur schrieb:Die undefined behavior gibt es doch aus Performancegründen
Das stimmt nicht. Wenn ich eine Liste durchgehe und das Element welches ich suche in der Mitte der Durchgänge schon gefunden werden kann, dann bietet es sich durchaus an, ein Break zu setzen. Warum noch weiter iterieren wenn ich mein Element gefunden habe?MichiSauer schrieb:Ich erinnere mich an meinen IT-Lehrer:
Wenn ihr Break in einer Schleife braucht, habt ihr die Bedingung nicht korrekt gesetzt oder eure Annahme war falsch.
Im Nachhinein:
Das abbrechen einer Schleife ist nur sinnvoll, wenn sonst Speicher, Zeit oder anderes volläuft.
Aber im Grunde hatte meine Lehrer damals recht:
Wer eine Schleife unterbrechen muss hat schlampig programmiert.
users.find(active: false)
schreibt bzw. artverwandte Konstrukte verwendet.