Forum: Mikrocontroller und Digitale Elektronik Quelltext: Lesestoff gesucht


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,

schon seit langem stört mich, dass meine Fähigkeiten beim Programmieren 
in C stagnieren. Das ist nicht wirklich verwunderlich. Die meiste 
Literatur widmet sich entweder abstrakten Konzepten oder ist an Anfänger 
gerichtet. Eine Umsetzung in der eigenen Sprache wird dann zu einer 
Sammlung selbst entwickelter Angewohnheiten.

Die Profis lernen wohl voneinander. Aber das ist bei Hobbyisten nur 
schwer möglich.

Wie lassen sich "neue" Implementierungstechniken kennenlernen? (Ich habe 
das "neue" mit Absicht in Klammern gesetzt. Eigentlich interessieren 
mich bewährte Techniken, auf die ich einfach noch nicht gestoßen bin.)

Die GCC Onlinedocs sind nett und ich habe darin schon viele nette 
Funktionen gefunden. Aber sie behandeln nicht Anwendungsfälle.

Es wird wohl auf das Lesen von Quelltext hinauslaufen. Das Problem: Wie 
findet man guten Quelltext zum Lesen? In Foren o.Ä. findet man ja 
hauptsächlich Schnipsel und zweifelhafte Fälle.

Welchen Quelltext sollte man gelesen haben? Bitte nur Fremd- und keine 
Eigenprojekte vorschlagen, ansonsten ist eine deutliche Verzerrung zu 
erwarten. Und bitte auch auf lesbare Teile beschränken. "Der Linux 
Kernel" ist so groß, dass das keiner lesen kann. Aber überschaubare 
Teile wären super. Etwas wie "Teil X der OpenSSL2-Bibliothek ist absolut 
lesenswert, weil da die Behandlung von Puffern mustergültig gelöst 
wurde". (Bitte den letzten Satz nicht wörtlich nehmen. In Fefes Blog 
steht gerade etwas zu einem Puffer-Bug und die Suche nach der Stelle im 
Quelltext war der aktuelle Anlass zur Frage.)

Ich habe die Frage mit Absicht in die Rubrik "Mikrocontroller" gestellt. 
Das ist natürlich die Plattform, die mich am meisten interessiert.

: Bearbeitet durch User
von Alexander S. (alesi)


Lesenswert?

Hallo,
wahrscheinlich nicht ganz das was Du suchst, aber wenn es um AVR 
Beispiele geht, kannst Du hier bei www.mikrocontroller.net im 
AVR_Softwarepool schauen. Zur Qualität des Codes kann ich wenig sagen, 
ist auch von Fall zu Fall unterschiedlich.
https://www.mikrocontroller.net/articles/AVR_Softwarepool

Ansonsten ist natürlich sehr viel, in unterschiedlicher Qualität, auf 
github zu finden (26,272 Projekte in C).
https://github.com/topics/c?l=c
Das kommt der Suche nach der Nadel im Heuhaufen sehr nahe.

von Walter T. (nicolas)


Lesenswert?

Alexander S. schrieb:
> wahrscheinlich nicht ganz das was Du suchst, [...]
> Zur Qualität des Codes kann ich wenig sagen, [...]
> (26,272 Projekte in C).

Genau das Problem. Text gibt es viele. Gute Texte finden ist die 
Schwierigkeit. Und irgendwie will man ja auch vorher um die Qualität des 
Lesestoffs wissen. Man will sich ja keine schlechten Angewohnheiten 
abgucken.

: Bearbeitet durch User
von Programmierer (Gast)


Lesenswert?

Walter T. schrieb:
> Die Profis lernen wohl voneinander.

Das ist leider auch nur ein schöner Traum. In der Realität basteln die 
Profis (also die, die dafür bezahlt werden) auch nur vor sich hin, 
erfinden jedes Rad neu, tappen in alle schon längst bekannten 
Stolperfallen, beharren auf ihren selbst ausgedachten Methoden, ... Es 
gibt keine Kultur des "beim alten Meister lernen" wie im Handwerk, denn 
dafür ist keine Zeit und Geld. Guter Quellcode ist rar (und jeder hat 
seine eigenen Kriterien für "gut"), Projekte und Mitarbeiter wechseln 
häufig, alles muss gestern auf dem Markt sein, und niemand nimmt ohne 
Zwang Ratschläge von anderen an, weil er es selber besser weiß.

Beispiel:
Hier Beitrag "Re: C: Viele Funktionen zur Auswahl" wird eine 
altbekannte Standard-Lösung (Strategy Pattern) für ein Problem genannt 
welche im Übrigen auch im Informatik-Studium so gelehrt wird, aber 
sowohl Fragesteller als auch Antwortende verwenden lieber unübliche 
Eigenbau-Lösungen als dem Profi zu glauben.

von Walter T. (nicolas)


Lesenswert?

Programmierer schrieb:
> Hier Beitrag "Re: C: Viele Funktionen zur Auswahl" wird eine
> altbekannte Standard-Lösung (Strategy Pattern) für ein Problem genannt
> welche im Übrigen auch im Informatik-Studium so gelehrt wird, aber
> sowohl Fragesteller als auch Antwortende verwenden lieber unübliche
> Eigenbau-Lösungen als dem Profi zu glauben.

Nehmen wir doch das Beispiel. Wo fände der Lernwillige denn eine in 
vollendeter Handwerkskunst implementierte Variante des genannten 
Pattern, damit er bei der Selbst-Implementierung nicht in die längst 
bekannten Stolperfallen tappt?

von Wühlhase (Gast)


Lesenswert?

Vielleicht solltest du mal das Buch "Weniger schlecht programmieren" 
(O'Reily) lesen.

Ich persönlich finde das Buch zwar nicht überaus brilliant, aber es 
enthält doch die ein oder andere wichtige Anregung und Denkanstoß, finde 
ich.

von Walter T. (nicolas)


Lesenswert?

Wühlhase schrieb:
> Ich persönlich finde das Buch zwar nicht überaus brilliant,

Das Buch ist gut. Nur wieder: Abstrakte Konzepte. Keine reale 
Implementierung zum Vergleich.

Das ist ein bischen so, wie im 10. Semester Tiefbau zu studieren und 
niemand lässt einen mal einen Bagger angucken (zu teuer, zu gefährlich), 
aber ständig wird betont, wie wichtig doch der Praxisbezug sei.

Im Gegensatz zu einem für den Heimgebrauch recht kostspieligen Bagger 
sollten doch gute Quelltexte irgendwie zu bekommen sein.

: Bearbeitet durch User
von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Schwer zu sagen was man dir empfehlen kann, weil es nicht zuletzt davon 
abhängt was du schon kannst.

Ich versuche es mal mit 
https://gforge.inria.fr/frs/download.php/latestfile/5298/ModernC.pdf 
(gibt es auch als gedrucktes Buch).

Ca. 90% dessen was er sagt kann ich unterschreiben. So die ein oder 
andere Macke hat er aber. Z.B. mag er aus fadenscheinigen Gründen das 
NULL-Makro nicht. C Signal-Handling mag er auch nicht. Leider gibt er 
dem Mischen von Namenskonventionen wie z.B. 'size_ofXyz' seinen Segen, 
statt auf Snake-Case zu bestehen 'size_of_xyz'. Im Großen und Ganzen ist 
er aber vernünftig.

von Blume (Gast)


Lesenswert?

Du kannst in Erwägung ziehen bei einem Open Source Project deiner Wahl 
mit zu helfen.
Am sinnvollsten suchst du dir eines aus, bei dem du wirklich den Wunsch 
verspürst etwas beitragen zu wollen.

Der Vorteil ist das du dich wirklich in fremde Quellen einarbeiten 
musst.
Und deine eigenen "Pull Requests" werden in der Regel auch quasi mit 
einem 4 Augen Prinzip geprüft.

Ganz zu schweigen das du solche Dinge wie GIT als Versionsverwaltung 
viel besser kennen lernst.

Sowas kann dich sicher mehr Richtung professioneller SW Entwickler 
schieben.

von Nico T. (wurstnase)


Lesenswert?

Ich finde den Source-Code von Chibios lesenswert. Er arbeitet sich mit 
objektorientiertem C durch sein RTOS.


https://osdn.net/projects/chibios/scm/svn/tree/head/trunk/

von Walter T. (nicolas)


Lesenswert?

Hannes J. schrieb:
> Ich versuche es mal mit
> https://gforge.inria.fr/frs/download.php/latestfile/5298/ModernC.pdf
> (gibt es auch als gedrucktes Buch).

Ich habe es mal vor Jahren angefangen zu lesen. Für mich wirkte das so, 
als hätte er seine persönliche C-Standard-Library kommentiert als Buch 
veröffentlicht.

Meine Notizen, was ich vom Buch wirklich mitnehmen konnte, sind leer. 
(Schlicht: "gelesen")


Aber das geht auch alles zu sehr Richtung Bücher. Wo gibt es den echten 
guten Stoff?

Nico T. schrieb:
> Ich finde den Source-Code von Chibios lesenswert.

Danke, den schaue ich mir mal an. Ich hoffe, dass ich irgendeine echte 
Applikation finde.

: Bearbeitet durch User
von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Walter T. schrieb:
> Das Buch ist gut. Nur wieder: Abstrakte Konzepte.

Wie willst du Code lesen und verstehen wenn du nicht die in Code 
umgesetzten, dahinter liegenden abstrakten Konzepte erkennst? Dann ist 
der Code nur Kauderwelsch für dich.

> Das ist ein bischen so, wie im 10. Semester Tiefbau zu studieren und
> niemand lässt einen mal einen Bagger angucken (zu teuer, zu gefährlich),
> aber ständig wird betont, wie wichtig doch der Praxisbezug sei.

Einen Tiefbaustudenten nahe an einen Bagger lassen? Bist du des 
Wahnsinns? Keine Ausbildung als Baugeräteführer, keinen Baggerschein? 
Dann sollen die gefälligst Abstand halten.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Hannes J. schrieb:
> Wie willst du Code lesen und verstehen wenn du nicht die in Code
> umgesetzten, dahinter liegenden abstrakten Konzepte erkennst?

Ein Quellcode, wo die Konzepte sich weder in Variablennamen noch 
Kommentaren widerspiegeln, ist nicht gut.

Blume schrieb:
> Du kannst in Erwägung ziehen bei einem Open Source Project deiner Wahl
> mit zu helfen.

Das Problem: Die Projekte, die mich interessieren, sind größtenteils 
1-Mann-Projekte. Woher soll man als Außenstehender wissen, ob der 
Entwickler gängige Praktiken umsetzt, oder genau wie ich als 
Einzelperson mangels Vergleich die Sachen so macht, wie er sie macht.

von Blume (Gast)


Lesenswert?

Walter T. schrieb:
> Das Problem: Die Projekte, die mich interessieren, sind größtenteils
> 1-Mann-Projekte. Woher soll man als Außenstehender wissen, ob der
> Entwickler gängige Praktiken umsetzt, oder genau wie ich als
> Einzelperson mangels Vergleich die Sachen so macht, wie er sie macht.

da hast du Recht um in einem Team mitspielen zu können muss man in einem 
Team mitspielen wollen. :-)

von Blume (Gast)


Angehängte Dateien:

Lesenswert?

Mal ein paar Bücher aus meiner Bibliothek.

von EAF (Gast)


Lesenswert?

Walter T. schrieb:
> Ein Quellcode, wo die Konzepte sich weder in Variablennamen noch
> Kommentaren widerspiegeln, ist nicht gut.

Hier mal 2 Konzepte, welche sich nicht an deine Vorstellungen halten:
DRY und RAII

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Walter T. schrieb:
> Ein Quellcode, wo die Konzepte sich weder in Variablennamen noch
> Kommentaren widerspiegeln, ist nicht gut.

Ach je, der alte Glaube dass man kein Domänenwissen haben muss.

von Thomas W. (Gast)


Lesenswert?

Walter T. schrieb:
> Hallo zusammen,
>
> schon seit langem stört mich, dass meine Fähigkeiten beim Programmieren
> in C stagnieren. Das ist nicht wirklich verwunderlich. Die meiste

Du wolltest das so: Ist zwar ein bischen alt (Kernel 0.12 Linux), ist 
aber ueberschaubar (1117p Buch), der Kernel 0.12 sehr kurz.

Zhao Jiong, A Heavily Commented Linux Kernel Source Code, nix ISBN, ich
habe so etwas gefunden:

https://de1lib.org/book/5424495/85d4e2?id=5424495&secret=85d4e2

er hat auch noch ein Follow-Up fuer 0.13 geschrieben, aber mein 
chinesisch ist aber nicht gut genug :-)

Aus dem Preface:
1
The main goal of this book
2
3
The main goal of this book is to use a minimal amount of space or within a limited space to dissect the
4
complete Linux kernel source code in order to obtain a full understanding of the basic functions and actual
5
implementation of the operating system. To achieve a complete and profound understanding of the Linux kernel,
6
a true understanding and introduction of the basic operating principles of the Linux operating system.
7
This book's readership is positioned to know the general use of Linux systems or has a certain
8
programming basis, but it lacks the basic knowledge to read the current new kernel code and is eager to
9
understand the working principle and actual code of the UNIX operating system kernel as soon as possible.

Es gibt auch noch (wenn man ein wenig googled) Anleitungen, wie man den 
Kernel dann mit Qemu zu starten bringt. Das ist etwas anspruchsvoll.

Gruesse

Th.

von Thomas W. (Gast)


Lesenswert?

Walter T. schrieb:
> Hallo zusammen,
>
> schon seit langem stört mich, dass meine Fähigkeiten beim Programmieren
> in C stagnieren. Das ist nicht wirklich verwunderlich. Die meiste

Ich bin ein wenig bloed: Natuerlich den Tanenbaum, Operating System, 
design and implementation. Man kann ja zu Minix stehen wie man will, es 
sind aber fortgeschrittene Lehrbuecher. Und, wie gewuenscht, reines C 
mit Assembler fuer den Boot.

Gruesse

Th.

von Der Opa aus der Muppet Show (Gast)


Lesenswert?

> Operating System, DESIGN and implementation

Ja, ein guteŕ Hinweis.

Heutzutage ist ein Hobbyprogramm umfangreicher als damals ein 
Betriebssystem. Ein normales Microcontroller-Projekt hat Webserver und 
Wlan. Braucht 20 inkompatible, undurchschaubar komplexe Pakete.

Programmcode eintippen genügt nicht mehr. Auch ein Hobbyprogammierer 
muss wissen, wie man umfangreiche, aus mehreren Komponenten 
zusammengesetzte Systeme designt.

von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Bitte nicht auf den Standard-Büchern rumreiten. (Leider ist mein 
Bücherregal in einer etwas zu dunklen Ecke für ein gutes Foto.) Und die 
Totholz-Teile sind nur eine Auswahl. Viel findet man ja auch im Netz als 
PDF oder PPT. Oder in der nächstgelegenen Uni-Bibliothek.

Ich suche den echten Stoff. Wo man sich auch Idiome abgucken kann. Nur 
Latein ist eine Sprache, die man komplett aus Büchern lernen kann.

Blume schrieb:
> Mal ein paar Bücher aus meiner Bibliothek.

Kommt in "Clean Coder" noch etwas zur Programmierpraxis, oder geht es da 
ausschließlich um das Überleben als Softwerker? (Die Leseprobe geht 
nicht sehr weit.)

: Bearbeitet durch User
von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Walter T. schrieb:
> Wo fände der Lernwillige denn eine in
> vollendeter Handwerkskunst implementierte Variante des genannten
> Pattern, damit er bei der Selbst-Implementierung nicht in die längst
> bekannten Stolperfallen tappt?

Denn Vergleich mit der Vollendeten Handwerkskunst finde ich hier nicht 
sehr passend. Bei programmieren handelt es sich um ein Handwerk das erst 
wenige Jahrzehnte alt ist und in dieser Zeit auch nicht unerhebliche 
Veränderungen erfahren hat und sich quasi noch in einem sehr frühen 
Stadium seiner Entwicklung befindet.

Erschwerend kommt hinzu das es für viele Aufgabenstellungen duzende von 
Lösungsmöglichkeiten gibt die am Ende alle das machen was sie sollen und 
somit gleichwertig sind. Ob die jeweilige Lösung "Gut" oder "Schlecht" 
ist hängt hier eher von persönlichen Vorlieben des Betrachters ab. Was 
für den Einen super gut ist, ist für den anderen ein Krampf - einfach, 
weil es seinem persönlichen "Stiel" zuwiderläuft oder entgegenkommt. Am 
Ende ist es auch oftmals egal solange die geforderte Funktionalität 
(möglichst Fehlerfrei) gegeben ist und das ganze einigermaßen "lesbar" 
ist.

Etliche Fehler muss man einfach mal selbst gemacht und vor allem auch 
selbst gesucht haben. Da lernst man am allermeisten dabei:-)

Ganz interessant ist mal der umgekehrte Weg. Zu schauen was man 
möglichst vermeiden soll. Für den Einstieg:
- https://de.wikipedia.org/wiki/Anti-Pattern

Und mal zum Nachdenken:
- 
https://de.wikipedia.org/wiki/Unix-Philosophie#Pike:_Notes_on_Programming_in_C

Ganz interessant ist es auch sich mal die MIRS Dokumente zu Gemüte zu 
führen. Man darf hier nur nicht den Fehler begehen und versuchen sich 
Sklavisch dran zu halten (wie bei so vielen anderen Pattern auch). 
Lesen, Verstehen, im Hinterkopf abspeichern und dann für sich selbst 
entscheiden was davon sinnvoll ist und was nicht für das was man machen 
will. So einige wird man erst verstehen und für sinnvoll erachten, wenn 
man den zugehörigen Fehler mal selbst gemacht und gesucht hat.

von Der Opa aus der Muppet Show (Gast)


Lesenswert?

Die beste Lektüre fand ich den Quelltext von Xlisp. Das konnte man 
einfach so locker durchlesen. Alles klar. Aber zum Schluss kam die Frage 
auf: Hä, wieso kann so ein triviales Programm so eine komplexe Aufgabe 
erledigen? So einfach aussehende Programme will ich auch schreiben 
können.

Solltest dir Quelltexte suchen, bei denen einer alleine ein 
umfangreiches System entwickelt hat. Ghostscript, oder Mysql oder so. 
Und dann herausfinden, wie einer alleine so etwas zustande bringt.

von Walter T. (nicolas)


Lesenswert?

Es wurden ein paar brauchbare Dokumente/Bücher genannt. Aber mal 
ehrlich: Die kennt doch mittlerweile jeder von uns. Wir wissen um 
Antipattern, Designphilosophien und Fallen. Auf Konzeptebene.

Ich habe am meisten über den konkreten Aufbau von Geräten und Maschinen 
gelernt, indem ich sie zerlegt, repariert oder einfach mal meine Zeit im 
Museum genommen habe. Die dahinterstehenden Konzepte kamen aus Büchern 
oder Vorlesungen.

Die Programmiersprache C ist jetzt knapp 50 Jahre alt. Man kann davon 
ausgehen, dass sie von der Flußphase in die Kriechphase übergegangen 
ist. Die ersten, die es darin zur Meisterschaft gebracht haben, sind in 
Rente. Das ist mehr Zeit als zwischen dem Wright Flyer und den ersten 
zivilen Düsenflugzeugen.

Sehr alte Beispiele spiegeln also wohl nicht mehr den Stand der Technik 
wieder. Ein Projekt als Beispiel zu nehmen, nur weil es populär ist, 
halte ich auch für kein sinnvolles Unterfangen. Ein Programm ist 
deswegen populär, weil sein Zweck gebraucht wird, nicht weil es 
besonders gut programmiert ist. Im Gegenteil würde ich sogar davon 
ausgehen, dass bei einem sehr nützlichen Projekt auch schlechterer 
Quelltext durchgeht, wenn der Nutzen stimmt.

Anscheinend lesen Softwareentwickler nicht gern Quelltext. Das 
unterscheidet sie von den Ingenieuren. Einen guten Schaltplan oder gute 
technische Zeichnungen oder Dokumentationen oder ein gut gelungenes 
Leiterplattenlayout, eine gelungene Brückenkonstruktion usw. kann man 
auch anlasslos interessehalber durchgehen. Bei Quelltext scheint das 
anders zu sein. Also entweder mögen die Softwerker ihre Arbeit nicht, 
oder sie finden grundsätzlich die Arbeit anderer häßlich.

Was mir am ChibiOS-Beispiel gefällt: Die Dokumentierung der 
Einzelfunktionen mit Doxygen ist in den Teilen, die ich mir bis jetzt 
angeguckt habe, absolut mustergültig. Da wurde Energie reingesteckt und 
da kann man sich etwas abgucken. Besonders interessante Funktionen oder 
Funktionalitäten habe ich noch nicht entdeckt, aber auch noch nicht viel 
Zeit hineingesteckt, da ich die Architektur-Doku noch nicht gefunden 
habe.

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Der Opa aus der Muppet Show schrieb:
> Die beste Lektüre fand ich den Quelltext von Xlisp

Tja, damals. Quelltexte von CP/M, GEM und Windows waren nicht nur 
kommerziell erfolgreiche Programme, sondern auch gute lehrreiche 
Quelltexte, statt akademischem Furz sah man dort wie man es richtig 
macht. Leider alles aus der vor-OOP Zeit, bei CP/M gar aus der Vor-C Ära 
in PL/M. Heute gibt es 'Patterns' als Muster zum Abscheiben ohne denken.

von Programmierer (Gast)


Lesenswert?

Walter T. schrieb:
> Anscheinend lesen Softwareentwickler nicht gern Quelltext. Das
> unterscheidet sie von den Ingenieuren

Quelltexte sind eben auch viele Größenordnungen komplexer als so ein 
gewöhnlicher Schaltplan und nicht so schön visuell erfassbar. So ein 
Schemabild einer elektrochemischen Anlage ist vielleicht eine 
Din-a-3-Seite groß, der Schaltplan der zugehörigen Steuereinheit 
vielleicht 10 Din-a-4-Seiten, da kann man sich innerhalb von ein paar 
Stunden durchwühlen, und es ist sehr leicht erfassbar was zusammen 
gehört und wo funktionale Einheiten sind. Der dazugehörige Sourcecode 
ist lang genug um den Leser wochenlang zu beschäftigen und natürlich so 
verworren, dass man sehr detektivisch vorgehen muss um die Zusammenhänge 
zu erkennen. Keine besonders erbauliche Tätigkeit.

Walter T. schrieb:
> oder sie finden grundsätzlich die Arbeit anderer häßlich.

Das sowieso immer.

Walter T. schrieb:
> da ich die Architektur-Doku noch nicht gefunden
> habe.

Der Knackpunkt: Architektur-Doku wäre viel wichtiger als Doxygen-Doku 
der einzelnen Funktionen. Die Signatur der Funktionen sollte sie 
praktisch selbsterklärend machen und Kommentare oft überflüssig (klappt 
natürlich mit C-Code weniger gut, wo alles void* oder int ist), aber ein 
guter Überblick ist essentiell.

MaWin schrieb:
> statt akademischem Furz sah man dort wie man es richtig
> macht. Leider alles aus der vor-OOP Zeit, bei CP/M gar aus der Vor-C Ära
> in PL/M. Heute gibt es 'Patterns' als Muster zum Abscheiben ohne denken.

Hier das nächste Musterbeispiel - die über Jahrzehnte gewonnenen 
Erkenntnisse von Experten werden abgelehnt. Das weiß man schließlich 
selbst besser!

Walter T. schrieb:
> Wo fände der Lernwillige denn eine in
> vollendeter Handwerkskunst implementierte Variante des genannten
> Pattern

ISBN 978-0201633610

Das Strategy-Pattern ist aber nicht sehr komplex, das gezeigte 
Codebeispiel ist hier schon ziemlich ausreichend.

Was tatsächlich ziemlich hilfreich ist um auf aktuellen Stand der 
Technik zu kommen und fortgeschrittene Techniken zu lernen sind die 
IRC/Slack-Channel zu C++. Dort sind viele "Szenegrößen" anzutreffen. 
Leider muss man hier mit dem üblichen Alt-Right-Mindset der 
US-Amerikanischen Hackerkultur zurecht kommen. Die Includecpp-Channel 
könnten eine Alternative sein.

von Peter D. (peda)


Lesenswert?

Walter T. schrieb:
> schon seit langem stört mich, dass meine Fähigkeiten beim Programmieren
> in C stagnieren.

Programmieren kann man nicht auswendig lernen, wie eine Fremdsprache 
oder ein Gesetzbuch. Man muß lernen, in Abläufen zu denken, d.h. das 
Problem in einzelne Schritte umzuformen. Das Erstellen eines 
Programmablaufplanes erleichtert dann das Coden erheblich. Diesen 
Programmablaufplan kann man dann auch erstmal logisch überprüfen, ehe 
man Code einhackt.
Ich benutze abwechselnd Top-down und Bottom-up. D.h. wenn es in der 
einen Richtung hakt, nähere ich mich von der anderen Seite an.

Das eigentlich Code einhacken sehe ich als nebensächlich an. Wenn 
erstmal der Ablauf klar ist, ergibts sich das von alleine. Das ist nur 
Übung.

Viele Anfänger meinen, man könne einfach so drauflos hacken. Aber das 
ist eine Sackgasse, dabei lernt man nichts oder nur sehr sehr langsam.
Auch fremden Code anschauen bringt nichts, solange man nicht den 
zugrunde liegenden Ablauf verstanden hat. Als Anfänger sollte man daher 
über jede Funktion einen Kommentar schreiben, wie sie funktioniert.

von Walter T. (nicolas)


Lesenswert?

Programmierer schrieb:
> Der Knackpunkt: Architektur-Doku wäre viel wichtiger als Doxygen-Doku
> der einzelnen Funktionen.

Und wenn das Projekt gut ist, ist die auch irgendwo. Wenn nicht, ist das 
ein brauchbares Beispiel für eine Schieflage (falsche Prioritäten).


Peter D. schrieb:
> Programmieren kann man nicht auswendig lernen, wie eine Fremdsprache
> oder ein Gesetzbuch.

Auch Fremdsprachen lernt man nicht auswendig. Im Gegenteil. Beherrschen 
erfordert eine Denkweise in Kontexten und (Argumentations-)Strukturen. 
Dazu kommen jede Menge Erfahrungswerte, in welchen Kontexten welche 
Idiome passend sind.

Zwei Beispiele:
_countof() habe ich gestern kennengelernt und darüber auf die 
GCC-Variante ARRAY_SIZE(). Vorher habe ich bei jedem Funtionsaufruf ein 
selbstgebasteltes Makro genutzt, das genau das Gleiche macht. Kennt man 
das Idiom, kann man es nutzen. Ansonten schreibt man seinen eigenen 
Kram.

Das Idiom !!a, um einer Variable einen booleschen Wert zu nutzen, der 
garaniert 1 ist, habe ich auch erst vor ein paar Jahren durch Zufall 
kennengelernt. Vorher hatte ich einen etwas umständlicheren Ausdruck 
(a>0) für unsigned und (a!=0) für signed Variablen für den gleichen 
Zweck genutzt.

Ich bin sehr sicher, dass von denen die diese Idiome nutzen, weniger als 
20% sich das selbst genauso ausgedacht oder gezielt danach gesucht und 
80% das durch Zufall aufgeschnappt haben. Aber kennt und nutzt man die 
Idiome, wird ein Quelltext für jeden, der es auch kennt, direkt besser 
lesbar.

Peter D. schrieb:
> Viele Anfänger meinen, man könne einfach so drauflos hacken. Aber das
> ist eine Sackgasse, dabei lernt man nichts oder nur sehr sehr langsam.

Aus dem Anfängerkram sind wir doch schon lange draußen, oder? Man kann 
ihn mal irgendwann begraben sein lassen.

von jo (Gast)


Lesenswert?


von Peter D. (peda)


Lesenswert?

Walter T. schrieb:
> Das Idiom !!a ... (a!=0)

Sowas würde ich unter Mikrooptimierung einordnen, die Lesbarkeit 
unterscheidet sich kaum.
Als Anfänger sollte man Mikrooptimierung vermeiden, die Lesbarkeit und 
Funktion haben absoluten Vorrang. Lösungsansätze sollten daher nicht zu 
komplex sein.

> (a>0)

Würde ich vermeiden, da es typabhängig reagiert und hier auch nicht 
notwendig ist.

Walter T. schrieb:
> _countof()

Kannte ich bisher auch nicht. In den seltenen Fällen, wo man sowas 
braucht, habe ich es ausgeschrieben.
In der Regel nehme ich ein Define für die Arraysize oder einen 
Leerstring als Endezeichen.

von Programmierer (Gast)


Lesenswert?

Walter T. schrieb:
> _countof() habe ich gestern kennengelernt und darüber auf die
> GCC-Variante ARRAY_SIZE(). Vorher habe ich bei jedem Funtionsaufruf ein
> selbstgebasteltes Makro genutzt, das genau das Gleiche macht.

In C++ schreibt man std::size(myArray). Funktioniert mit jedem Compiler 
direkt und unproblematisch, und sogar dann noch wenn man den Typ von 
myArray auf eine Container-Klasse ändert.

Walter T. schrieb:
> Das Idiom !!a, um einer Variable einen booleschen Wert zu nutzen, der
> garaniert 1 ist, habe ich auch erst vor ein paar Jahren durch Zufall
> kennengelernt

Mache ich quasi nie, weil dieser Fall sowieso selten auftritt. "!= 0" 
finde ich genau so gut.

von Wühlhase (Gast)


Lesenswert?

Walter T. schrieb:
> Wühlhase schrieb:
>> Ich persönlich finde das Buch zwar nicht überaus brilliant,
>
> Das Buch ist gut. Nur wieder: Abstrakte Konzepte. Keine reale
> Implementierung zum Vergleich.

Du kennst das Buch nicht, denke ich. Das, was da besprochen wird, hat 
mit praktischer Implementierung wenig zu tun. (Was nicht bedeutet, daß 
es keinen praktischen Nutzen hat.)


Walter T. schrieb:
> Das ist ein bischen so, wie im 10. Semester Tiefbau zu studieren und
> niemand lässt einen mal einen Bagger angucken (zu teuer, zu gefährlich),
> aber ständig wird betont, wie wichtig doch der Praxisbezug sei.
>
> Im Gegensatz zu einem für den Heimgebrauch recht kostspieligen Bagger
> sollten doch gute Quelltexte irgendwie zu bekommen sein.

Du solltest vielleicht mal über den Unterschied zwischen Lehre und 
Studium sinnieren. Du willst etwas Neues lernen - das ist ok. Du 
erwartest aber anscheinen an einem Punkt Anleitung, wo jedem anderen 
eine abstrakte Abhandlung reicht und er sich dann alleine auf den Weg 
macht (und dabei seinen eigenen Stil entwickelt).


Walter T. schrieb:
> Anscheinend lesen Softwareentwickler nicht gern Quelltext. Das
> unterscheidet sie von den Ingenieuren. Einen guten Schaltplan oder gute
> technische Zeichnungen oder Dokumentationen oder ein gut gelungenes
> Leiterplattenlayout, eine gelungene Brückenkonstruktion usw. kann man
> auch anlasslos interessehalber durchgehen. Bei Quelltext scheint das
> anders zu sein. Also entweder mögen die Softwerker ihre Arbeit nicht,
> oder sie finden grundsätzlich die Arbeit anderer häßlich.

Ich habe mir ziemlich viele Gedanken über meinen Schaltplan- und 
Layoutstil gemacht und ich denke, ich bin da bisher zu recht brauchbaren 
Ergebnissen gekommen.
Ich habe allerdings noch nie auch nur einen einzigen Beispielschaltplan 
von anderen gesucht, um da etwas zu lernen.
Weitaus nützlicher fand ich da ein paar Fachgespräche mit Kollegen, oder 
auch den ein oder anderen Thread hier. Plus ein paar abscheulich 
abschreckender Beispiele in Datenblättern oder Application Notes, die 
mir zufällig bei der Arbeit über den Weg gelaufen kamen.

Am meisten habe ich aber durch selber denken gelernt. Was will ich und 
wie erreiche ich es, was will ich auf keinen Fall und wie vermeide ich 
es? Plus Ausprobieren -> Erfahrungsgewinn.

Und so machen das Softwareentwickler auch.

von Walter T. (nicolas)


Lesenswert?

Wühlhase schrieb:
> Du erwartest aber anscheinen an einem Punkt Anleitung,

Ich suche keine Anleitung. Ich suche guten Quelltext.


Wenn ich eine Fremdsprache lerne und über das Volkshochschulniveau 
hinaus bin, nutze ich
 a) Literatur über die Sprache
 b) Literatur in der Sprache auf bekannter Niveauebene.
 c) Versuche in der Sprache zu hören
 d) und in der Sprache zu sprechen.

Aus irgendeinem Grund finden hier alle die Punkte b) und c) absurd und 
beschränken sich auf a) und d). Ihr wollt sprechen aber nicht zuhören 
und wundert euch, dass euch keiner zuhört. Kein Wunder, dass ihr 
allgemein als komisch angesehen werdet.

Für b) und c) braucht man Material mit bekanntem (und hoffentlich hohem 
Niveau). Bei Schriftmaterial ist da die Auflage ein guter Indikator, 
wenn man das noch nicht selbst beurteilen kann. Aber meist verlässt man 
sich auf Empfehlungen.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Die Qualität von Quelltext wird selten bewertet. Wenn es getan wird, 
dann meistens nach schmerzhaften Problemen.

Deswegen dürfte es schwierig sein, auf öffentlich zugängliche Quelltexte 
zu stoßen, deren Qualität als gut oder sehr gut gewertet wurde. Es gibt 
Firmen, die so etwas als Service anbieten, doch das passiert nach keiner 
Erfahrung eher hinter verschlossenen Türen.

Die Quelltexte die mir üblicherweise anschaue, sind halt so wie sie 
sind. Meine Meinung dazu interessiert keinen und andere tun ihre Meinung 
dazu auch nur selten Kund.

von Stephan (Gast)


Lesenswert?

Hi,

ich kann dir leider nur Basics empfehlen:

Books written by Michael J. Pont:
hier geht es um 'Time Triggert Scheduling', echt harter Stoff. Aber sehr 
cool.

Design Patterns:
hier kann ich dir 'adamtornhill' empfehlen, er zeigt einige Lösungen in 
C. super gemacht. nicht ganz so schwerer Stoff.

von NichtWichtig (Gast)


Lesenswert?

Alles was ich tagsüber ins Repo einchecke wird nach code guidelines 
überprüft, die entsprechende Email liegt mir Tags drauf vor was alles 
nicht regelkonform und was alles gefixt ist.

Ein Account bei z.B. O'REILLY eröffnet einem Zugriff auf Lesestoff der 
10 Jahre Lockdown locker füllt.

Und guten Quelltext (also meiner) darf ich nicht veröffentlichen weil 
Firmeneigentum :-)

von A. S. (Gast)


Lesenswert?

Walter T. schrieb:
> Bitte nicht auf den Standard-Büchern rumreiten.

Zur Handwerklichen Qualität fehlen dort die Klassiker "Code Complete" 
und "Writing Solid Code".

Pattern oder Algorithmen sind praktisch nur zielgerichtet sinnvoll. Z.B. 
wenn Du ein RTOS schreiben oder verbessern willst. Oder Suchalgorithmen.

Genauso wichtig ist es aber auch, sich mit den Eigenschaften typischer 
Ausdrucksformen zu beschäftigen.

von EAF (Gast)


Lesenswert?

Walter T. schrieb:
> Ich suche keine Anleitung.
Nein?
Ein Fehler!

Mein Rat:
Lerne die üblichen "Design Pattern".
Die findest du in Büchern.
Dann übe.
Spiele damit, bis sie sitzen.

Walter T. schrieb:
> Ich suche guten Quelltext.
Quelltexte anderer Leute, haben eine gewisse Ähnlichkeit mit einem Sack 
voll ungewaschener Unterhosen fremder Leute.
Da finden sich gerne auch reichlich braune Streifen und sonstiges Zeug, 
mit dem man eigentlich nix zu tun haben will.

von Walter T. (nicolas)


Lesenswert?

EAF schrieb:
> Quelltexte anderer Leute, haben eine gewisse Ähnlichkeit mit einem Sack
> voll ungewaschener Unterhosen fremder Leute.
> Da finden sich gerne auch reichlich braune Streifen und sonstiges Zeug,
> mit dem man eigentlich nix zu tun haben will.

Wenn das stimmt, lässt das nur zwei mögliche Schlüsse zu: Entweder kann 
niemand sauber programmieren oder Softwareentwickler hassen einander so, 
dass sie niemals die Leistung eines anderen anerkennen würden.

Nach momentanem Stand würde ich vermuten, dass beides zutrifft.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Walter T. schrieb:
> Das Idiom !!a, um einer Variable einen booleschen Wert zu nutzen, der
> garaniert 1 ist, habe ich auch erst vor ein paar Jahren durch Zufall
> kennengelernt.

Sowas finde ich nun wiederum völlig unleserlich und würde es deshalb 
vermeiden.

In "modernem" (≥ C99) C würde ich, wenn man das unbedingt braucht, 
lieber eine bool-Zwischenvariable schreiben:
1
#include <stdbool.h>
2
3
   bool foo = (bool)a;

Die hat dann auch garantiert die Werte 0 oder 1 und sonst nichts.

Da siehst du schon: sehr vieles ist auch einfach Geschmackssache.

Aus ähnlichen Lesbarkeitsgründen mag ich auch diese "verkehrt herum 
geschriebenen" Vergleiche nicht:
1
  if (42 == foo) {
2
     // mach was
3
  }

Der Sinn der Sache war ja mal, dass man versehentlich geschriebene 
einfache Gleichheitszeichen im Vergleich sicher angemosert bekommt. 
Allerdings widerspricht diese Reihenfolge m.M.n. komplett unserem 
üblichen Lesefluss, denn man fragt ja "ist foo gleich 42?" und nicht 
"sind 42 und foo gerade gleich?". Compiler mosern das einfache 
Gleichheitszeichen im Vergleich sowieso seit mindestens 25 Jahren sauber 
an, und der ganze Zirkus funktioniert gleich gar nicht mehr, wenn man 
zwei Variablen miteinander vergleichen möchte.

von Walter T. (nicolas)


Lesenswert?

Jörg W. schrieb:
> Da siehst du schon: sehr vieles ist auch einfach Geschmackssache.

Da stimme ich Dir uneingeschränkt zu.

Jörg W. schrieb:
> Sowas finde ich nun wiederum völlig unleserlich und würde es deshalb
> vermeiden.

Ich mag die mittlerweile, um Bitmasken zu füllen. Es sind eben drei 
Zeichen weniger als (a!=0), so dass die Zeilen nicht zu lang werden und 
haben einen hohen Wiedererkennungswert.

Ich will aber auch gar nicht behaupten, dass man die Idiome mögen muss. 
Aber bevor man sie nicht mögen kann, muss man sie erst einmal kennen. 
Ich wähle lieber eine Variante aus, weil sie die beste von dreien ist, 
die mir einfallen, als weil sie die einzige ist, die ich kenne.

von traurig (Gast)


Lesenswert?

NichtWichtig schrieb:
> Und guten Quelltext (also meiner) darf ich nicht veröffentlichen weil
> Firmeneigentum :-)

Schreibst auch nur für die Firma, wahr?

von traurig (Gast)


Lesenswert?

Robert Martin mit seinem "Clean Code" scheint ein richtiger Profi zu 
sein.

Wo findet man denn seine Programme und seinen Quellcode? Oder hat er 
auch nur geheimen Programmcode für seine Arbeitgeber geschrieben?  ;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Walter T. schrieb:
> Es sind eben drei Zeichen weniger als (a!=0)

Es sind fünf Zeichen weniger als ordentlich geschriebene (a != 0). :-)

Für solche Sachen finde ich Makros ganz praktisch, auch wenn man 
ansonsten vielleicht mit Makros eher sparsam sein sollte:
1
#define B(x) ((x) != 0) // guarantees either 0 or 1
2
3
...
4
5
   (B(a) << 4) | B(b);
6
7
#undef B

Wenn man eh einen Makro nimmt, kann man dann aber auch gleich die 
Schiebeweite mit einbauen:
1
#define BIT(x, m) (((x) != 0) << (m))
2
3
...
4
   BIT(a, 4) | BIT(b, 0);
5
6
#undef BIT

: Bearbeitet durch Moderator
von Programmierer (Gast)


Lesenswert?

Jörg W. schrieb:
> Für solche Sachen finde ich Makros ganz praktisch

Noch besser sind inline-Funktionen, weil Makros, insbesondere bei so 
kurzen Namen, diverse Nachteile haben (Scope, Typ).

Wenn mir hier jetzt sofort widersprochen wird: Noch ein Fall von "Bloß 
nicht die etablierten von erfahrenen Profis erarbeiteten Methoden 
anwenden".

von Walter T. (nicolas)


Lesenswert?

Jörg W. schrieb:
> #define BIT(x, m) (((x) != 0) << (m))
> ...
>    BIT(a, 4) | BIT(b, 0);
> #undef BIT
1
#define BIT(x, m) (((x) != 0) << (m))
2
3
...
4
5
   BIT(a, 4) | BIT(b, 0);
6
...
7
#undef BIT
vs.
1
   (!!a)<<4 | (!!b)<<0

Also da haben wir sicherlich nicht den gleichen Geschmack, was das 
kleinere Übel ist.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Programmierer schrieb:
> Noch besser sind inline-Funktionen, weil Makros, insbesondere bei so
> kurzen Namen, diverse Nachteile haben (Scope, Typ).

Beides ist für den Anwendungsfall allerdings überschaubar, und damit man 
damit keinen Missbrauch treiben kann, habe ich absichtlich auch das 
abschließende #undef angedeutet. **Das** geht mit einer inline-Funktion 
nicht. ;-)

von EAF (Gast)


Lesenswert?

Walter T. schrieb:
> Wenn das stimmt, lässt das nur zwei mögliche Schlüsse zu: Entweder kann
> niemand sauber programmieren oder Softwareentwickler hassen einander so,
> dass sie niemals die Leistung eines anderen anerkennen würden.

Alles klar!
Keine Fragen mehr.....

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Walter T. schrieb:
> (!!a)<<4 | (!!b)<<0
>
> Also da haben wir sicherlich nicht den gleichen Geschmack, was das
> kleinere Übel ist.

Ja, schon deshalb, weil ich für den Vorrang der Operatorenreihenfolge 
zwischen | und << ins Buch schauen müsste, und immer, wenn sowas 
passiert, sollte man lieber Klammern schreiben. Wenn du jetzt noch die 
üblichen Leerzeichen um << einfügst, dann sieht das so aus:
1
   BIT(a, 4) | BIT(b, 0);
2
3
   ((!!a) << 4) | ((!!b) << 0);

Die Klammern um die unären Operatoren sind allerdings überflüssig, denn 
unäre Operatoren haben immer höhere Priorität als binäre. Diese Regel 
kann ich mir auch ohne Buch merken. ;-)

Allerdings steht es dir natürlich frei, wenn der Platz wirklich knapp 
ist, den etwas erklärenderen Namen wie "BIT" dann einfach zu "B" 
einzukürzen:
1
   B(a, 4) | B(b, 0);

Daher ja dann das #undef B.

: Bearbeitet durch Moderator
von Walter T. (nicolas)


Lesenswert?

Vielleicht finde ich die Makro-Lösung im passenden Kontext auch 
sinnvoller. Wer weis. Forenschnipsel sind eben kontext-frei und bei 
vielen Sachen bleibt der Nutzen zweifelhaft. Womit wir wieder beim 
Eröffnungspunkt wären.

Ein ähnlicher Zweifelpunkt ist die klassische Frage: Viel Scrollarbeit 
durch lange Funktionen, oder noch mehr Scrollarbeit durch viele kurze 
Funktionen. Ich kenne nur die Variante, die ich wähle. Vielleicht ist es 
besser, wie andere das machen.

: Bearbeitet durch User
von Programmierer (Gast)


Lesenswert?

Walter T. schrieb:
> noch mehr Scrollarbeit durch viele kurze Funktionen

Ist definitiv der von Profis präferierte Stil. Durch Aufteilung auf mehr 
Dateien braucht man auch nicht so viel scrollen. Viele kleine leicht 
verständliche Funktionen zu einem großen Ganzen zu kombinieren ist 
wesentlich wartbarer und auch leichter zu testen. Das ist natürlich nie 
100% umsetzbar, aber die richtige Richtung.

von EAF (Gast)


Lesenswert?

Walter T. schrieb:
> Vielleicht ist es
> besser, wie andere das machen.

"Besser" ist vom Kontext abhängig.
So wie es für "gut" und "böse" auch ist.

Zudem:
Steige um auf C++!
Da gibts auch viele "neue" Konzepte zu lernen.

von Walter T. (nicolas)


Lesenswert?

Programmierer schrieb:
> Walter T. schrieb:
>> noch mehr Scrollarbeit durch viele kurze Funktionen
>
> Ist definitiv der von Profis präferierte Stil.

Das ist aber nicht das einzige Dilemma. Es gibt dutzende von 
Alltagsdilemmata, die ständig auftauchen, auch wenn mir gerade nur zehn 
einfallen:

 - Viele Funktionen, die ungefähr etwas ähnliches machen, oder wenige 
Funktionen mit ellenlangen Parameterlisten?

 - Ellenlange Funktionsaufrufe oder viele Zwischenvariablen?

 - Der dicke Master Control Blob oder eine Ansammlung eng verknüpfter 
voneinander abhängiger Funktionen?

 - Das große struct, in dem viele Funktionen herumschreiben, oder viele 
lokale Variablen?

 - Fehlerbehandlung durch den Aufrufer oder den Aufgerufenen? Wie werden 
Fehler signalisiert und wie behandelt?

 - Parameterlisten fcn(In1, In2, *Out) oder fnc(*Out, In1, In2) 
(__builtin_add_overflow() vs. memcpy() )?

 - Nur intern verwendete Structs voll sichtbar definieren und in den 
Variablenraum der aufrufenden Funktion, oder verstecken und malloc() *)?

 - Funktionen mit vielen Parametern oder mit Struct-Parametern?

 - Konfiguration per Header oder per Build-Parameter?

 - Endmarker oder Längenvariable *)?

 - Behandlung von n+1-Fehlern: Prüfende Codeabschnitte (mit 
Laufzeit-Overhead) oder Verantwortung auf den Aufrufer abwälzen?

*) Entfällt bei C++&Co größtenteils.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Walter T. schrieb:

>  - Viele Funktionen, die ungefähr etwas ähnliches machen, oder wenige
> Funktionen mit ellenlangen Parameterlisten?

Von Fall zu Fall entscheiden.

>  - Ellenlange Funktionsaufrufe oder viele Zwischenvariablen?

Zwischenvariablen erleichtern sehr oft das Verständnis.

Heutige Compiler optimieren sowas sowieso weg, außer bissel 
Schreibarbeit kosten die also nichts (sofern du nicht gerade mit -O0 
compilierst, aber das würde ich persönlich nicht einmal für Debug-Code 
tun).

>  - Der dicke Master Control Blob oder eine Ansammlung eng verknüpfter
> voneinander abhängiger Funktionen?

Verstehe ich nicht.

>  - Das große struct, in dem viele Funktionen herumschreiben, oder viele
> lokale Variablen?

So lokal wie möglich.

>  - Fehlerbehandlung durch den Aufrufer oder den Aufgerufenen? Wie werden
> Fehler signalisiert und wie behandelt?

Vor allem konsistent, nicht mal so, mal so.

>  - Parameterlisten fcn(In1, In2, *Out) oder fnc(*Out, In1, In2)
> (__builtin_add_overflow() vs. memcpy() )?

Geschmackssache. Wiederum: möglichst einheitlich ist wichtiger als das 
konkrete "wie herum".

>  - Nur intern verwendete Structs voll sichtbar definieren und in den
> Variablenraum der aufrufenden Funktion, oder verstecken und malloc() *)?

Je weniger nach außen dringt, um so einfacher ist es überschau- und bei 
Bedarf änderbar.

>  - Funktionen mit vielen Parametern oder mit Struct-Parametern?

Oftmals auch Geschmackssache.

>  - Konfiguration per Header oder per Build-Parameter?

Hauptsache nicht gemischt.

>  - Endmarker oder Längenvariable *)?

Hängt vom konkreten Fall ab.

>  - Behandlung von n+1-Fehlern: Prüfende Codeabschnitte (mit
> Laufzeit-Overhead) oder Verantwortung auf den Aufrufer abwälzen?

Hängt davon ab, ob du dem Aufrufer vertrauen kannst. Eine 
Bibliotheksfunktion sollte daher prüfen, irgendwelche projektinternen 
Funktionen können sich auf bereits vorgenommene Prüfungen verlassen, 
aber man tut gut daran, dass irgendwo am Anfang der Funktion auch so zu 
dokumentieren ("Diese Funktion kann nur von foo() oder bar() aus 
aufgerufen werden, die garantieren, dass Bedingung X eingehalten wird.")

von Walter T. (nicolas)


Lesenswert?

Jörg W. schrieb:
> [...] aber man tut gut daran, dass irgendwo am Anfang der Funktion auch so zu
> dokumentieren ("Diese Funktion kann nur von foo() oder bar() aus
> aufgerufen werden, die garantieren, dass Bedingung X eingehalten wird.")

Auch so ein Fall: Nur dokumentieren oder erzwingen?

Jörg W. schrieb:
> Von Fall zu Fall entscheiden.

So würde ich jede der Fragen beantworten. Unter anderem deswegen 
interessiert mich ja guter Quelltext anderer Leute: Wie solche 
Abwägungen im konkreten Fall getroffen wurden.

Die Beweggründe lassen sich aus Quelltext natürlich nur schwer lesen, 
wenn sie nicht sehr explizit kommentiert sind, aber wenig ist besser als 
nichts.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Walter T. schrieb:
> Auch so ein Fall: Nur dokumentieren oder erzwingen?

Wie willst du erzwingen, dass eine Funktion nur von "bekannt guten" 
gerufen wird?

Zusätzliche Tests innerhalb einer Funktion kosten halt sehr sicher 
zusätzliche Zeit. Wenn ich mir sicher sein kann, dass der Aufrufer den 
Test bereits gemacht hat, dann lass ich sowas weg, aber dokumentiere, 
dass ich mich drauf verlasse an dieser Stelle.

Bei einer Bibliotheksfunktion, die "irgendjemand" aufrufen kann, ist das 
anders. Auch da kann (und sollte) man natürlich dokumentieren, auf was 
man sich bereits verlässt.

Auf beiden Seiten zu testen bringt in aller Regel einen 
Performancenachteil. Wenn das API einer Funktion einen bestimmten Test 
bereits garantiert, dann muss der Aufrufer ihn nicht ausführen. Sowas 
ist daher Quatsch:
1
  if (p != NULL)
2
    free(p);

Das API von free() (sofern es sich um eine standarkonforme 
Implementierung handelt) garantiert nämlich, dass im Falle eines 
Nullzeigers keine Aktion erfolgt.

: Bearbeitet durch Moderator
von Walter T. (nicolas)


Lesenswert?

Jörg W. schrieb:
> Wie willst du erzwingen, dass eine Funktion nur von "bekannt guten"
> gerufen wird?

Erst gar nicht exportieren (Library) oder "static" auf Quelltext-Ebene 
oder zumindest nur in einem "private"-Header.

Jörg W. schrieb:
> Sowas
> ist daher Quatsch:
>   if (p != NULL)
>     free(p);
>
> Das API von free() (sofern es sich um eine standarkonforme
> Implementierung handelt) garantiert nämlich, dass im Falle eines
> Nullzeigers keine Aktion erfolgt.

Auch das hätte ich völlig anders herum gesehen. Meine Denkweise wäre 
gewesen: "Wenn die Implementierung standardkonform ist, wird die 
doppelte Prüfung wegoptimiert, weil der Compiler in einer hosted 
environment seine C-Lib-Funktionen ja kennt. Und wenn nicht, ist die 
Prüfung jetzt da. In jedem Fall erspart mir das aber, bei der nächsten 
Fehlersuche in die Doku zu gucken, was von beidem zutrifft, und nicht 
bei der nächsen Fehlersuche oder beim nächsten Lesen hier 
hängenzubleiben." Ich glaube, mehr als die Hälfte aller Klammern, die 
ich setze, sind aus ähnlichen Erwägungen.

Welche Abwägung jetzt besser ist, ist diskutabel. Wahrscheinlich Deine, 
weil Du mehr Erfahrung hast. Aber beide kennen ist nie verkehrt.

Die folgende Aussage in Fefes Blog war der Anlass für den Thread:
"
Update: Ich muss an der Stelle meiner Enttäuschung ein bisschen Luft 
machen. Dieser SM2-Bug ... es gibt da ein beliebtes Muster, wie man 
Funktionen aufbaut, die variabel viel Daten zurückgeben. Entweder die 
Funktion gibt einen frisch allozierten Puffer zurück. Das ist am 
einfachsten, aber aus irgendwelchen Gründen unpopulär. Daher hat sich 
das populäre Muster herausgearbeitet, dass du die Funktion zweimal 
aufrufst. Das erste Mal mit einem ungültigen Zielpuffer, dann sagt er 
dir, wieviel Platz er im Puffer braucht. Dann holst du dir einen Puffer 
in der Größe und rufst es nochmal auf.
"

Ich hatte dieses Pattern nie vorher in freier Wildbahn gesehen. Was aber 
eben auch daran liegt, selten in der freien Wildbahn zu sein. Aber ich 
habe auch noch nie mit einer Library gearbeitet, die so angesprochen 
werden wollte. Ich kenne Libraries, die einen Zeiger auf das malloc() 
meiner Wahl haben wollten und andere, die irgendeine Form von 
getsize()-Funktion hatten.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Ich hatte damals ein Open-Source Projekt gestartet, das reges Interesse 
fand. Da bekam ich von anderen Entwicklern eine Menge Feedback mit 
Verbesserungsvorschlägen, sowohl was den Stil angeht als auch fachliche 
Aspekte.

Da es schon so viele gibt wird es immer schwieriger ein neues Projekt zu 
starten für das sich auch andere interessieren. Aber es gibt immer 
wieder mal bestehende Projekte die nach Mitmachern suchen - vor allem 
zum Aufräumen von Altlasten.

von Walter T. (nicolas)


Lesenswert?

Stefan ⛄ F. schrieb:
> Aber es gibt immer
> wieder mal bestehende Projekte die nach Mitmachern suchen - vor allem
> zum Aufräumen von Altlasten.

Wie Altlasten aussehen, weiß ich ja. Habe ich ja selbst. Wie soll man 
Altlasten beseitigen, wenn man noch nie gesehen hat, wie es in richtig 
aussieht?

von Stefan F. (Gast)


Lesenswert?

Walter T. schrieb:
> Wie Altlasten aussehen, weiß ich ja. Habe ich ja selbst. Wie soll man
> Altlasten beseitigen, wenn man noch nie gesehen hat, wie es in richtig
> aussieht?

Dabei helfen die dann die anderen Projektmitglieder. So etwas lernt man 
kontinuierlich über Jahre hinweg - eigentlich bis zum Ruhestand.

von Walter T. (nicolas)


Lesenswert?

Stefan ⛄ F. schrieb:
> Walter T. schrieb:
>> Wie Altlasten aussehen, weiß ich ja. Habe ich ja selbst. Wie soll man
>> Altlasten beseitigen, wenn man noch nie gesehen hat, wie es in richtig
>> aussieht?
>
> Dabei helfen die dann die anderen Projektmitglieder.

Und woher weiß ich, dass die das wissen? Es ist ja nicht so, als hätten 
sie ein sauberes Projekt als Referenz vorzuweisen.

von Stefan F. (Gast)


Lesenswert?

Walter T. schrieb:
> Und woher weiß ich, dass die das wissen? Es ist ja nicht so, als hätten
> sie ein sauberes Projekt als Referenz vorzuweisen.

Das Team bestimmt, was "sauber" ist und was nicht. Jedes Team und jedes 
Projekt hat andere Ansprüche. Sie ändern sich ständig.

Deswegen ist es problematisch, solche Anweisungen als Buch fest zu 
halten. Bücher mit den Worten "Patterns" und "Kochbuch" im Titel sind da 
auf einem sinnvollen Level. Der Rest ergibt sich in den Projekt-Teams.

Alleine lernt man so etwas 10x langsamer als im Team. Und im Team ist es 
schon ein nie endender Lernprozess der bis zu Ruhestand andauert.

von EAF (Gast)


Lesenswert?

Walter T. schrieb:
> Wie Altlasten aussehen, weiß ich ja. Habe ich ja selbst. Wie soll man
> Altlasten beseitigen, wenn man noch nie gesehen hat, wie es in richtig
> aussieht?

Du irrst ganz fürchterlich!
Wenn du meinst, du könntest aus anderer Leuten Unterhosen ablesen, was 
es Morgen zu Mittag gibt.

Vergiss es!
Lerne einfach, wie man es richtig tut, stehe zu deinen Lücken, und werde 
glücklich.

von NichtWichtig (Gast)


Lesenswert?

Man könnte sich ja MISRA als Anregung her nehmen.

https://de.wikipedia.org/wiki/MISRA-C

von Walter T. (nicolas)


Lesenswert?

Stefan ⛄ F. schrieb:
> Und im Team ist es
> schon ein nie endender Lernprozess der bis zu Ruhestand andauert.



Na toll. Die Empfehlung lautet dann also, solche Diskussionen für den 
Rest des Lebens ständig zu führen. Ich kann mir nur sehr schwer eine 
noch unerquicklichere Freizeitbeschäftigung vorstellen. Im Verhältnis 
dazu ist es wahrscheinlich sogar angenehm, sich nach Feierabend gegen 
Geld ordentlich auspeitschen zu lassen.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Walter T. schrieb:
> Na toll. Die Empfehlung lautet dann also, solche Diskussionen für den
> Rest des Lebens ständig zu führen.

Ja

> Ich kann mir nur sehr schwer eine noch
> unerquicklichere Freizeitbeschäftigung vorstellen.

Ich werde für das Diskutieren bezahlt. Aber ja, eine klare Trennung 
zwischen Freizeit und Beruf gibt es in meinem Umfeld bei keinem guten 
Softwareentwickler. Das machen nur die Looser, die nirgendwo länger als 
6 Monate bleiben.

Für Softwareentwickler ist es auch selbstverständlich, sich zu einem 
wesentlichen Anteil während der Freizeit for zu bilden, und zwar auf 
eigene Kosten.

Wer Abends um 17:00 abschalten will, der sollte sich besser einen 
anderen Job suchen. Nenne es ruhig "Scheiß Job". Je weniger Leute ihn 
machen wollen, umso besser für mich.

von NichtWichtig (Gast)


Lesenswert?

So sieht's aus!!

von Walter T. (nicolas)


Lesenswert?

Stefan ⛄ F. schrieb:
> Nenne es ruhig "Scheiß Job".

Gerne. Wenn man seinen Job in der Freizeit fortsetzt, aber sich 
offentlich so vor den Erzeugnissen der Kollegen ekelt, dass man 
keinerlei vorzeigbares Material zeigen könnte, trifft die Bezeichnung 
sicherlich zu.

Da bin ich echt froh, dass gelungene Erzeugnisse aus meiner Zunft in 
jedem Haushalt und jedem Industriebetrieb zu finden sind.

von Stefan F. (Gast)


Lesenswert?

Walter T. schrieb:
> aber sich offentlich so vor den Erzeugnissen der Kollegen ekelt,
> dass man keinerlei vorzeigbares Material zeigen könnte

Wie meinst du das? Erwartest du dass ich die Erzeugnisse meiner Kollegen 
veröffentliche? Das darf ich nicht!

Abgesehen davon ekele ich mich nicht vor den Erzeugnissen der Kollegen. 
Ganz im Gegenteil. Wer ekelt sich denn, du? Dann solltest du das mit 
deinen Kollegen klären. Harte Regeln funktionieren nicht, denn 
Softwareentwickler sind in gewissem Sinne auch Künstler. Aber man kann 
gute Kompromisse abstimmen, und gemeinsam richtig gute Produkte 
abliefern.

Ich sage dir, warum ich Softwareentwickler bin: Weil ich es kann.

Und weil das nur wenige Menschen können, wird der Job gut bezahlt. Ich 
versorge damit 4 Personen ohne finanzielle Sorgen. Ich kann nichts 
anderes, was ebenso gut bezahlt wird.

von Walter T. (nicolas)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wie meinst du das? Erwartest du dass ich die Erzeugnisse meiner Kollegen
> veröffentliche?

So ein Unsinn. Als ob Deine Firma die einzige wäre, die Software 
herstellt.

Aber offensichtlich beschäftigst Du Dich auf Quelltext-Ebene nur mit 
Sachen aus Deiner Firma (und wahrscheinlich Schnipsel aus TED-Talks). 
Das deutet auch nicht unbedingt auf einen Blick über den Tellerrand hin.

Oder Deine Hauptarbeit ist tatsächlich das Diskutieren. Aber dann bist 
Du auch gar nicht der, den ich thematisch gefragt habe.

Und ja: Ich betrachte auch Fachkollegen, die bei anderen Firmen 
arbeiten, als solche.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Walter T. schrieb:
> So ein Unsinn. Als ob Deine Firma die einzige wäre, die Software
> herstellt.

Du hast nach "Erzeugnissen der Kollegen" der Kollegen gefragt. Kollegen 
sind doch die Angestellten der selben Firma, oder nicht?

von Walter T. (nicolas)


Lesenswert?

Programmierer schrieb:
> ISBN 978-0201633610
>
> Das Strategy-Pattern ist aber nicht sehr komplex, das gezeigte
> Codebeispiel ist hier schon ziemlich ausreichend.

Nach der ersten Sichtung: Das Buch geht komplett auf Design-Pattern in 
C++. Damit bringt es die Frage in dem verlinkten Thread kein bischen 
weiter, weil die Fragestellung in C++ gar nicht aufgetreten wäre.

von Walter T. (nicolas)


Lesenswert?

jo schrieb:
> https://link.springer.com/book/10.1007/978-3-540-76394-9
>
> ((
> 
https://www.tu-ilmenau.de/universitaet/fakultaeten/fakultaet-informatik-und-automatisierung/profil/institute-und-fachgebiete/institut-fuer-theoretische-informatik/fachgebiet-komplexitaetstheorie-und-effiziente-algorithmen/team/prof-m-dietzfelbinger/taschenbuch-der-algorithmen
> ))

Das Taschenbuch der Algorithmen ist genau das, was der Name verspricht. 
In meinen ersten Programmier-Monaten wäre es wunderbar gewesen, es zur 
Hand zu haben. Ich denke, es ist für ältere Schüler gedacht.

Aber hier hilft es wohl nicht weiter. Gute Algorithmen zu finden, ist 
fast nie das Problem.

von Stefan F. (Gast)


Lesenswert?

Walter T. schrieb:
> Oder Deine Hauptarbeit ist tatsächlich das Diskutieren. Aber dann bist
> Du auch gar nicht der, den ich thematisch gefragt habe.

Diskutieren ist auf jeden Fall ein wesentlicher Bestandteil meiner 
täglichen Arbeit. So etwa 20% würde ich mal sagen.

Ich wurde Senior Developer, weil ich mit meiner Erfahrung den Nachwuchs 
anleite und beaufsichtige. Also denke ich schon, dass auch du meine 
Meinung nicht geringschätzen solltest.

Wenn du Schwierigkeiten damit hast, dann suche dir besser einen anderen 
Job. Denn nicht ich bin dann dein Problem, sondern deine Einstellung zur 
Arbeit.

von Der Opa aus der Muppet Show (Gast)


Lesenswert?

> Ich werde für das Diskutieren bezahlt.

Die Maschinenbauer haben eine bessere Lösung gefunden als die 
Softwareentwickler.

Dort werden nur ein paar Ingenieure beim Deutsches Institut für Normung 
fürs Diskutieren bezahlt.

Der größte Teil der Ingenieure schaut in den DIN Normen nach, zu was für 
einer Lösung die Diskussion geführt hat. Und alle anderen setzen einfach 
das um, was die Ingenieure ausarbeiten.

In der Softwareentwicklung will jeder mit diskutieren. Ganz egal, ob er 
versteht, wo das Problem liegt.

von Stefan F. (Gast)


Lesenswert?

Der Opa aus der Muppet Show schrieb:
> Der größte Teil der Ingenieure schaut in den DIN Normen nach
> In der Softwareentwicklung will jeder mit diskutieren.

Ja, da sagst du was wahres. Die Softwareentwicklung ist noch nicht so 
weit fortgeschritten.

von Walter T. (nicolas)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wenn du Schwierigkeiten damit hast, dann suche dir besser einen anderen
> Job. Denn nicht ich bin dann dein Problem, sondern deine Einstellung zur
> Arbeit.

Warum soll ich mir einen anderen Job suchen, wenn Du Dich mit 
Softwareentwicklung und Softwareentwicklern herumärgerst?

Ich bin sehr froh darüber, das in meinem genau nicht zu tun.

Der Opa aus der Muppet Show schrieb:
> Dort werden nur ein paar Ingenieure beim Deutsches Institut für Normung
> fürs Diskutieren bezahlt.

Ich glaube, Du weißt nicht, wie Normen gemacht werden, oder ignorierst 
das.

Der Opa aus der Muppet Show schrieb:
> Die Maschinenbauer haben eine bessere Lösung gefunden als die
> Softwareentwickler.

Definitiv. Schon allein deswegen, weil Sachen, die fertig sein müssen, 
fertig sein müssen.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Walter T. schrieb:

>> Das API von free() (sofern es sich um eine standarkonforme
>> Implementierung handelt) garantiert nämlich, dass im Falle eines
>> Nullzeigers keine Aktion erfolgt.
>
> Auch das hätte ich völlig anders herum gesehen. Meine Denkweise wäre
> gewesen: "Wenn die Implementierung standardkonform ist, wird die
> doppelte Prüfung wegoptimiert, weil der Compiler in einer hosted
> environment seine C-Lib-Funktionen ja kennt. Und wenn nicht, ist die
> Prüfung jetzt da.

Ist auch ein Argument.

> Ich hatte dieses Pattern nie vorher in freier Wildbahn gesehen.

strncpy(), snprintf() und Konsorten arbeiten so: du gibst eine 
Maximallänge an, die du zu speichern gewillt bist, die aufgerufene 
Funktion gibt allerdings unabhängig davon immer zurück, wieviel sie 
gespeichert _hätte_. Wenn die Maximallänge 0 ist, darf üblicherweise 
auch der Zeiger ein Nullzeiger sein, weil ja dann nie was zu speichern 
ist.

Vorteil ist, dass es nicht unbedingt malloc() sein muss, wo der Aufrufer 
seinen Speicher her nimmt. Insbesondere kann man natürlich ein Schema 
haben: "Jeder vernünftig zu verarbeitende String hier passt in 100 
Zeichen", den Puffer dafür stellt man fix bereit, und das "n" im 
Funktionsnamen agiert nur als "Notbremse" gegen Unfug. Das geht mit 
einem Pendant wie asprintf() nicht, die allozieren immer mit malloc().

Nachteil ist der zweimalige Aufruf (und der entsprechende zweimalige 
Rechenaufwand), wenn es komplett dynamisch und beliebig lang sein soll. 
Anderseits kann man durch den zweimaligen Aufruf bei "Ergebnis wird viel 
zu lang und kompletter Unsinn" nach dem ersten Lauf abbrechen, während 
eine Implementierung wie asprintf() stets versuchen wird, einen ggf. 
auch unsinnig großen Puffer zu allozieren.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jörg W. schrieb:
>> Auch das hätte ich völlig anders herum gesehen. Meine Denkweise wäre
>> gewesen: "Wenn die Implementierung standardkonform ist, wird die
>> doppelte Prüfung wegoptimiert, weil der Compiler in einer hosted
>> environment seine C-Lib-Funktionen ja kennt. Und wenn nicht, ist die
>> Prüfung jetzt da.
>
> Ist auch ein Argument.

Machen sie allerdings leider nicht:
1
#include <stdlib.h>
2
3
void myfree(char *s)
4
{
5
        if (s != NULL)
6
                free(s);
7
}

Mein Clang generiert daraus:
1
        .text
2
        .file   "foo.c"
3
        .globl  myfree                  # -- Begin function myfree
4
        .p2align        4, 0x90
5
        .type   myfree,@function
6
myfree:                                 # @myfree
7
        .cfi_startproc
8
# %bb.0:
9
        pushq   %rbp
10
        .cfi_def_cfa_offset 16
11
        .cfi_offset %rbp, -16
12
        movq    %rsp, %rbp
13
        .cfi_def_cfa_register %rbp
14
        testq   %rdi, %rdi
15
        je      .LBB0_1
16
# %bb.2:
17
        popq    %rbp
18
        .cfi_def_cfa %rsp, 8
19
        jmp     free                    # TAILCALL
20
.LBB0_1:
21
        .cfi_def_cfa %rbp, 16
22
        popq    %rbp
23
        .cfi_def_cfa %rsp, 8
24
        retq
25
.Lfunc_end0:
26
        .size   myfree, .Lfunc_end0-myfree
27
        .cfi_endproc
28
                                        # -- End function
29
        .ident  "FreeBSD clang version 10.0.1 (git@github.com:llvm/llvm-project.git llvmorg-10.0.1-0-gef32c611aa2)"
30
        .section        ".note.GNU-stack","",@progbits
31
        .addrsig

Der Test ist also drin. :(

Bei GCC 9 nicht anders.

von Nico T. (wurstnase)


Lesenswert?

Wie grob darf die Architektur sein? Wie fein sollte sie maximal werden?


Ein groben Überblick gibt es hier: 
http://www.chibios.org/dokuwiki/doku.php?id=chibios:documentation:books:rt:architecture


Allgemein gibt es eine Sicht auf das Ganze hier: 
http://www.chibios.org/dokuwiki/doku.php?id=chibios:documentation:books:rt:start

von Walter T. (nicolas)


Lesenswert?

Jörg W. schrieb:
> Machen sie allerdings leider nicht:

Gut zu wissen. Also einer der Fälle, wo Faulheit beim Lesen der Doku mit 
drei verlorenen Takten betraft wird.

Jörg W. schrieb:
> strncpy(), snprintf() und Konsorten arbeiten so

Stimmt, die kann man so nutzen. Ich habe es nur nie in Erwägung gezogen, 
weil auf dem µC die Textlängen ja durch die Darstellbarkeit auf dem 
Display von Natur aus begrenzt sind.

Nico T. schrieb:
> Wie grob darf die Architektur sein? Wie fein sollte sie maximal werden?

Das Projekt gefällt mir immer besser. Wobei das Diagramm weitere Fragen 
aufwirft, nämlich ob die Macher es geschafft haben, dass so 
übersichtliche Diagramme direkt aus Doxygen herauspurzeln, oder ob das 
von Hand mit graphviz gemacht wurden.

: Bearbeitet durch User
von Walter K. (walter_k488)


Lesenswert?

Thomas W. schrieb:
> Walter T. schrieb:
>> Hallo zusammen,
>>
>> schon seit langem stört mich, dass meine Fähigkeiten beim Programmieren
>> in C stagnieren. Das ist nicht wirklich verwunderlich. Die meiste
>
> Ich bin ein wenig bloed: Natuerlich den Tanenbaum, Operating System,
> design and implementation. Man kann ja zu Minix stehen wie man will, es
> sind aber fortgeschrittene Lehrbuecher. Und, wie gewuenscht, reines C
> mit Assembler fuer den Boot.
>
> Gruesse
>
> Th.

Für alle Spezialisten, die jetzt wegen und über Minix lächeln:

„… Im August 2017 wurde durch Untersuchungen von Sicherheitsforschern[5] 
bekannt, dass die Intel Management Engine Minix als Betriebssystem 
einsetzt.[6] Auch Tanenbaum hatte zuvor nichts davon gewusst. Durch den 
Einbau in die Intel-Chips ist Minix eines der meistverbreiteten 
Betriebssysteme überhaupt...“ ( Wiki )

von Nachdenklicher (Gast)


Lesenswert?

Programmierer schrieb:
> Das ist leider auch nur ein schöner Traum. In der Realität basteln die
> Profis (also die, die dafür bezahlt werden) auch nur vor sich hin,

Ja, leider. Letztens Quellcode von einem unserer "alten Hasen" in die 
Finger bekommen. Über so Dinge wie ungarische Notation bei den 
Bezeichnern oder die Plazierung von Klammern kann man ja streiten. Wenn 
allerdings alleine in der main() 25 gotos stehen (ja, goto. In C.), 
sieht man die Fähigkeiten dieser Kollegen in anderem Licht.

von Walter K. (walter_k488)


Lesenswert?

Nachdenklicher schrieb:
> Wenn allerdings alleine in der main() 25 gotos stehen (ja, goto. In C.),

Das sind halt die Kollegen, die vor 30 Jahren das Programmieren an der 
VHS in Basic lernten ;-)

von Nachdenklicher (Gast)


Lesenswert?

Walter K. schrieb:
> Das sind halt die Kollegen, die vor 30 Jahren das Programmieren an der
> VHS in Basic lernten ;-)

Weiß nicht, ob die auch Diplomstudiengänge anbieten? ;-) Der Kerl ist 
jedenfalls Diplominformatiker, und legt großen Wert darauf, von der Uni 
und nicht von der FH zu kommen.

von Thomas W. (Gast)


Lesenswert?

Walter K. schrieb:
> Thomas W. schrieb:
> Für alle Spezialisten, die jetzt wegen und über Minix lächeln:

Da war nicht als Kritik gemeint: Minix (ich hatte das Buch 1991 gekauft) 
benutzt einen MicroKernel (das war in den '90 sehr hip). Das ist 
(latuernich) heute nicht mehr so hip weil (prinzipbedingt) keine so 
grosse Performance hast (dafuer hat man eine starke Kapselung). Beim 
MicroKernel werden einzelne Funktionen des Kernels in getrennte Prozesse 
geteilt, die Kommunikation zwischen den Prozessen geht ueber 
Messagepassing.

Und die Qualitaet einen Lehrbuches kann man schlecht messen (Zwei Meter 
Goethe, bitte!). Da Tanenbaum es aber im wesentlich allein gebaut hat 
und als Lehrsystem konzipiert hatte, ist es sehr konsistent. Und ein 
Unix auf einen 8086(!) hat auch Charme, vor allen Dingen wenn man von 
MS-DOS kommt.

Viele Gruesse

Th.

von Walter K. (walter_k488)


Lesenswert?

Nachdenklicher schrieb:
> Walter K. schrieb:
>> Das sind halt die Kollegen, die vor 30 Jahren das Programmieren an der
>> VHS in Basic lernten ;-)
>
> Weiß nicht, ob die auch Diplomstudiengänge anbieten? ;-) Der Kerl ist
> jedenfalls Diplominformatiker, und legt großen Wert darauf, von der Uni
> und nicht von der FH zu kommen.

Kann ja sein, dass jemand von der Uni kommt - aber dort hat man 
vielleicht Politik oder irgendwas mit Gerechtigkeit studiert … lol

von Programmierer (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Aber ja, eine klare Trennung
> zwischen Freizeit und Beruf gibt es in meinem Umfeld bei keinem guten
> Softwareentwickler. Das machen nur die Looser, die nirgendwo länger als
> 6 Monate bleiben.

So ein Quatsch. So macht man sich kaputt und kann bald nie wieder 
arbeiten. Wer sich eine gesunde Trennung zwischen Privat & Arbeit 
schafft, privat dann einen Ausgleich (z.B. Sport) macht bleibt länger 
fit und produktiv, und das ist auch problemlos in unbefristeten langen 
Arbeitsverhältnissen machbar. Wer als Arbeitnehmer den Raubbau am 
eigenen Körper zum alleinigen Nutzen der Firma schon derart in sein 
eigenes Selbstverständnis aufgenommen hat, hat sich dem Kapitalismus 
völlig unterworfen...

Walter T. schrieb:
>  - Viele Funktionen, die ungefähr etwas ähnliches machen, oder wenige
> Funktionen mit ellenlangen Parameterlisten?

Wenige Funktionen, ggf. templates, und cleveres Auftrennen von 
orthogonalen Elementen in eigene Funktionen sodass viele verschiedene 
Use Cases durch richtiges Kombinieren abgedeckt werden können. 
Klassisches Beispiel: Unix-Style fork+exec+dup2+pipe vs. Windows-Style 
CreateProcessEx zum Starten von Prozessen und abfangen des Stdout. Die 
Unix-Funktionen sind alle klein und leicht merkbar, während sich niemand 
all die Parameter und structs des Windows-Koloss merken kann!

>  - Ellenlange Funktionsaufrufe oder viele Zwischenvariablen?

Geschmackssache.

>  - Der dicke Master Control Blob oder eine Ansammlung eng verknüpfter
> voneinander abhängiger Funktionen?

Einzelne wartbare Funktionen.

>  - Das große struct, in dem viele Funktionen herumschreiben, oder viele
> lokale Variablen?

Bloß nicht das "The Blob"-Antipattern! Viele kleine structs/Klassen.

>  - Fehlerbehandlung durch den Aufrufer oder den Aufgerufenen? Wie werden
> Fehler signalisiert und wie behandelt?

Exceptions ermöglichen ein konsistentes Weitergeben und Behandeln von 
Fehlern. Wo Fehler behandelt werden ist keine Frage des Stils sondern 
prinzipiell direkt durch die Anwendung vorgegeben.

>  - Parameterlisten fcn(In1, In2, *Out) oder fnc(*Out, In1, In2)
> (__builtin_add_overflow() vs. memcpy() )?

Ziemlich egal.

>  - Nur intern verwendete Structs voll sichtbar definieren und in den
> Variablenraum der aufrufenden Funktion, oder verstecken und malloc() *)?

OOP und public/private.

>  - Funktionen mit vielen Parametern oder mit Struct-Parametern?

Egal.

>  - Konfiguration per Header oder per Build-Parameter?

Am Besten per template-Parameter.

>  - Endmarker oder Längenvariable *)?

Meistens Längenvariable.

>  - Behandlung von n+1-Fehlern: Prüfende Codeabschnitte (mit
> Laufzeit-Overhead) oder Verantwortung auf den Aufrufer abwälzen?

Solche und andere Programmierfehler kann man gut mit assert() prüfen. 
Man kann in vielen Fällen sowieso nicht vernünftig auf den Fehler 
reagieren (außer Programm abstürzen lassen).

Nachdenklicher schrieb:
> Wenn
> allerdings alleine in der main() 25 gotos stehen (ja, goto. In C.),
> sieht man die Fähigkeiten dieser Kollegen in anderem Licht.

In C kann "goto" unter bestimmten Umständen sinnvoll sein, weil es keine 
vernünftige Ressourcenverwaltung (à la RAII) und Fehlerbehandlung 
beherrscht. Dann muss man es aber nach einem ganz bestimmten Schema 
einsetzen. Aber Deppen gibt's überall. Über die muss man sich nicht 
einzeln aufregen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Walter K. schrieb:
> Nachdenklicher schrieb:
>> Wenn allerdings alleine in der main() 25 gotos stehen (ja, goto. In C.),
>
> Das sind halt die Kollegen, die vor 30 Jahren das Programmieren an der
> VHS in Basic lernten ;-)

Eher die, die von FORTRAN auf C umgestiegen sind.

Dazu passend würden dann noch sackweise globaler Variablen mit 6 Zeichen 
langen Namen gehören. ;-)

von Stefan F. (Gast)


Lesenswert?

Programmierer schrieb:
> So ein Quatsch. So macht man sich kaputt und kann bald nie wieder
> arbeiten.

Es ist eine Frage der richtigen Balance. Man solle es nicht übertreiben.

> Wer sich eine gesunde Trennung zwischen Privat & Arbeit
> schafft ... bleibt länger fit und produktiv, und das ist auch
> problemlos in unbefristeten langen Arbeitsverhältnissen machbar.

Natürlich, eine gesunde Trennung kann ich nur jedem Empfehlen. Gesunde 
Trennung heißt nicht vollständige Trennung.

Manchmal (vielleicht 3x im Jahr) werde ich Abends oder am Wochenende vom 
Betrieb um Hilfe gebeten. Das mache ich gerne. Einmal in 30 Jahren habe 
ich meinen Urlaub vorzeitig abgebrochen und wurde dafür fair 
entschädigt.

Ich setze viel Freizeit zum Lernen ein. Niemand zwingt mich dazu.

Neulich wurde in der Firma beschlossen, dass wir Teile eines Cloud 
Systems in Go programmieren werden (Go kannte ich bis dahin noch nicht). 
Danach habe ich drei Wochenenden mit Tutorials verbracht, um die 
Grundlagen der Sprache zu lernen und alle für uns relevanten 
Schnittstellen durchzuchecken.

Das halte ich für normal. Ich kann nicht von der Schule/Uni kommen und 
glauben, dass ich in den nächsten 40 Jahren nichts mehr dazu lernen 
muss. Manchmal wird man während der Arbeitszeit zu teuren Schulungen 
geschickt, aber das eben nur manchmal. Für diesen Luxus fehlt es 
meistens an Zeit und Geld. Zumal man nach den Schulungen auch viel Zeit 
braucht, das komprimierte Wissen zu verinnerlichen und auszuprobieren.

Im Gegenzug kann ich jederzeit mal eine Pause zum Einkaufen machen oder 
kurzfristig (quasi sofort) bis zu einem Tag frei nehmen. Mich fragt auch 
niemand, wie lange ich auf dem Klo sitze (Kreativpausen) oder ob ich 
mein Mittagessen schnell genug herunter gewürgt habe.

Es ist ein gegenseitiges Geben und Nehmen. Auf jeden Fall ist wichtig, 
dass man seinen Mund aufmacht und mit dem Chef über Bedürfnisse beider 
Seiten (!) sprechen kann.

von Thomas W. (Gast)


Lesenswert?

Jörg W. schrieb:
> Walter K. schrieb:
>> Nachdenklicher schrieb:
>>> Wenn allerdings alleine in der main() 25 gotos stehen (ja, goto. In C.),
>>
>
> Eher die, die von FORTRAN auf C umgestiegen sind.
>
> Dazu passend würden dann noch sackweise globaler Variablen mit 6 Zeichen
> langen Namen gehören. ;-)

Mein Highlight ist computed GOTO in Fortran77 (aus: 
https://riptutorial.com/fortran/example/11873/computed-goto)
1
Computed GOTO allows branching of the program according to the value of an integer expression.
2
3
GOTO (label_1, label_2,... label_n) scalar-integer-expression
4
5
If scalar-integer-expression is equal to 1 the program continues at statement label label_1, if it is equal to 2 it goes to label_2 and so on. If it is less then 1 or larger than n program continues on next line.


Goto to Hell!

Gruesse

Th.

von Stefan F. (Gast)


Lesenswert?

Thomas W. schrieb:
> Mein Highlight ist computed GOTO in Fortran77
> Goto to Hell!

Allerdings.

In Basic gab es mal eine Zeit ohne Prozeduren, labels und Schleifen 
(außer FOR).

Da hatte jedes Programm hunderte Gotos die kreuz und quer zu bestimmten 
Zeilennummern sprangen. We man Code einfügte, stimmten die ganzen 
Zeilennummern nicht mehr.

Das ist die Zeit, in der ich das Programmieren lernte. Früher war 
nicht alles besser, definitiv nicht.

von Programmierer (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Es ist eine Frage der richtigen Balance. Man solle es nicht übertreiben.

Die 40h-Woche ist schon an der Grenze.

Stefan ⛄ F. schrieb:
> Ich setze viel Freizeit zum Lernen ein. Niemand zwingt mich dazu.

Ich dachte wer das nicht macht ist ein Loser?

Stefan ⛄ F. schrieb:
> Danach habe ich drei Wochenenden mit Tutorials verbracht, um die
> Grundlagen der Sprache zu lernen und alle für uns relevanten
> Schnittstellen durchzuchecken.

Also 4 Wochen durchgearbeitet ohne Pause? 3 Wochenenden, d.h. 6 Tage 
Lebenszeit der Firma geschenkt, nur weil in der Woche "keine Zeit" dafür 
ist? Das findest du gesund? Irre. Wenn ich was für die Firma lernen 
soll, dann muss die Firma mir dafür Platz in der bezahlten Arbeitszeit 
machen. Wenn das nicht geht, müssen sie eben noch wen einstellen.

Schlimm genug dass Manager eine solche Aufopferung irgendwie 
voraussetzen, noch schlimmer wenn Arbeitnehmer das für sich selbst und 
Gruppenzwang-mäßig für ihre Kollegen als selbstverständlich sehen (weil 
alle anderen Loser sind?). Scheint auch im akademischen Umfeld sehr 
beliebt zu sein.

Thomas W. schrieb:
> Mein Highlight ist computed GOTO in Fortran7

Sowas ähnliches kann der GCC auch:
https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html

von Stefan F. (Gast)


Lesenswert?

Programmierer schrieb:
> Scheint auch im akademischen Umfeld sehr beliebt zu sein.

So ist es. Entweder lässt du dich drauf ein und spielst mit, oder eben 
nicht. Wer nicht mit macht, jobbt sich mühsam von Firma zu Firma durch 
weil er nirgendwo lange bleiben kann. Zudem kommt man so nicht auf ein 
ordentliches Gehalt.

So ist der Alltag der allermeisten Softwareentwickler. Warum sollte ich 
hier eine heile Welt propagieren, die nicht existiert? Lieber den Beruf 
so akzeptieren wie er ist, oder halt einen anderen Beruf wählen.

von Programmierer (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Entweder lässt du dich drauf ein und spielst mit, oder eben
> nicht. Wer nicht mit macht, jobbt sich mühsam von Firma zu Firma durch
> weil er nirgendwo lange bleiben kann. Zudem kommt man so nicht auf ein
> ordentliches Gehalt.

Das stimmt halt absolut nicht. Ich mache genau 40h pro Woche, hatte 
bisher immer unbefristete Verträge, musste nie "jobben" und verdiene 
sehr gut. Niemand wird rausgeworfen weil er vernünftige Arbeitszeiten 
einhält. Außerdem nimmt die Arbeitsleistung auch irgendwann wieder ab, 
d.h. mehr Arbeiten ist weniger Leistung.

Stefan ⛄ F. schrieb:
> So ist der Alltag der allermeisten Softwareentwickler

Quatsch. Ganze Heerscharen von "white-collar"-Programmierern machen 
geregelte Arbeitszeiten. Das ist das Tolle an der Software-Branche - man 
kann relativ unkompliziert einen stabilen Job mit geregelter Arbeitszeit 
bekommen. Vielleicht bist du einfach nur ein einer toxischen 
Ausbeutungs-Betrieb?

von Peter D. (peda)


Lesenswert?

Stefan ⛄ F. schrieb:
> Da hatte jedes Programm hunderte Gotos die kreuz und quer zu bestimmten
> Zeilennummern sprangen. We man Code einfügte, stimmten die ganzen
> Zeilennummern nicht mehr.

Die Zeilennummern wurden in 10-er Schritten hochgezählt, damit man noch 
Zeilen einfügen kann. Beim neu Numerieren wurden natürlich auch die 
Gotos und Gosubs angepaßt. Ansonsten wäre ja das Programm für die 
Mülltonne.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Thomas W. schrieb:

> Mein Highlight ist computed GOTO in Fortran77

Meins auch. ;-)


> Goto to Hell!

Du meinst:
1
      GOTO (10, 20, 30) i
2
3
10    GOTO 30
4
20    CONTINUE
5
30    CALL HELL

von Thomas W. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Thomas W. schrieb:
>> Mein Highlight ist computed GOTO in Fortran77
>> Goto to Hell!
>
> Allerdings.
>
> In Basic gab es mal eine Zeit ohne Prozeduren, labels und Schleifen
> (außer FOR).
>
> Da hatte jedes Programm hunderte Gotos die kreuz und quer zu bestimmten
> Zeilennummern sprangen. We man Code einfügte, stimmten die ganzen
> Zeilennummern nicht mehr.

Es gab schon Gosub/return und man konnte Zeilennummer-Bloecke benutzen 
(das war meine Methode um Libraries zu bauen. Lang ist es her).

Gruesse

Th.

von Thomas W. (Gast)


Lesenswert?

Programmierer schrieb:
> Thomas W. schrieb:
>> Mein Highlight ist computed GOTO in Fortran7
>
> Sowas ähnliches kann der GCC auch:
> https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html

Kannte ich noch nicht. Ich habe es erfolgreich vergessen.

Gruesse

Th.

von Nachdenklicher (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Thomas W. schrieb:
>> Mein Highlight ist computed GOTO in Fortran77
>> Goto to Hell!
>
> Allerdings.
>
> In Basic gab es mal eine Zeit ohne Prozeduren, labels und Schleifen
> (außer FOR).

Wenn die Sprache nichts anderes her gibt, ist dsa ja auch alles okay. 
Beschwert sich ja auch keiner über Jumps in Assembler. Aber wenn die 
Sprache besseres kann...

von Walter T. (nicolas)


Lesenswert?

Das ist also ein Konstrukt, das Anfänger unbedingt vermeiden sollten und 
nur von Profis verwendet werden soll, die wissen, was sie tun? Dann muss 
ich ja schon aus Prinzip in meinem aktuellen Projekt eine Möglichkeit 
finden, das irgendwo einzusetzen. Wahrscheinlich lassen sich Wartezeiten 
so gut erzeugen.

: Bearbeitet durch User
von Programmierer (Gast)


Lesenswert?

Walter T. schrieb:
> Das ist also ein Konstrukt, das Anfänger unbedingt vermeiden sollten und
> nur von Profis verwendet werden soll, die wissen, was sie tun?

Anfänger sollten es grundsätzlich nicht benutzen, und Profis wissen auch 
warum, und nutzen es daher auch nicht! Eine Ausnahme wäre die Sache mit 
der Ressourcenverwaltung:
1
int fun (void) {
2
  SomeResource1 res1 = allocateResource1 ();
3
  int ret = 0;
4
  if (!res1) { ret = 1; goto End; }
5
  
6
  SomeResource2 res2 = allocateResource2 ();
7
  if (!res2) { ret = 1; goto FreeRes1; }
8
9
  SomeResource3 res3 = allocateResource3 ();
10
  if (!res3) { ret = 1; goto FreeRes2; }
11
12
  doSomething (res1, res2, res3);
13
14
  freeResource3 (res3);
15
16
  FreeRes2:
17
  freeResource2 (res2);
18
19
  FreeRes1:
20
  freeResource1 (res1);
21
  
22
  End:
23
  return ret;
24
}

Wenn man sich strikt an das Schema hält ist es einigermaßen akzeptabel, 
da relativ übersichtlich. Allerdings ist es leicht sich zu vertun und 
zum falschen Label zu springen. In C++ mit RAII, Exceptions (und ggf. 
Smart-Pointern) ist es um Welten einfacher:
1
void fun (void) {
2
  SomeResource1 res1;
3
  SomeResource1 res2;
4
  SomeResource1 res3;
5
6
  doSomething (res1, res2, res3);
7
}

Korrekt implementierte Ressourcen-Klassen vorausgesetzt. Im Fehlerfall 
wird eine Exception geworfen, die bereits allokierten Ressourcen 
freigegeben und  der Fehler an den Aufrufer gemeldet.

Da man auf Mikrocontrollern aber weniger dynamisch allokierte Ressourcen 
hat (Speicher, Dateien, Betriebssystem-Handles) ist dieses Problem hier 
weniger relevant.

Walter T. schrieb:
> Wahrscheinlich lassen sich Wartezeiten
> so gut erzeugen.

Die muss man wenn schon mit (Inline-)Assembler erzeugen. Gerade bei den 
Cortex-M ist das aber schwer kalkulierbar, da ist ein Timer definitiv 
die bessere wahl.

Thomas W. schrieb:
> Kannte ich noch nicht. Ich habe es erfolgreich vergessen.

Ist auch besser so. Ich habe das noch nie gebraucht.

von Walter T. (nicolas)


Lesenswert?

Programmierer schrieb:
> Gerade bei den
> Cortex-M ist das aber schwer kalkulierbar, da ist ein Timer definitiv
> die bessere wahl.

Wie langweilig. Da nehme ich doch lieber computed goto und eine lange 
Nop-Rutsche. Huuuiiiiiii!

Aber im Ernst: Ich versuche mir wirklich gerade seit knapp einer Stunde 
vorzustellen, wofür man den Kram eingebaut hat.

: Bearbeitet durch User
von Maxe (Gast)


Lesenswert?

Also meine Empfehlung (als Auch-Hobbyist) wäre ein größeres 
Desktopprogramm in einer anderen Sprache (und zwar objektorientiert) 
umzusetzen. Man kommt so etwas von den Mikrooptimierungen weg, wie man 
sie auf Mikrocontrollern und besonders mit C gewohnt ist (Der TE hat ja 
gezeigt, dass er da etwas feststeckt). Hat man sich selber Konzepte 
ersonnen, weil sie im Kontext eines größeren Programmes einfach wichtig 
und hilfreich, teilweise notwendig, sind, dann erkennt man das nächste 
Mal das Konzept auch in Fremdcode wieder. Das gleiche gilt für 
Sprachmerkmale. Wenn man bspw. an einer Stelle steht, wo man sich denkt, 
man bräuchte jetzt eine bestimmte Funktionalität, sucht danach und 
findet tatsächlich ein Sprachmerkmal als Lösung. Dann hat man es in dem 
Moment durchdrungen.

Bei der Mikrocontrollerprogrammierung muss man dann oft wieder die 
Abstrahierung reduzieren, aber dadurch, dass man dann beides gut kennt, 
kann man besser abschätzen, an welchen Stellen eine höhere Abstraktion 
sinnvoll ist und an welchen man eine Funktionalität auch mal einfach an 
Ort und Stelle in ein paar Codezeilen abvespert, ohne ein Framework 
drumherum zu bauen.

Beim Programmieren ist das doch gerade das Problem, dass es nicht die 
universellen Allgemeinrezepte gibt, die in jedem Kontext funktionieren 
und jedes Programm zu einem Fünfzeiler vereinfachen. Sondern dass in 
jeder Zeile Code ein Kompromiss steckt zwischen Funktionalität, 
Lesbarkeit, Ver- und Entflechtung, Abstraktion, Codedoppelungen, 
Wiederverwendbarkeit usw.

Das macht aber m.E. auch gerade die Würze beim Programmieren aus. Das 
ist der Unterschied zwischen einer Strafarbeit, wo man hundert mal das 
gleiche runterschreiben muss "Ich soll keine Mikrooptimierungen 
betreiben. Ich soll keine Mikrooptimierungen betr...", und einem freien 
Aufsatz "Warum ich keine Mikrooptimierungen betreiben soll".

Oder anders gesagt, wenn man einen fremden Code eines gewissen Niveaus 
liest, und die Qualität nicht beurteilen kann, ist man noch nicht weit 
genug und muss in eigenen Programmen üben. Das schließt Literatur und 
Codestudium ja nicht aus, nur beides muss man selber einordnen und 
bewerten.

von Walter T. (nicolas)


Lesenswert?

Maxe schrieb:
> Also meine Empfehlung (als Auch-Hobbyist) wäre ein größeres
> Desktopprogramm in einer anderen Sprache (und zwar objektorientiert)
> umzusetzen. Man kommt so etwas von den Mikrooptimierungen weg, wie man
> sie auf Mikrocontrollern und besonders mit C gewohnt ist (Der TE hat ja
> gezeigt, dass er da etwas feststeckt).

Ich fürchte, die Tatsache, in der Vergangenheit große 
Finite-Elemente-Programme (objektorientiert) in Matlab geschrieben zu 
haben, ist eher ein großes Hindernis. Für eine Stapelverarbeitung gelten 
ganz andere Regeln als für zyklische Programme.

Bei ersteren ist eher die Speicherbandbreite das Problem, bei den 
letzteren die kombinatorische Komplexität.

Sowieso ist meistens die Kernfunktionalität recht geradeheraus 
programmierbar, aber die GRAfische BenutzerSCHnittstelle (GraBSch) macht 
den meisten Aufwand und hat die meisten Fehler. Gerade auf dem µC, wo 
man alles selbst machen muss.

: Bearbeitet durch User
von Thomas W. (Gast)


Lesenswert?

Walter T. schrieb:
> Maxe schrieb:

> Sowieso ist meistens die Kernfunktionalität recht geradeheraus
> programmierbar, aber die GRAfische BenutzerSCHnittstelle (GraBSch) macht
> den meisten Aufwand und hat die meisten Fehler. Gerade auf dem µC, wo
> man alles selbst machen muss.

Der Aufwand eine gute graphische Benutzerschnittstelle (UI) zu 
programmieren geht vermutlich exponentiell mit der Zahl der Elemente 
(Widget). Und dann bitte scalieren und fuer einen kleinen  grossen  
Telefon-Schirm programmieren.

Datenerfassungsmasken (gut gemacht) planen und programmieren ist sehr 
aufwaendig. Und der Benutzer sieht auch alle Fehler sofort (und die 
Sache soll ja idiotensicher sein).

Gruesse

Th.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

traurig schrieb:
> Robert Martin mit seinem "Clean Code" scheint ein richtiger Profi
> zu
> sein.
>
> Wo findet man denn seine Programme und seinen Quellcode? Oder hat er
> auch nur geheimen Programmcode für seine Arbeitgeber geschrieben?  ;-)

Ja, zumindest kann ich dem auf Youtube ein paar Vortraege lang zuhoeren 
und -glotzen. Und bin dann nicht so angenervt wie nach ein paar Minuten 
Youtubevideo mit Ubuntubildschirm, Mausgeschubse und heftigem Akzent des 
Schubsers und Vortragenden in Personalunion.
Auch wenn ich noch keinen Code von ihm gesehen hab'; zumindest 
didaktisch kann er's mir gut rueberbringen.

Gruss
WK

von Stefan (Gast)


Lesenswert?

Walter T. schrieb:
> Wenn ich eine Fremdsprache lerne und über das Volkshochschulniveau
> hinaus bin, nutze ich
>  a) Literatur über die Sprache
>  b) Literatur in der Sprache auf bekannter Niveauebene.
>  c) Versuche in der Sprache zu hören
>  d) und in der Sprache zu sprechen.
es gibt noch e) bspw. wie Adam Dunkels die Sprache C mit 
selbstgeschrieben Makros (pt_Yield etc.) erweitern und damit kreativer 
eigene Programme schreiben zu können

von Mladen G. (mgira)


Lesenswert?

Walter T. schrieb:
> Es wird wohl auf das Lesen von Quelltext hinauslaufen. Das Problem: Wie
> findet man guten Quelltext zum Lesen? In Foren o.Ä. findet man ja
> hauptsächlich Schnipsel und zweifelhafte Fälle.

Zu lesen gibt es viel, ob dir das was bringt ist eine andere Sache..

IME ist direktes Feedback am besten, zB. wenn du eine Änderung durch 
eine Code Review schickst, da gibt es dann feedback.
Ist natürlich nicht so einfach möglich wenn dein Repo bzw. Code nicht 
öffentlich ist oder keienr da ist für den Review.

Da gibt es zB. auch Code Reviews auf Stackoverflow:
https://codereview.stackexchange.com/

Da kannst du deinen Code reinstellen und bekommst dann zu hören was 
andere davon halten :)

Clean Code von Robert Martin finde ich sehr gut, mag seine politischen 
Ansichten nicht (muss ich ja nicht), bei live Vorträgen finde ich ihn 
etwas ermüdend.

Lesen kann ma so viel man will, programmieren ist ein Handwerk, da muss 
geübt werden und jemand sollte einem auf die Finger gucken :)

von Stefan (Gast)


Lesenswert?

Mladen G. schrieb:
> programmieren ist ein Handwerk, da muss
> geübt werden und jemand sollte einem auf die Finger gucken :)
es gibt das Handwerk in Großraumbüros ähnlich im Zeitungsbereich bei dem 
Autoren auf die Finger geguckt wird und es gibt Künstler wie Adam Dunkel 
die programmieren/schreiben alleine, ohne dass ihnen dabei jemand auf 
die Finger guckt.
Ich hab gerade eine Inspiration von Adam Dunkels protothreads 
fertiggestellt zu der es u.a. die Meinungen
- Arduino-Autor EAF meinte zur Setup-Funktion:"hässlichste Stück Arduino 
Code, was mit seit langem unter gekommen ist"
- ich persönlich sehe in Procedure w_pin_ und ISR simul_100hz_upd noch 
sehr sehr deutlichen Verbesserungsbedarf.
gibt.
https://wokwi.com/arduino/projects/308011153834902082

Vom Prinzip eignen sich unterschiedliche Quelltexte bei gleicher 
technischer Leistung hervorragend, um sich eine Meinung bilden zu 
können.

von Programmierer (Gast)


Lesenswert?

Alter Schwede, ja das kann man nur als Kunst bezeichnen! Wäre toll, wenn 
jeder Programmierer für seine Software seine eigene kunstvolle Sprache 
mittels Makros bastelt, sodass garantiert alle alleine arbeiten müssen, 
weil niemand anders den Code versteht! Hat auch den Vorteil, dass kein 
Software-Projekt komplexer werden kann als die Arbeitsleistung eines 
einzelnen Programmierers ermöglicht. Ganz davon abgesehen dass der 
Künstler offenbar C++ auch nicht so richtig beherrscht, #define statt 
typedef/using und statt Konstanten? Aber immerhin eine Anwendung für 
Labels as Values! Spricht das jetzt dafür oder dagegen?

von EAF (Gast)


Lesenswert?

Stefan schrieb:
> - Arduino-Autor EAF meinte zur Setup-Funktion:"hässlichste Stück Arduino
> Code, was mit seit langem unter gekommen ist"

Ja, das ist meine Meinung!
OK, die ist arg subjektiv......

Das mit dem Dunkels seine Threads kann man auch hübscher hinbekommen.
Wobei das, wenn der Präprozessor einmal damit durch ist, in der 
Zwischendatei, sowieso nie schön aussieht.
Egal, ob man es sich mit computed Goto oder verquerem switch/case 
bastelt.

Also konkreter: Man kann den hässlichen Teil in einer Lib verstecken.

von Maxe (Gast)


Lesenswert?

Walter T. schrieb:
> (objektorientiert) [...] Stapelverarbeitung

Passt das denn zusammen??

> Matlab

Als ich das letzte Mal Matlab benutzt habe war das keine 
"Programmiersprache".

> Sowieso ist meistens die Kernfunktionalität recht geradeheraus
> programmierbar, aber die GRAfische BenutzerSCHnittstelle (GraBSch) macht
> den meisten Aufwand und hat die meisten Fehler. Gerade auf dem µC, wo
> man alles selbst machen muss.

Die OOP kommt nicht umsonst aus dem Bereich der Grafikprogrammierung.

Zur Zeit bin ich an einer sensorlosen BLDC-Ansteuerung. Da stellt sich 
die Frage, ob man die Drehzahlregelung mit in der Kommutierung 
verwurstelt oder eine eigene Unit/Klasse vorsieht. Ich hab mich für die 
getrennte Implementierung entschieden. Dann könnte man die 
Geschwindigkeitsregelung über den Timerinterrupt in voller 
Geschwindigkeit mitlaufen lassen, obwohl man nur bei jedem Kommutieren 
einen aktuellen Geschwindigkeitswert hat. Oder die Units wieder 
verflechten mit gegenseitigen Funktionsaufrufen, vielleicht zumindest 
durch Callbacks getrennt...

von EAF (Gast)


Lesenswert?

Programmierer schrieb:
> Aber immerhin eine Anwendung für
> Labels as Values! Spricht das jetzt dafür oder dagegen?

Da gibts nur die beiden Möglichkeiten computed Goto oder verquerem 
switch/case.
Und Goto ist da schon ok.


OK, longjump wenn man sich nach der Decke streckt, aber damit wirds auch 
nicht hübscher.

von Stefan F. (Gast)


Lesenswert?

Programmierer schrieb:
> Das stimmt halt absolut nicht. Ich mache genau 40h pro Woche, hatte
> bisher immer unbefristete Verträge, musste nie "jobben" und verdiene
> sehr gut.

Da werde ich ja glatt neidisch. In welcher Branche ist das?

von Programmierer (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Da werde ich ja glatt neidisch. In welcher Branche ist das?

Industrie, Sondermaschinenbau. Zuvor was ganz anderes in einem 
Internet-Medien-Unternehmen, ähnlich gute Konditionen. In beiden Fällen 
direkt nach dem VG eingestellt, kein Assessment-Center o.ä. was auf 
großen Andrang/Konkurrenz hindeuten würde.

von Stefan F. (Gast)


Lesenswert?

Peter D. schrieb:
> Beim neu Numerieren wurden natürlich auch die
> Gotos und Gosubs angepaßt.

Rate mal, wer das damals immer wieder

Stefan schrieb:
> Ich hab gerade eine Inspiration von Adam Dunkels protothreads
> fertiggestellt ...

Falls jemand nicht weiß, was das ist, habe ich hier eine kleine deutsche 
Einführung: http://stefanfrings.de/net_io/protosockets.html

Protothreads habe ich genau einmal in einem einzigen Projekt verwendet, 
und zwar in Kombination mit Protosockets. Am Anfange dachte ich noch 
"WTF ist das denn?". Nach einer Weile gewöhnte ich mich daran und es kam 
mir nicht mehr komplizierter vor als Zustandsautomaten mit switch/case.

Aber inzwischen habe ich es schon wieder vergessen. Bei switch/case ist 
für mich der Programmfluss und der Gültigkeitsbereich von Variablen 
offensichtlicher, als mit seinen Makros. Außerdem haben mich die 
unverständlichen Fehlermeldungen des Compilers immer kirre gemacht, wenn 
man die Makros nicht in der korrekten Reihenfolge hin schrieb oder 
Tippfehler machte.

Nach wie vor finde ich die Protothreads sehr interessant und lehrreich, 
benutzen möchte ich sie aber nicht mehr.

von EAF (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> benutzen möchte ich sie aber nicht mehr.

Dutzendfach im täglichen Betrieb....
Tuts perfekt.

Beispiel, ein weiteres BlinkWithoutDelay:
1
#pragma once
2
3
#include <CooperativeTask.h>
4
5
6
class BlinkTask: public Task
7
{
8
  protected:
9
    const byte pin;
10
    const unsigned long interval;
11
  
12
  public:
13
    BlinkTask(const byte pin,const unsigned long interval):
14
       pin(pin),
15
       interval(interval)
16
    {
17
    }
18
    
19
    virtual void init() 
20
    {
21
      Serial.print("BlinkTask begin, pin: "); Serial.println(pin);
22
      pinMode(pin,OUTPUT);
23
    }
24
    
25
    virtual void run() 
26
    {
27
      TaskBlock
28
      {
29
        digitalWrite(pin,HIGH);
30
        taskPause(interval);
31
        digitalWrite(pin,LOW);
32
        taskPause(interval);
33
      }
34
    }
35
    
36
37
    virtual ~BlinkTask()
38
    {
39
      digitalWrite(pin,LOW);
40
      pinMode(pin,INPUT);
41
    }
42
43
};

von Stefan F. (Gast)


Lesenswert?

EAF schrieb:
> Dutzendfach im täglichen Betrieb.... Tuts perfekt.
> Beispiel, ein weiteres BlinkWithoutDelay:

Der Herr Dunkels hat es halt als sportliche Herausforderung gesehen, 
eine Art Multitasking mit minimalem technischen Overhead zu 
implementieren. Sein µIP Projekt ist auch von dieser Art.

Ich vermute dass sich heute fast keiner mehr den Aufwand in dieser Form 
antut, aber damals war das schon cool.

von c-hater (Gast)


Lesenswert?

Walter T. schrieb:

> Anscheinend lesen Softwareentwickler nicht gern Quelltext.

Nur die Faulen und Dummen.

> Das
> unterscheidet sie von den Ingenieuren.

Nun, die erfahrenen (also implizit nichtfaulen und nichtdummen) 
Softwareentwickler sind Ingenieure. Auch wenn sie vielleicht nicht 
unbedingt immer den akademischen Titel nachweisen können...

> oder sie finden grundsätzlich die Arbeit anderer häßlich.

Das ist tatsächlich ein ernsthaftes Problem. Denkmuster unterscheiden 
sich und Betrachtungswinkel unterscheiden sich. Typisches Beispiel: Wer 
OO-Code gewohnt ist, wird jeden C-Code zu irgendeinem nichttrivialen 
Problem als dramatisch suboptimal empfinden. Lustigerweise inbesondere 
dann, wenn der C-Programmierer "C mit Klassen" umgesetzt hat...

Aber generell gilt vorallem: Der meiste Code wird typisch mit dem Fokus 
auf eine konkrete Anwendung umgesetzt. Das ist das, was ich 
"Betrachtungswinkel" nenne. Mit einem anderen Betrachtungswinkel scheint 
er oft dramatisch schlecht zu sein, und oft ist er auch objektiv 
zumindest ein wenig schlecht. Weil er nicht hinreichend universell ist.

Das wird aber dann den nunmehr neu erstellten Code mit einiger 
Wahrscheinlichkeit wiederum genauso betreffen, wenn er dann mal von 
irgendjemand anderem reviewed wird (unter dessen Betrachtungswinkel) ;o)

> Was mir am ChibiOS-Beispiel gefällt: Die Dokumentierung der
> Einzelfunktionen mit Doxygen ist in den Teilen, die ich mir bis jetzt
> angeguckt habe, absolut mustergültig.

Das sind gleich drei Fehler, die keinem erfahrenen Programmierer jemals 
passieren würden:
1) Anzunehmen, dass sie irgendwas über Konzepte des Codes verrät...
2) Anzunehmen, das sie ernsthaft mehr verrät als die Signaturen der 
beschriebenen Methoden/Funktionen...
3) (folgt aus 1) und 2)): nicht kapiert, dass das meist nur automatisch 
generierter Bullshit ist, mit exakt dem Informationsgehalt, der auch im 
Prototypen steht..

Du hast da ganz offensichtlich allein die blosse Existenz positiv 
bewertet...

von Walter T. (nicolas)


Lesenswert?

Maxe schrieb:
> Walter T. schrieb:
>> (objektorientiert) [...] Stapelverarbeitung
>
> Passt das denn zusammen??
>
>> Matlab
>
> Als ich das letzte Mal Matlab benutzt habe war das keine
> "Programmiersprache".

Das passt hervorragend zusammen. Stapelverarbeitung ist ja auch eher 
datenzentrisch.

Auch heute ist es nur eine Programmiersprache ohne Anführungszeichen. 
Aus irgendeinem Grund wird es aber mehr prozedural als objektorientiert 
genutzt, obwohl das hervorragend geht.

Mladen G. schrieb:
> IME ist direktes Feedback am besten, zB. wenn du eine Änderung durch
> eine Code Review schickst, da gibt es dann feedback.
> Ist natürlich nicht so einfach möglich wenn dein Repo bzw. Code nicht
> öffentlich ist oder keienr da ist für den Review.

Das ist der Punkt. Das ist sowieo bei vielen Embedded-Projekten der 
Punkt: Der Kreis der Leute, die es nutzen können wollten und der, der es 
weiterentwickeln könnte, hat oft wenige Überschneidungen. Mit "Open 
Source" bekommt man dann viele Anfragen und Verbesserungs"wünsche" und 
böse Worte, ohne jemals selbst etwas davon zu haben.

c-hater schrieb:
> 3) (folgt aus 1) und 2)): nicht kapiert, dass das meist nur automatisch
> generierter Bullshit ist, mit exakt dem Informationsgehalt, der auch im
> Prototypen steht..

Kann ich nicht bestätigen. Die erste Quelltext-Datei, die ich mir 
angeguckt habe, ist die hier:
https://osdn.net/projects/chibios/scm/svn/blobs/head/trunk/os/oslib/src/chmemcore.c

Nachd dem lästigen Disclaimer steht ziemlich klar, was die Funktionen 
dieser Datei machen und wozu sie da sind. Über den Funktionen selbst ist 
nochmal die Signatur in Schönschrift, damit die IDE das beim 
Auto-Vervollständigen schon anzeigen kann, aber unnötig lang ist das 
auch nicht.

: Bearbeitet durch User
von Programmierer (Gast)


Lesenswert?

c-hater schrieb:
> Nun, die erfahrenen (also implizit nichtfaulen und nichtdummen)
> Softwareentwickler sind Ingenieure.

Und was ist hier die Definition von "Ingenieur"? Softwareentwicklung und 
Ingenieursarbeit sind gar nicht so ähnlich. Dass erfahrene 
Softwareentwickler automatisch zu Ingenieuren werden macht also wenig 
Sinn.

von Walter T. (nicolas)


Lesenswert?

Walter T. schrieb:
> [...] aber unnötig lang ist das auch nicht.

Oder ist das genau die Länge, die stört? Ja, Doxygen braucht immer ein 
wenig Boilerplate-Kommentar, wenn man das so nennen darf. Das ist 
gewöhnungsbedürftig.

von Stefan F. (Gast)


Lesenswert?

Mit Doxygen kann man per Knopfdruck viel "Papier" erzeugen. Manche 
Manager fahren darauf total ab. Der Nutzen ist in der Praxis eher 
gering.

In der Firma wo ich derzeit arbeite dokumentieren wir nur das, was nicht 
offensichtlich ist. Sowas wie:
1
/**
2
* Log a user in and return an access token.
3
* @param username Name of the calling user
4
* @param password of the calling user
5
* @return The access token
6
* @throws AuthenticationFailureException error
7
*/
8
AcessToken userLogin(String username, String password) throws AuthenticationFailureException;

geht gar nicht. Wir haben wichtigeres zu tun, als wertloses "Papier" zu 
erzeugen. Viel hilfreicher wäre so etwas, falls es zutrifft:
1
* @return The access token or null if the login failed.
2
* @throws AuthenticationFailureException only in case of a configuration error

Ob das mit dem Null Wert eine gute Idee ist, darüber kann man streiten. 
Aber es zu dokumentieren ist auf jeden Fall hilfreich. Ebenso wüsste ich 
bei Listen/Arrays auch immer gerne, ob sie im Fall von "nichts gefunden" 
leer oder null sind.

von c-hater (Gast)


Lesenswert?

Programmierer schrieb:

> Und was ist hier die Definition von "Ingenieur"? Softwareentwicklung und
> Ingenieursarbeit sind gar nicht so ähnlich.

Doch, natürlich. Extrem ähnlich. Mit "Softwareentwicklung" ist hier 
natürlich nicht das Tagewerk von gehirnamputierten Codiersklaven 
gemeint.

> Dass erfahrene
> Softwareentwickler automatisch zu Ingenieuren werden macht also wenig
> Sinn.

Doch, das macht mindestens denselben Sinn, mit dem Handwerksmeister die 
Fähigkeiten von frisch graduierten Ingenieuren passender Fachrichtung 
erlangen (und weit, weit überschreiten können).

von Stefan F. (Gast)


Lesenswert?

c-hater schrieb:
> Mit "Softwareentwicklung" ist hier natürlich nicht das
> Tagewerk von gehirnamputierten Codiersklaven gemeint.

Gibt es diesen Job überhaupt in Echt? Also jemand, der strunz doof 1:1 
von UML oder Prosa in eine Programmiersprache übersetzt?

Muss nicht jeder Programmierer zumindest Teil-Konzepte selbst erstellen 
und sich die Strukturen sowie Fehlerbehandlungs-Routinen ausdenken?

von Walter T. (nicolas)


Lesenswert?

Stefan ⛄ F. schrieb:
> In der Firma wo ich derzeit arbeite dokumentieren wir nur das, was nicht
> offensichtlich ist. Sowas wie:
> /** Log a user in and return an access token.
> *
> * @param[in] username Name of the calling user
> * @param[in] password of the calling user
> * @return The access token or NULL if login failed
> * @throws AuthenticationFailureException error
> */
> AcessToken userLogin(String username, String password) throws
> AuthenticationFailureException;
>
> geht gar nicht.

Es ist dann überflüssig, wenn es nachträglich geschrieben wurde. Wenn es 
vorher geschrieben wurde, sieht es anders aus (ich habe mir mal die 
Freiheit herausgenommen, den Kommentar zu vervollständigen). Dann 
schreibt man erst, was die Funktion machen soll und benutzt das dann als 
Spezifikation. Oft ist das Runterschreiben der Funktion selbst dann 
total einfach.

Wenn das andersherum gemacht wird, ist das ziemlich überflüssig.

von Programmierer (Gast)


Lesenswert?

c-hater schrieb:
> Programmierer schrieb:
>
>> Und was ist hier die Definition von "Ingenieur"? Softwareentwicklung und
>> Ingenieursarbeit sind gar nicht so ähnlich.
>
> Doch, natürlich. Extrem ähnlich.

Ingenieursarbeit ist strukturierter, linearer, planbarer, hat viel mit 
Zahlen zu tun. Softwareentwicklung ist verschlungener, iterativer, 
kreativer, komplexer, hat mehr mit Strukturen und Abläufen zu tun. Aber 
solche Unterschiede ist dir zu subtil.

> Mit "Softwareentwicklung" ist hier
> natürlich nicht das Tagewerk von gehirnamputierten Codiersklaven
> gemeint.

Minderwertigkeitskomplexe?

>
>> Dass erfahrene
>> Softwareentwickler automatisch zu Ingenieuren werden macht also wenig
>> Sinn.
>
> Doch, das macht mindestens denselben Sinn, mit dem Handwerksmeister die
> Fähigkeiten von frisch graduierten Ingenieuren passender Fachrichtung
> erlangen (und weit, weit überschreiten können).

Ich kenne rein zufällig einen Handwerksmeister der danach studiert hat. 
Der ist im Studium ganz schön ins Schlingern gekommen. Ist eben doch 
alles nicht so einfach.

von Walter T. (nicolas)


Lesenswert?

Walter T. schrieb:
> Es ist dann überflüssig, wenn es nachträglich geschrieben wurde. Wenn es
> vorher geschrieben wurde, sieht es anders aus [...]
> Wenn das andersherum gemacht wird, ist das ziemlich überflüssig.

Weil ich es gerade offen habe zwei Beispiele:
1
/** @brief Bruch kuerzen
2
 *
3
 * Das Ergebnis hat immer einen positiven Nenner.
4
 * @param[in] F Regulaerer Bruch (Nenner nicht Null!)
5
 * @return Bruch */
6
frac64_t frac64_reduce(frac64_t F) {
1
/** @brief Bruch als Q16 approximieren
2
 *
3
 * Multiplikation mit Q16 entspricht trunkierender Division, nicht Rundung
4
 *
5
 * @param[in] F echter oder unechter regulaerer Bruch (Nenner nicht Null!)
6
 * @return Approximation in Q16 */
7
int32_t frac32_toQ16(frac32_t F) {
Nach den Kommentaren könnte hier wahrscheinlich jeder die Funktion so 
runterschreiben.

Wenn man die Spec erst schreibt, wenn das Produkt fertig ist, ist das ja 
auch kein Wunder, dass das überflüssige Arbeit ist.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Walter T. schrieb:
> Dann schreibt man erst, was die Funktion machen soll und
> benutzt das dann als Spezifikation. Oft ist das Runterschreiben
> der Funktion selbst dann total einfach.

Ja stimmt. In unserer Firma machen das die technischen Projektleiter in 
Form eines Wiki. Da wird jetzt nicht jede einzelne Methode spezifiziert, 
aber die Funktionen aus Business Sicht, als dass was von außen (z.B. via 
REST Interface und DB) sichtbar ist.

Dann programmieren wir das runter und ergänzen anschließend das Wiki.

Manchmal stehen im Code komische Sonderlocken wie:
1
if (loginSucceeded)
2
{
3
   delay(1000); // ms
4
}
5
return accesstoken;

Da ist es dann gut, wenn man den Link zum Wiki Artikel darüber schreibt, 
in dem erklärt wird, wer diesen Delay warum gefordert hat.

von c-hater (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:

> c-hater schrieb:
>> Tagewerk von gehirnamputierten Codiersklaven gemeint.

> Gibt es diesen Job überhaupt in Echt?

Leider ja und es wird immer mehr.

> Muss nicht jeder Programmierer zumindest Teil-Konzepte selbst erstellen
> und sich die Strukturen sowie Fehlerbehandlungs-Routinen ausdenken?

Naja, natürlich sind auch diese Sklaven nicht völlig unfähig. Ist 
ungefähr das, was im Gewerbe die Facharbeiter/Gesellen sind. Natürlich 
können auch die was (inbesondere die mit Erfahrung) und sie verantworten 
durchaus auch oft kleinere Design-Entscheidungen. Aber genau das ist 
dann typisch auch das Problem in der realen Welt des Codiersklaventums. 
Sie bekommen oft nichtmal mehr die Chance, das "Große Ganze" kennen zu 
lernen, sondern werden absichtlich auf den kleinen Teil reduziert, den 
sie zu bearbeiten haben. Es würde nämlich schlicht zuviel ihrer Zeit 
kosten, wenn sie sich in die Gesamtproblematik eindenken dürften.

Das ergibt dann im Endeffekt bezüglich der Gesamtlösung oft dramatisch 
suboptimalen Code. Naja, bei praktisch allen derzeitigen 
Softwaremonstern kann man sich anschauen, wozu dieser Ansatz führt...

Aber die Entwicklug war immerhin vergleichweise billich. Das freut 
allerdings allein den Boss der Entwicklerfirma, und ggf. auch noch deren 
Aktionäre. Es freut aber nicht die Anwender, nicht die Entwickler und 
nichtmal die Codiersklaven...

von Stefan (Gast)


Lesenswert?

1
  TASK (blink)
2
     wr_pin(12,30,w_dn); 
3
     t_Wait_cs(T_(para));
4
  task_until(0)

EAF schrieb:
> Dutzendfach im täglichen Betrieb....
> Tuts perfekt.
>
> Beispiel, ein weiteres BlinkWithoutDelay:
>
1
> #pragma once
2
> 
3
> #include <CooperativeTask.h>
4
> 
5
> 
6
> class BlinkTask: public Task
7
> {
8
>   protected:
9
>     const byte pin;
10
>     const unsigned long interval;
11
> 
12
>   public:
13
>     BlinkTask(const byte pin,const unsigned long interval):
14
>        pin(pin),
15
>        interval(interval)
16
>     {
17
>     }
18
> ...
19
>
... gerade wenn blinkende LED "Dutzendfach im täglichen Betrieb" genutzt 
werden ist der Aufwand für jede LED eine eigene Klasse zu schreiben viel 
Arbeit ....

von EAF (Gast)


Lesenswert?

Stefan schrieb:
> blinkende LED "Dutzendfach im täglichen Betrieb" genutzt

Bla bla.....
Als wenn die Welt nur aus blinkenden LEDs besteht.
Sie ist nur eine Beispiel für einen einfachen Automaten


Stefan schrieb:
> ist der Aufwand für jede LED eine eigene Klasse zu schreiben viel
> Arbeit ....
Ja ja....

1
BlinkTask blinker[]{// {pin,interval} 
2
                       {13,8000},
3
                       {4,2000},
4
                       {7,5000},
5
                   };

Zudem können jederzeit mit new neue Tasks erzeugt werden.
Aber wem sage ich das......

von Stefan (Gast)


Lesenswert?

EAF schrieb:
> Zudem können jederzeit mit new neue Tasks erzeugt werden.
aber halt nicht so einfach programmiert werden. dass EAF eine Version 
bei wokwi.com hochladen kann, um bspw. beim Thema "Wie macht man 
Lichteffekte?" helfen zu können.

EAF schrieb:
> Aber wem sage ich das......
.. sei einfach mal mutig

Beitrag #6802352 wurde von einem Moderator gelöscht.
Beitrag #6802357 wurde von einem Moderator gelöscht.
Beitrag #6802363 wurde von einem Moderator gelöscht.
von Stefan F. (Gast)


Lesenswert?

Gerade passiert genau das, was ich oben nannte: Jedes Team hat andere 
Bedürfnisse.

Beitrag #6802368 wurde von einem Moderator gelöscht.
Beitrag #6802379 wurde von einem Moderator gelöscht.
Beitrag #6802390 wurde von einem Moderator gelöscht.
von Rainer V. (a_zip)


Lesenswert?

c-hater schrieb:
> Aber die Entwicklug war immerhin vergleichweise billich. Das freut
> allerdings allein den Boss der Entwicklerfirma, und ggf. auch noch deren
> Aktionäre.

Als ich jung war hörte ich von den Wahnsinnsfirmen in Amiland, die ihre 
richtig guten Leute vor Besuchern, Kunden, Aktionären im Keller 
versteckt hielten, da diese weder Anzug, weißes Hemd ect. bei der Arbeit 
trugen, ansonsten auch eher ungenießbar im Umgang waren, aber 
Spitzenleistungen brachten und Spitzengehälter kassieren sollten...sowas 
wollte ich da auch mal werden :-) Und ich denke sogar, dass jemand, der 
in dieses Bild passt, auch 500 "GoTo" in 1000 Zeilen Programm 
unterbringt! Und meiner M. n. war bei Fortran damals das berühmte 
Programm "Schmierpapier" d a s Highlight. Hochgeschwindigkeitsdrucker im 
Rechenzentrum, wo auch der cleverste Operator so einen fehlerhaften Job 
kaum unter 2cm Druckerpapier gestoppt bekam. Wenn der "Programmierer" 
dann am nächsten Tag seinen Ausdruck abholen wollte, dann spielten sich 
da Dramen ab, die nur das Leben schreiben kann!
Gruß Rainer

von Stefan (Gast)


Lesenswert?

Walter T. schrieb:
> Wie lassen sich "neue" Implementierungstechniken kennenlernen?
Da haben sich wirklich Adams Dunkels Protothreads als Beispiel Lesestoff 
für das von Knuth ('literate programming'/TeX/MAD-Magazine) entwickelte 
Makro-Konzept als abwechslungsreicher Lesestoff herausgestellt:
Original-Makros:ANSI-C von Adam Dunkel
https://web.archive.org/web/20051013062233/http://www.sics.se/~adam/pt/
für GCC-C(neue/alte Implementierungstechnik: computed goto)
https://github.com/LarryRuane/protothread
dt.Aufsatz in C:
http://stefanfrings.de/net_io/protosockets.html
Kurzvariante mit dem sprachlichen Teil des Konzepts(ohne Verwaltung der 
Task)
https://forum.arduino.cc/t/projekt-multitasking/399677

Es gibt bei µC.net zig Projekte mit dem gleichen Thema und 
unterschiedlichen Quelltexten d.h. es kann durchaus sinnvoll sein sich 
einige durchzulesen, um einen passenden Stil zu finden 
("Lauflicht"/"Lightshow"/.. waren vor kurzem aktuell).

- handwerklich programmieren: für gute Projekte ist ein Team notwendig, 
das die Verantwortung übernimmt (ohne Team können Projektleiter häufig 
nur mekkern und belasten Hobbyisten)
- künstlerisch programmieren: vor allem schwierige Suche nach einem 
Thema (und Experimente/Fehlschläge beim eigenen Stil)
- in der Wirtschaft ist ein (Software) Architekt mit UML üblicherweise 
an Projekten beteiligt d.h. KEIN Hobby weil so'n Architekt ziemlich 
teuer ist.

Beitrag #6802703 wurde von einem Moderator gelöscht.
Beitrag #6802717 wurde von einem Moderator gelöscht.
Beitrag #6802722 wurde von einem Moderator gelöscht.
Beitrag #6802740 wurde von einem Moderator gelöscht.
Beitrag #6802754 wurde von einem Moderator gelöscht.
Beitrag #6802773 wurde von einem Moderator gelöscht.
Beitrag #6802778 wurde von einem Moderator gelöscht.
Beitrag #6802793 wurde von einem Moderator gelöscht.
von Einer (Gast)


Lesenswert?

Man kann's mit der Löscherei auch übertreiben.

von Rainer V. (a_zip)


Lesenswert?

Nein...wie blöd muß man sein...

Beitrag #6802816 wurde von einem Moderator gelöscht.
Beitrag #6802822 wurde von einem Moderator gelöscht.
von Stefan (Gast)


Lesenswert?

Einer schrieb:
> Man kann's mit der Löscherei auch übertreiben.
sorry dürfte mein Fehler (erwähnung meiner aktuellen 
Erst-Religion:Makro-ASM) gewesen sein, obwohl es hier um C geht)
Meine Meinung, dass Makros wie von Adam Dunkel auch eine Bereicherung 
für Hobby- Autoren sein können, ist unabhängig von der Grundsprache.

Der Bann, von dem der Arduino-Botschafter in seiner undeutlichen Sprache 
berichtet hat, stellt auch klar, dass basic gegen die dortige 
Weltanschauung steht.

von Markus (Gast)


Lesenswert?

Angelehnt an die Überschrift des Threads werfe ich mal ein 
Lesestoffbeispiel ein:
Die Z80 Emulation von Frank:
https://github.com/ukw100/STECCY/blob/main/src/z80/z80.c

So eine Emulation hat viele Herausforderungen, vor allen Dingen 
Geschwindigkeit. Deshalb sieht man viele
1
static inline ...

Was mich an dem Code stört, sind die vielen Includes am Anfang, die 
Abhängigkeiten zu anderen Modulen erzeugen und damit den Code wenig 
transportabel machen.

von Walter T. (nicolas)


Lesenswert?

Markus schrieb:
> Die Z80 Emulation von Frank:
> https://github.com/ukw100/STECCY/blob/main/src/z80/z80.c

Beitrag Nr. 156 passt wieder zum Thema.
Danke!
Danke auch für das Beispiel im Speziellen. Ich hatte noch nie Anlass, 
mir ein Emulator-Projekt von Nahem anzugucken.

Markus schrieb:
> Was mich an dem Code stört, sind die vielen Includes am Anfang

Was mich noch mehr stört, ist dass am Anfang der Datei eine Beschreibung 
fehlt, was sie überhaupt machen soll. Aber vielleicht tue ich ihr da 
Unrecht und es liegt nur am merkwürdigen "Einsprungpunkt" direkt in die 
.c-Datei und im Kontext des GIT-Repositorys passt das. Das muss ich mir 
mal in Ruhe zu Gemüte führen.

: Bearbeitet durch User
von Dirk (Gast)


Lesenswert?

Walter T. schrieb:
> Beitrag Nr. 156 passt wieder zum Thema.
Das Problem passiert halt wenn Hilfesuchende ihr Thema "Lesestoff" im 
Forum "digitale Elektronik" posten, anstatt im:
https://www.mikrocontroller.net/forum/offtopic

Adam Dunkels Protothreads sind halt nur nützlich wenn man bspw. bei 
einem 32CH-PWM-Board aus dem Bereich der digitalen Elektronik 
qualifiziert helfen möchte.
Bezahlte Diskutierer können nur von ihren Erkenntnissen berichten:
Beitrag "Re: Wie macht man solche Lichtmodes? Lauflicht, PWM und Co"
und mekkern halt Menschen an die wirklich programmieren lernen 
möchten.

von Dirk (Gast)


Lesenswert?

ups sorry Dirk-->Stefan

von Progbit (Gast)


Lesenswert?

Walter T. schrieb:
> Es wird wohl auf das Lesen von Quelltext hinauslaufen. Das Problem: Wie
> findet man guten Quelltext zum Lesen? In Foren o.Ä. findet man ja
> hauptsächlich Schnipsel und zweifelhafte Fälle.
google ist Dein bester Freund :-)
damit solltest Du schon umgehen können, dann wirst Du auch fündig.
Du findest vollständige Programme in Unmengen - die sind dann allerdings 
unkommentiert und teilweise auch schlecht programmiert.
Aufdröseln und den Quelltext verstehen mußt Du schon selbst.

Walter T. schrieb:
> Und bitte auch auf lesbare Teile beschränken. "Der Linux
> Kernel" ist so groß, dass das keiner lesen kann. Aber überschaubare
> Teile wären super.
keine Ahnung was Du vorhast bzw. wonach Du überhaupt suchst?
Für Codesnipsel und "Teilausschnitte" gibt es doch gute und schlechte 
Bücher in schier unendlicher Anzahl?

von Walter T. (nicolas)


Lesenswert?

Progbit schrieb:
> google ist Dein bester Freund :-)

Ein absolut hochwertiger Tipp! Beinahe gleichauf mit dem Tipp "Amazon", 
falls jemand ein gutes Buch zu einem spefizischen Thema sucht, weil es 
da ja recht viele Bücher gebe.

: Bearbeitet durch User
von Dirk (Gast)


Lesenswert?

Progbit schrieb:
> keine Ahnung was Du vorhast bzw. wonach Du überhaupt suchst?
das Interesse an Teilen des Linux-Kernels","Teil X der 
OpenSSL2-Bibliothek", etc. könnte darauf hindeuten, dass er sich bspw. 
an GeckOS:
https://de.wikipedia.org/wiki/GeckOS
beteiligen möchte.

GeckOS unterstützt bereits präemptives Multitasking und Multithreading, 
Signale und Semaphore, sowie einige Unix-Shell-Funktionen (z. B. 
Piping).

von Walter T. (nicolas)


Lesenswert?

Dirk schrieb:
> [...] dass er sich bspw. an GeckOS:
> https://de.wikipedia.org/wiki/GeckOS
> beteiligen möchte.

Auch wenn gemäß dem Fragebogen aus dem recht weit oben empfohlenen Buch 
das Ergebnis herauskam: "Programmieren Sie weiter am Linux Kernel oder 
was Sie sonst so machen", gehe ich davon aus, dass es sich lediglich um 
den bekannten schnodderigen Schreibstil Frau Passigs und nicht etwa um 
einen ernstgemeinten Tipp handelt.

: Bearbeitet durch User
von Markus (Gast)


Lesenswert?

Walter T.
>>https://github.com/ukw100/STECCY/blob/main/src/z80/z80.c
>Was mich noch mehr stört, ist dass am Anfang der Datei eine Beschreibung
>fehlt, was sie überhaupt machen soll. Aber vielleicht tue ich ihr da
>Unrecht und es liegt nur am merkwürdigen "Einsprungpunkt" direkt in die
>.c-Datei und im Kontext des GIT-Repositorys passt das. Das muss ich mir
>mal in Ruhe zu Gemüte führen.

>merkwürdigen "Einsprungpunkt"
Ja, der merkwürdige Einsprungpunkt ist in Zeile 7730 und die Funktion 
heißt einfach z80().
Ich glaube, so sollte man es definitiv nicht machen. In dem File ist die 
Emulation des Prozessors und des gesamten Computer gemischt.
Interessant ist auch, dass die Opcodes über eine Switch/Case 
Entscheidung ausgeführt werden, dass kann bei 256 Opcodes ziemlich 
langen gehen. Andere Emulatoren verwenden meines Wissens nach Tabellen 
mit Funktionpointern. Damit kann man dann schnell einfach über den Index 
springen.

Hier hat ein Student eine Arduino-Library für die Z80 Emulation 
geschrieben:

https://github.com/MohammedRashad/ArduZ80/blob/master/ArduZ80.cpp

Die ist aber ziemlich schlecht verwendbar und hat Funktionsaufrufen zu 
den CPP-println des Arduino Frameworks drinn.

Wenn man in einen mit Sicherheit professionell geschriebenen Code 
schauen möchte, kann man den Linux-Kernel nehmen.

https://github.com/torvalds/linux/blob/master/kernel/entry/common.c

Interessant finde ich hier, dass es so gut wie keine Kommentare im Code 
gibt. Das hätte ich von einem so viel verwendeten OpenSource Projekt 
nicht erwarted.

von Dirk (Gast)


Lesenswert?

Walter T. schrieb:
>>> Eigentlich interessieren mich bewährte Techniken,
>>> auf die ich einfach noch nicht gestoßen bin.
>> Fragebogen GeckOS zum BUCH
>> - präemptives Multitasking: Bewährte Technik (ja/nein)?
>> - Multithreading: Bewährte Technik (ja/nein)?,
>> - Signale und Semaphore:Bewährte Technik (ja/nein)?
>> - Unix-Shell-Funktionen (z. B. Piping):Bewährte Technik (ja/nein)?.
> Auch wenn gemäß dem Fragebogen aus dem recht weit oben empfohlenen Buch
> das Ergebnis herauskam: "Programmieren Sie weiter am Linux Kernel oder
> was Sie sonst so machen", gehe ich davon aus, dass es sich lediglich um
> den bekannten schnodderigen Schreibstil Frau Passigs und nicht etwa um
> einen ernstgemeinten Tipp handelt.
Passigs wird fürs diskutieren so bezahlt wie "gute Programmierer":
Beitrag "Re: Quelltext: Lesestoff gesucht"

von Dergute W. (derguteweka)


Lesenswert?

Markus schrieb:
> Interessant finde ich hier, dass es so gut wie keine Kommentare im Code
> gibt. Das hätte ich von einem so viel verwendeten OpenSource Projekt
> nicht erwarted.

Ja, beeindruckend:
1
wk [ /usr/src/linux-4.18.5 ]# find . | xargs grep -i fuck | wc -l
1
29

Gruss
WK

von Pandur S. (jetztnicht)


Lesenswert?

Das Fazit von all den Kommentaren ist also...
- such keinen Code, er ist eh nichts.
- C ist ein Wettbewerb sich das Leben selbst schwer zu machen
- Das Motto, wer schiesst sich und einem Nachfolger schneller in den 
Fuss.
- Das Leben ist zu kurz fuer C, mach was anderes.

Es gibt Buecher in anderen Sprachen zu Datenstrukturen, und 
Loesungsansaetzen, sogenannten Designpattern.

: Bearbeitet durch User
von Dirk (Gast)


Lesenswert?

Pandur S. schrieb:
> Das Fazit von all den Kommentaren ist also...
... ausgehend von einem Literaturkenner der vom Schreibstil von Frau 
Passig (BDSM Berlin; "Techniktagebuch") berichten kann er sei 
schnodderig:
"Die meiste Literatur widmet sich entweder abstrakten Konzepten oder ist 
an Anfänger gerichtet."
==> ganz präzise konnte Walter "bewährte Techniken" ja nicht nennen.

> - such keinen Code, er ist eh nichts.
gaaanz bisschen Code hilft häufig bei der Programmierung

> - C ist ein Wettbewerb sich das Leben selbst schwer zu machen
eigentlich ist so eine Mittelsprache 0 geeignet für einen 
Solo-Wettbewerb:
- sportlich wird ASM gewertet
- künstlerisch stehen mit Arduino/Basic/Pascal/Makros/UML so viele 
geeignetere  Sprachen zur Verfügung, dass C praktisch chancenlos ist
(als Team/Industrie-Sprache durchaus geeinet)

> Das Motto, wer schiesst sich und einem Nachfolger schneller in den
> Fuss.
der heutigen selfpublisch-Generation fehlt halt so was wie ein C64 der 
einen nicht gleich anmekkert, nur weil der Multitasking-kernel wie bei 
AVR kleiner als 4kb ist (1999):
http://www.6502.org/users/andre/osa/index.html
d.h. früher waren 8-bit Computer praktisch schon im Kinderzimmer

> Das Leben ist zu kurz fuer C, mach was anderes.
zumindest sollten die 24hours die Zeit vor und nach "17:00" 
unterscheiden lernen, damit sie nicht ohne die Hilfe ihres 
Software-Architekten weiter diskutieren müssen

> Es gibt Buecher in anderen Sprachen zu Datenstrukturen, und
> Loesungsansaetzen, sogenannten Designpattern.
im µC Hobby sind mEn. größere Datenstrukturen eher im biologischen 
Bereich zu organisieren sodass eher die Abweichung von Designpattern 
interessant ist

von EAF (Gast)


Lesenswert?

Pandur S. schrieb:
> Das Fazit von all den Kommentaren ist also...
> - such keinen Code, er ist eh nichts.
> - C ist ein Wettbewerb sich das Leben selbst schwer zu machen

Zu 1:
Ja. Fremder Code ist problematisch.

Zu 2:
Nöö.


Programmieren, ist gießen von Gedanken, in Speicher!
Das Abbild der Denke.
Und mehr kann man auch aus gebrauchten Programmen nicht herauslesen.....

Man sieht daran/darin, eben nicht, die eigenen Bedürfnisse, Freuden und 
Fähigkeiten.

von Progbit (Gast)


Lesenswert?

Walter T. schrieb:
> Ein absolut hochwertiger Tipp! Beinahe gleichauf mit dem Tipp "Amazon",
> falls jemand ein gutes Buch zu einem spefizischen Thema sucht, weil es
> da ja recht viele Bücher gebe.
Der Tip ist auch super und hat mit Amazon nichts zu tun. Bei Amazon mußt 
Du zahlen, bei Google kannst Du suchen und finden ... wenn man denn 
weiß, was macht überhaupt sucht, was Du eben noch nicht weißt :-)
Der NACHTEIL bei den gefundenen Quelltexten wird die Kommentierung sein, 
die fehlt zu 90% - da brauchst Du dann ein Lehrbuch und dann kannst Du 
bei Amazon das hoffentlich Richtige kaufen :-)

von Progbit (Gast)


Lesenswert?

Pandur S. schrieb:
> Das Fazit von all den Kommentaren ist also...
> - such keinen Code, er ist eh nichts.
er sucht eben falsch, das ist sein Problem.

> - C ist ein Wettbewerb sich das Leben selbst schwer zu machen
aber was ist dann C++ ... die Zerstörung des Lebens :-)

> - Das Motto, wer schiesst sich und einem Nachfolger schneller in den
> Fuss.
> - Das Leben ist zu kurz fuer C, mach was anderes.
wenn er glaubt es zu können, es das schon mal ein Ansatz.

> Es gibt Buecher in anderen Sprachen zu Datenstrukturen, und
> Loesungsansaetzen, sogenannten Designpattern.
klar, alles schön theoretisch mit vielen Codeschnipseln - junk Bücher 
für Möchtegern-Nerds.

von Stefan F. (Gast)


Lesenswert?

Markus schrieb:
> Interessant ist auch, dass die Opcodes über eine Switch/Case
> Entscheidung ausgeführt werden, dass kann bei 256 Opcodes ziemlich
> langen gehen.

Nach meinem Kenntnisstand ist die Besonderheit von switch/case, dass ab 
einer gewissen Größe jeder case gleich lange dauert, im Gegensatz zu 
einer if-else-if Kette. Aus großen switch/case macht der Compiler eine 
Sprungtabelle.

von Programmierer (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> ist die Besonderheit von switch/case, dass jeder case gleich lange
> dauert,

Nein.

Stefan ⛄ F. schrieb:
> Aus großen switch/case macht der Compiler eine Sprungtabelle.

Geht nicht wenn die Werte nicht kontinuierlich sind. Der Compiler macht 
ggf. auch bedingte Sprünge, ggf. mit binärer Suche. Dadurch dauern die 
Fälle ggf. unterschiedlich lang.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Programmierer schrieb:
>> Aus großen switch/case macht der Compiler eine Sprungtabelle.
>
> Geht nicht wenn die Werte nicht kontinuierlich sind.

Klar geht das. Ist eine Entscheidung, wann der Compiler was macht. Die 
nicht kontinuierlichen Werte sind dann halt mit "default" belegt (und 
wenn es keinen "default"-Label gibt, springt er hinter den switch).

Die Entscheidung wird natürlich durch die Optimierungseinstellungen 
verändert: will ich auf Speicherplatz optimieren, wird if/else 
ausgeführt, sofern das von der Schätzung her Codegröße spart. Optimiere 
ich auf Ausführungszeit (-O3 bei GCC oder Clang), dann spielt die 
Codegröße keine Geige, und es wird sehr schnell zur Tabelle gegriffen.

von Programmierer (Gast)


Lesenswert?

Jörg W. schrieb:
> Optimiere ich auf Ausführungszeit (-O3 bei GCC oder Clang), dann spielt
> die Codegröße keine Geige, und es wird sehr schnell zur Tabelle
> gegriffen.

Was wenn man 2 Werte hat, 0 und 2^64-1? Das wäre eine sehr große 
Tabelle.

von Stefan F. (Gast)


Lesenswert?

Jörg W. schrieb:
> Optimiere ich auf Ausführungszeit (-O3 bei GCC oder Clang),
> dann spielt die Codegröße keine Geige, und es wird sehr
> schnell zur Tabelle gegriffen.

Programmierer schrieb:
> Was wenn man 2 Werte hat, 0 und 2^64-1? Das wäre eine sehr große
> Tabelle.

Dann wohl eher nicht. "schnell" bedeutet nicht "immer".

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Programmierer schrieb:
> Was wenn man 2 Werte hat, 0 und 2^64-1?

Dann könnte man vorher 1 addieren, hat man wieder eine Tabelle. :-)

Klar, es ging hier nicht um pathologische Fälle, sondern wimre. um einen 
8-Bit-Wert, der zu decodieren ist.

Aber bitteschön:
1
#include <stdint.h>
2
int something(uint64_t x)
3
{
4
        switch(x) {
5
        case 0:
6
                return 42;
7
8
        case 13:
9
                return 10;
10
11
        case 14:
12
                return 11;
13
14
        case 15:
15
                return 8;
16
17
        case 21:
18
                return 9;
19
20
        case 0xffffffffffffffffULL:
21
                return 21;
22
23
        default:
24
                return 0;
25
        }
26
}
1
        .text
2
        .file   "foo.c"
3
        .globl  something               # -- Begin function something
4
        .p2align        4, 0x90
5
        .type   something,@function
6
something:                              # @something
7
        .cfi_startproc
8
# %bb.0:
9
        pushq   %rbp
10
        .cfi_def_cfa_offset 16
11
        .cfi_offset %rbp, -16
12
        movq    %rsp, %rbp
13
        .cfi_def_cfa_register %rbp
14
        addq    $1, %rdi
15
        cmpq    $22, %rdi
16
        ja      .LBB0_7
17
# %bb.1:
18
        movl    $42, %eax
19
        jmpq    *.LJTI0_0(,%rdi,8)
20
.LBB0_6:
21
        movl    $21, %eax
22
        popq    %rbp
23
        .cfi_def_cfa %rsp, 8
24
        retq
25
.LBB0_7:
26
        .cfi_def_cfa %rbp, 16
27
        xorl    %eax, %eax
28
.LBB0_8:
29
        popq    %rbp
30
        .cfi_def_cfa %rsp, 8
31
        retq
32
.LBB0_2:
33
        .cfi_def_cfa %rbp, 16
34
        movl    $10, %eax
35
        popq    %rbp
36
        .cfi_def_cfa %rsp, 8
37
        retq
38
.LBB0_3:
39
        .cfi_def_cfa %rbp, 16
40
        movl    $11, %eax
41
        popq    %rbp
42
        .cfi_def_cfa %rsp, 8
43
        retq
44
.LBB0_4:
45
        .cfi_def_cfa %rbp, 16
46
        movl    $8, %eax
47
        popq    %rbp
48
        .cfi_def_cfa %rsp, 8
49
        retq
50
.LBB0_5:
51
        .cfi_def_cfa %rbp, 16
52
        movl    $9, %eax
53
        popq    %rbp
54
        .cfi_def_cfa %rsp, 8
55
        retq
56
.Lfunc_end0:
57
        .size   something, .Lfunc_end0-something
58
        .cfi_endproc
59
        .section        .rodata,"a",@progbits
60
        .p2align        3
61
.LJTI0_0:
62
        .quad   .LBB0_6
63
        .quad   .LBB0_8
64
        .quad   .LBB0_7
65
        .quad   .LBB0_7
66
        .quad   .LBB0_7
67
        .quad   .LBB0_7
68
        .quad   .LBB0_7
69
        .quad   .LBB0_7
70
        .quad   .LBB0_7
71
        .quad   .LBB0_7
72
        .quad   .LBB0_7
73
        .quad   .LBB0_7
74
        .quad   .LBB0_7
75
        .quad   .LBB0_7
76
        .quad   .LBB0_2
77
        .quad   .LBB0_3
78
        .quad   .LBB0_4
79
        .quad   .LBB0_7
80
        .quad   .LBB0_7
81
        .quad   .LBB0_7
82
        .quad   .LBB0_7
83
        .quad   .LBB0_7
84
        .quad   .LBB0_5
85
                                        # -- End function
86
        .ident  "FreeBSD clang version 10.0.1 (git@github.com:llvm/llvm-project.git llvmorg-10.0.1-0-gef32c611aa2)"
87
        .section        ".note.GNU-stack","",@progbits
88
        .addrsig

Wie du siehst, macht der Compiler genau das, was ich vermutet habe: er 
addiert da einfach mal 'ne 1 zuerst, danach hat er wieder eine "schöne" 
Tabelle.

: Bearbeitet durch Moderator
von Markus (Gast)


Lesenswert?

>Wie du siehst, macht der Compiler genau das, was ich vermutet habe: er
>addiert da einfach mal 'ne 1 zuerst, danach hat er wieder eine "schöne"
>Tabelle.

Das finde ich jetzt mal richtig lehrreich.
Danke :-)

Beitrag #6804336 wurde von einem Moderator gelöscht.
Beitrag #6804347 wurde vom Autor gelöscht.
Beitrag #6804376 wurde von einem Moderator gelöscht.
Beitrag #6804424 wurde von einem Moderator gelöscht.
Beitrag #6804427 wurde von einem Moderator gelöscht.
Beitrag #6804436 wurde von einem Moderator gelöscht.
Beitrag #6804461 wurde von einem Moderator gelöscht.
Beitrag #6804472 wurde von einem Moderator gelöscht.
Beitrag #6804480 wurde von einem Moderator gelöscht.
Beitrag #6804502 wurde von einem Moderator gelöscht.
Beitrag #6804503 wurde von einem Moderator gelöscht.
Beitrag #6804515 wurde von einem Moderator gelöscht.
von Rainer V. (a_zip)


Lesenswert?

Mein Gott, was hätte man sich in der Zeit, wo ihr euch mal wieder 
Nettigkeiten um die Ohren haut, für interessante Sachen suchen und 
finden können. Und es erstaunt mich immer wieder, dass auf so eine - für 
mich alberne - Frage eines TO so viele Beiträge auflaufen! Es scheint ja 
viele Leute sowas wie "Ästhetik im Sandkasten" brennend zu 
interessieren. Wenn ich ein Problem nicht lösen kann, dann werfe ich 
heutzutage die Suchmaschine an und finde meist auch was. Dann freue ich 
mich erst mal und versuche es in mein Progrämmchen einzuarbeiten. Das 
gelingt halt so gut, wie ich den Findling verstanden habe. Später kommen 
ab und zu dann noch Feinheiten wie Schnelligkeit dazu...muß aber nicht 
und schon gar nicht , weil ich's können will...
Gruß Rainer

von Progbit (Gast)


Lesenswert?

Rainer V. schrieb:
> Wenn ich ein Problem nicht lösen kann, dann werfe ich
> heutzutage die Suchmaschine an und finde meist auch was.
exakt genauso ist es.

Rainer V. schrieb:
> Dann freue ich
> mich erst mal und versuche es in mein Progrämmchen einzuarbeiten. Das
> gelingt halt so gut, wie ich den Findling verstanden habe.
da scheint er Verständnis-Schwierigkeiten zu haben ... nur das ist dann 
sein persönliches Problem, das erfordert eben viel Zeit, weil einiges 
mangelhaft und vieles nur ausreichend erklärt wird.
Gerade wenn es schwierig wird, schmieren z.B. auch viele Buchautoren ab 
... da muß man schon selber Recherche betreiben.

Beitrag #6804585 wurde von einem Moderator gelöscht.
Beitrag #6804661 wurde von einem Moderator gelöscht.
Beitrag #6804699 wurde von einem Moderator gelöscht.
von Walter T. (nicolas)


Lesenswert?

Programmierer schrieb:
> ISBN 978-0201633610
Das Buch "Design Patterns. Elements of Reusable Object-Oriented 
Software." von Gamma, Helm et al. habe ich mir ausgeliehen und etwas 
drin gelesen. Es wird wohl angelesen zurückgehen. Ich behaupte nicht, 
dass es schlecht ist, aber es passt überhaupt nicht zum Thema. Schon in 
der Einleitung heißt es sinngemäß: "Treiber und GUI werden nicht 
behandelt" und das Ganze ist auch definitiv auf eine objektorientierte 
Sprache gemünzt. Nur ist gerade das Zweite (GUI) der Teil, der mich am 
meisten interessiert, weil es da am schwierigsten ist Übersicht 
hineinzubekommen, und in C C++ nachzubauen wird die Sache auch nicht 
übersichtlicher machen. Und "kurz vor Ende" eines Projekts die 
Programmiersprache zu wechseln ist eine schlechte Idee. Eine neue 
Programmiersprache probiert man mit einem nagelneuen Mini-Projekt aus.

Ansonsten habe ich mir das Buch mal vorgemerkt für später.

: Bearbeitet durch User
von Rainer V. (a_zip)


Lesenswert?

Walter T. schrieb:
> Ansonsten habe ich mir das Buch mal vorgemerkt für später.

...na dann...

von Progbit (Gast)


Lesenswert?

Walter T. schrieb:
> Nur ist gerade das Zweite (GUI) der Teil, der mich am
> meisten interessiert, weil es da am schwierigsten ist Übersicht
> hineinzubekommen, und in C C++ nachzubauen wird die Sache auch nicht
> übersichtlicher machen.
Mit anderen Worten Du suchst eine GUI zu C und findest nichts?
Dann google mal mal nach SDL oder GTK+ und schon wirst Du fündig.
Alles vorhanden, einarbeiten mußt Du Dich selbst.
Zusätzlich kannst Du natürlich fehlende Headerdateien unter Linux oder 
Mac einbinden, auch das geht, dauert dann etwas.
Oder willst Du selber eine GUI schreiben?
Was Du eigentlich willst, bleibt leider unklar.

von Christopher J. (christopher_j23)


Lesenswert?

Nico T. schrieb:
> Ich finde den Source-Code von Chibios lesenswert. Er arbeitet sich mit
> objektorientiertem C durch sein RTOS.

Dem würde ich zustimmen, wobei mir der Source-Code persönlich etwas 
"Makro-lastig" ist. Er wird aber seine Gründe dafür haben.

Um gerade beim Thema RTOS zu bleiben, werfe ich hier mal noch  Nuttx ein 
und wenn es etwas anwendungsorientiertes sein soll, dann das 
Pixhawk-Projekt (PX4), welches auf Nuttx basiert. Der Bootloader von PX4 
nutzt wiederum ChibiOS ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.