Forum: Mikrocontroller und Digitale Elektronik Empfehlenswerte Literatur zum Erlernen von C


von Gerhard H. (Firma: Rentner) (spectro)


Lesenswert?

Möchte mal die Frage stellen, welche Bücher zum Erlernen von C für 
Controller-Anwendungen für nicht ganz blutige Anfänger empfehlenswert 
wären.

Ich habe mir AVR-Mikrocontroller  Programmierung in C von Heimo Gaicher 
und Micro-Controller Technik mit AVR , Programmierung in Assembler  und 
C  von Günter Schmitt und Andreas Riedenauer zugelegt, wobei der 
Schwerpunkt des letzteren Werkes eher bei Assembler liegt.
Das Buch von Heimo Gaischer ist schon mal ausgezeichnet aufgebaut.
Der Kurs hier im Mikrocontroller.net ist ja auch sehr gut.
Kurse auf Youtube liegen mir nicht so, ich habe Bücher lieber.

Gibt es von euch ein paar Etzes für andere Bücher?
(Grundlagen-Kenntnisse vorhanden)

:
von Patrick C. (pcrom)


Lesenswert?

Clean Code / Martin
Working effectively with Legacy Code / Feathers
The Pragmatic Programmer / ?
Test Driven Development / Beck

(Sorry alle Englisch)
Nicht nur fuer C, aber die gelernte dinger sind fuer viele 
Programmiersprache nutzlich

Ich habe auch irgendwo ein deutsches buch wo u.a.DoxyGen und C-Unit 
werden besprochen fuer benutzung mit C, kann exacten titel jetzt nicht 
finden

Grusz Patrick aus die Niederlande

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Irgendwann bringts mehr, auch mal wirklich selber was zu programmieren 
als das X-te Buch darueber zu lesen.

Gruss
WK

von Gerhard H. (Firma: Rentner) (spectro)


Lesenswert?

Das mache ich ja, aber Anregungen aus Fachliteratur können nie schaden 
und man kann nie genug Fachbücher haben, sag ich mal.

Bisher hatte ich äusserst viel mit BASCOM programmiert, z.B. das hier 
zum Spiegel-Parabolisieren (für ein Newton Teleskop):

https://www.youtube.com/watch?v=yOb71qoFlxA&t=2s

Nun versuche ich mich halt in C. Vielleicht komme ich ja auch gut 
weiter.

von Harald W. (wilhelms)


Lesenswert?

Gerhard H. schrieb:

> Möchte mal die Frage stellen, welche Bücher zum Erlernen von C für
> Controller-Anwendungen für nicht ganz blutige Anfänger empfehlenswert
> wären.

Wie wärs mit dem Kernighan Ritchie?

von Oliver S. (oliverso)


Lesenswert?

Gerhard H. schrieb:
> Das mache ich ja, aber Anregungen aus Fachliteratur können nie schaden
> und man kann nie genug Fachbücher haben, sag ich mal.

In dem Themengebiet hat man lieber ein einziges gutes Buch, als viele 
schlechte, und lieber gar keins, als auch nur ein schlechtes.

Oliver

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Harald W. schrieb:
> Gerhard H. schrieb:
>
>> Möchte mal die Frage stellen, welche Bücher zum Erlernen von C für
>> Controller-Anwendungen für nicht ganz blutige Anfänger empfehlenswert
>> wären.
>
> Wie wärs mit dem Kernighan Ritchie?

Ja, den haette ich auch schon fast vorgeschlagen, aber der ist halt imho 
eher fuer C unter unixoiden OS geschrieben, weniger fuer embedded 
Geruempel.
Und ich hab' den nochdazu damals in einer deutschen Uebersetzung 
gekauft, wo's mir im Nachhinein noch die Schuhe auszieht, wie scheisse 
man so ein Standardwerk uebersetzen kann. WTF soll denn ein Binder sein 
oder ein Uebersetzer?
Hoffentlich ist das derweilen besser geworden.

Gruss
WK

von Gerhard H. (Firma: Rentner) (spectro)


Lesenswert?

[qote]In dem Themengebiet hat man lieber ein einziges gutes Buch, als 
viele
schlechte, und lieber gar keins, als auch nur ein schlechtes.[/quote]

Ja, ganz richtig! Das ist auch mein Gedankengang, weshalb ich auch die 
Frage gestellt habe.

So gesehen ist wahrscheinlich das Buch von Heimo Gaicher fast ideal, 
vermute ich.
Mir fehlen halt auch die Ideen für brauchbare Anwendungen. Derzeit wäre 
meine einzige Idee eine Verschlusszeitmessung für analoge Kameras, weil 
ich mich viel mit analoger Photographie und Schmalfilm beschäftige 
(arbeite auch selbst alles aus.)
Möglicherweise wäre eine vorläufige Rückkehr zu Arduino sogar der beste 
Weg, um voranzukommen, ich weiss es nicht.
Mit BASCOM möchte ich nicht mehr arbeiten.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Gerhard H. schrieb:
> Mir fehlen halt auch die Ideen für brauchbare Anwendungen.

OK, da werden wohl auch kaum Buecher ueber Programmiersprachen helfen. 
Das ist sowas von dem Kaliber: Habe Loesung (C), suche Problem...
Das Problem hatten hier iirc Leute schon oefter; vielleicht hilft die 
Suchfunktion.


Gruss
WK

von Wilhelm M. (wimalopaan)


Lesenswert?

Vergiss C, lerne C++.
Gerade dann, wenn Du noch kein C kannst.

Dieser Ratschlag hat überhaupt gar nichts mit OOP zu tun. Denn C++ ist 
eine Multiparadigmen-Sprache. Du kannst also genauso gut bzw. besser in 
C++ prozedural/imperativ programmieren wie in C. Jedoch sind es die 
kleinen "Goodies", die Dir sehr viel helfen können.

Also Buch: "Der C++-Programmierer", U. Breymann

Beitrag #7336317 wurde von einem Moderator gelöscht.
von Brian Ritchie (Gast)


Lesenswert?

Dergute W. schrieb:
>> Wie wärs mit dem Kernighan Ritchie?
>
> Ja, den haette ich auch schon fast vorgeschlagen, aber der ist halt imho
> eher fuer C unter unixoiden OS geschrieben, weniger fuer embedded
> Geruempel.
> Und ich hab' den nochdazu damals in einer deutschen Uebersetzung
> gekauft, wo's mir im Nachhinein noch die Schuhe auszieht, wie scheisse
> man so ein Standardwerk uebersetzen kann. WTF soll denn ein Binder sein
> oder ein Uebersetzer?

Ich würde immer das Standardwerk empfehlen, idealerweise im englischen 
Original. Anschliessend den Stroustroup für C++, aber erst nach etwas 
Praxis in C.
Ein spezifisches embedded-Buch halte ich für pädagogisch verkehrt. C ist 
schon sehr hardwarenah, und es ist wichtiger, sich erstmal mit der 
C-Denkweise und den Datenstrukturen (und den Einschränkungen von C z.B. 
bei mehrdimensionalen Arrays) vertraut zu machen. Was man dann noch 
braucht, um C embedded einzusetzen, kann man auch leicht im Netz finden.

Brian

von Steve van de Grens (roehrmond)


Lesenswert?

Ich denke, man kann die Sprache C (oder C++) besser auf einem PC lernen. 
Dafür gibt es auch viel mehr Bücher und kostenlose Tutorials.

Die Speziellen Feinheiten bezüglich Mikrocontroller habe ich nach und 
nach heraus gefunden. Die Doku der avr-libc war dabei besonders 
hilfreich, wie auch Ratschläge dieses Forums.

von Jester (Gast)


Lesenswert?

Brian Ritchie schrieb:

> Ich würde immer das Standardwerk empfehlen, idealerweise im englischen
> Original. Anschliessend den Stroustroup für C++, aber erst nach etwas
> Praxis in C.
> Ein spezifisches embedded-Buch halte ich für pädagogisch verkehrt. C ist
> schon sehr hardwarenah, und es ist wichtiger, sich erstmal mit der
> C-Denkweise und den Datenstrukturen (und den Einschränkungen von C z.B.
> bei mehrdimensionalen Arrays) vertraut zu machen. Was man dann noch
> braucht, um C embedded einzusetzen, kann man auch leicht im Netz finden.
>
> Brian

K&R unbedingt (!) im Original. Ich hatte mal eine Übersetzung ins 
Deutsche - und hab sie umgehend entsorgt.

Ich weis schon, man wirft keine Bücher weg und verbrennt sie auch nicht, 
aber in diesem Fall sowie beim Siemens-Datenbuch SAB8080 musste ich 
einfach eine Ausnahme machen.

Sicher findet sich "The C programming Language" auch irgendwo in den 
Tiefen des russischen Webs. Tu dir trotzdem den Gefallen und besorg dir 
eine gedruckte Ausgabe - und dazu eine Anstaltspackung Post-it (R).

Also ein volles AGREE für Brian!

PS: Posit-it - das sind die meist gelben Zettelchen, die man NICHT an 
DuRöhre-Filmchen rankleben kann...

von Jester (Gast)


Lesenswert?

PS: Ich würde Dir zur "Second Edition of The C Programming Language" 
raten - und dort auch ruhig mal das Preface lesen, um sich - wie es 
Brian formuliert hat "erstmal mit der C-Denkweise [...] vertraut zu 
machen".

Eine "3rd Edition" kenn ich nicht - und will auch nicht wissen, wer 
daninter steht ...

just my 2ct

von Da Baby [reformed] (Gast)


Lesenswert?

C ist schnell erlernt. Nimm ein Online Buch und schaue Code anderer an.

von Falk B. (falk)


Lesenswert?

Wilhelm M. schrieb:
> Vergiss C, lerne C++.
> Gerade dann, wenn Du noch kein C kannst.

Im Alter von 74, wo es nur um bissel Spaß im Hobby geht? Naja . . .

von Oliver S. (oliverso)


Lesenswert?

Na, gerade dann ;)

Oliver

von Clöser (Gast)


Lesenswert?

Harald W. schrieb:
> Wie wärs mit dem Kernighan Ritchie?

Den fand ich damals (zusammen mit den Lösungen) sehr gut!

von Peter K. (Gast)


Lesenswert?

Warum nicht Pascal von mikroe?

Ansonsten
C von A-Z.

Wen Du hier fragst ist jedes Buch kacke außer das vom Richie:-)
Aber das ist totaler Quatsch, und ja in JEDEM Buch finden die irgendwas, 
was falsch ist..
Scheiß drauf
Hauptsache 98% sind super erklärt

https://www.amazon.de/dp/3836239736/?coliid=I7C426UQ0028N&colid=1EY8PXVV38K6C&psc=1&ref_=lv_ov_lig_dp_it_im

von Wilhelm M. (wimalopaan)


Lesenswert?

Falk B. schrieb:
> Wilhelm M. schrieb:
>> Vergiss C, lerne C++.
>> Gerade dann, wenn Du noch kein C kannst.
>
> Im Alter von 74, wo es nur um bissel Spaß im Hobby geht? Naja . . .

Ja sicher. Und er hat noch Zeit den Stepanov zu lesen ;-)

von HolgerT (Gast)


Lesenswert?


von Peter K. (Gast)


Lesenswert?

AVR Mikrocontroller - Programmierung in C: Eigene Projekte selbst 
entwickeln und verstehen Taschenbuch – 8. Januar 2016


habe ich gerade hier, ist auch super

von Peter K. (Gast)


Lesenswert?

Das von Helmut Erlenkötter finde ich ehrlich gesagt eher 
durchschnittlich.
Ich hatte es mir vor kurzen erst angesehen neben C von A-Z das erheblich 
ausführlicher ist und besser erklärt

von Teo D. (teoderix)


Lesenswert?

Gerhard H. schrieb:
> Bücher zum Erlernen von C für
> Controller-Anwendungen für nicht ganz blutige Anfänger empfehlenswert
> wären.

So wie ich "nicht ganz blutige Anfänger" interpretiere, würde ich diese 
empfehlen:
https://openbook.rheinwerk-verlag.de/c_von_a_bis_z/

Ist meist recht verständlich geschrieben und man findet recht schnell 
was man sucht.


PS: Ubs.... was solls, einer mehr :)

: Bearbeitet durch User
Beitrag #7336460 wurde von einem Moderator gelöscht.
Beitrag #7336462 wurde von einem Moderator gelöscht.
Beitrag #7336492 wurde von einem Moderator gelöscht.
von P. S. (namnyef)


Lesenswert?

Wirklich gute Bücher für Embedded C sind wohl selten. Da kommt man mit 
Leaning By Doing, Google, Youtube, Blogs usw. weiter, denke ich. Am 
besten hangelt man sich an einem echten Projekt entlang. Sonst verliert 
man schnell die Motivation.

"Clean Code" kann ich auch empfehlen, da hier einfach universelle 
Prinzipien gelehrt werden, die fast überall sehr sinnvoll sind.

Ansonsten kann man sich für ne schmale Mark den MISRA-C Standard holen. 
Die Beispiele und "Rationals" sind extrem lehrreich, wenn man schon 
etwas fortgeschrittener ist. Das Preis-Leistungs-Verhältnis ist hier 
ausgezeichnet.

von Gerhard H. (Firma: Rentner) (spectro)


Lesenswert?

[quote]AVR Mikrocontroller - Programmierung in C: Eigene Projekte selbst
entwickeln und verstehen Taschenbuch[/quote]

Das von Heimo Gaicher? Das finde ich auch super. Würde ich selbst 
weiterempfehlen.
Gerhard

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


Lesenswert?

P. S. schrieb:
> Ansonsten kann man sich für ne schmale Mark den MISRA-C Standard holen.

Ach nee, lieber nicht.

MISRA ist gut für Entscheider. Die können dann immer sagen, sie haben 
sich an den Stand der Technik gehalten.

Für Spaß und Hobby darf man gern ordentlich programmieren, aber bei 
solch sturen Regeln vergeht einem der Spaß manchmal doch recht schnell.

@Gerhard: Fang einfach an (hast du ja schon). Die Tutorials hier haben 
zumindest schon mal den Mikrocontroller-Fokus, da bekommst du dann auch 
sowas wie die im anderen Thread genannten Bitmanipulationen erläutert, 
statt dass du dir anfängst, deine Bitmuster als Hex-Zahlen selbst 
zusammenzuschreiben.

von Wilhelm M. (wimalopaan)


Lesenswert?

Jörg W. schrieb:
> @Gerhard: Fang einfach an (hast du ja schon).

Und fange nicht auf einem µC an, C oder C++ oder ... lernen zu wollen. 
Mache das erstmal auf dem PC. Das geht viel einfacher, und es gibt da 
auch sehr viele Aufgaben, an den Du Dich versuchen kannst.

Neben den ganzen Büchern, die hier empfohlen werden, lege auch immer die 
Transskription des C/C++- Standards daneben (denn leider gibt es eben 
auch sehr viele sehr schlechte Bücher, Tutorials, etc.):

https://en.cppreference.com/w/

und lese da nach. Denn das ist nun mal die Richtschnur (s.a. die 
Diskussion um Rückgabetyp und Signatur von main(...) im anderen Thread).

von Peter D. (peda)


Lesenswert?

Bücher über die C-Grundlagen würde ich keine kaufen. Die Syntaxregeln 
von C sind überraschend wenige und schnell zu lernen. Außerdem kann man 
sie schneller im Internet nachschlagen und auch die Operatoren und deren 
Rangfolge sowie die Funktionen der Standardlibs.
Speziell Für den AVR-GCC findet man auch hier vieles:
https://www.nongnu.org/avr-libc/user-manual/index.html

Was Anfängern die meisten Probleme bereitet, ist die Herangehensweise an 
eine Aufgabe, d.h. der Programmierstil.
Da gibt es viel falsch zu machen:
https://www.tesolva.de/blogpost/quick-and-dirty-oder-doch-lieber-sauber-programmieren

Daher gibt es darüber viele Bücher, z.B.
"Weniger schlecht programmieren"
https://www.amazon.de/Weniger-schlecht-programmieren-Kathrin-Passig/dp/3897215675

von Wilhelm M. (wimalopaan)


Lesenswert?

Peter D. schrieb:
> Bücher über die C-Grundlagen würde ich keine kaufen. Die Syntaxregeln
> von C sind überraschend wenige und schnell zu lernen. Außerdem kann man
> sie schneller im Internet nachschlagen und auch die Operatoren und deren
> Rangfolge sowie die Funktionen der Standardlibs.
> Speziell Für den AVR-GCC findet man auch hier vieles:
> https://www.nongnu.org/avr-libc/user-manual/index.html
>
> Was Anfängern die meisten Probleme bereitet, ist die Herangehensweise an
> eine Aufgabe, d.h. der Programmierstil.
> Da gibt es viel falsch zu machen:
> 
https://www.tesolva.de/blogpost/quick-and-dirty-oder-doch-lieber-sauber-programmieren

Wow, meistens bekomme ich hier was auf die Mütze, wenn ich von 
Clean-Code anfange ;-)

Wer mit dem Programmieren angefangen hat, sollte auf jeden Fall den 
Stepanov "Elements of Programming" lesen.

Beitrag #7336888 wurde von einem Moderator gelöscht.
von Steve van de Grens (roehrmond)


Lesenswert?

Wilhelm M. schrieb:
> 
https://www.tesolva.de/blogpost/quick-and-dirty-oder-doch-lieber-sauber-programmieren

Bei einem Punkt muss ich aber widersprechen:

"Das Programm sollte in kurze Methoden (= Funktionen) aufgeteilt werden, 
sodass jede Methode möglichst nur eine konkrete Aufgabe erfüllt. Oft 
wird hier als Richtwert eine Anzahl von 4-6 Zeilen genannt."

Die Ermahnung, Funktionen möglichst kurz zu halten ist ja OK, aber 4-6 
Zeilen halte ich für völlig unpraktikabel.

: Bearbeitet durch User
von Teo D. (teoderix)


Lesenswert?

Steve van de Grens schrieb:
> Ich weiß nicht, wer diese 4-6 Zeilen nennt, aber das halte ich für
> völlig unpraktikabel.

Theoretiker
Im Schnitt, gut das Doppelte, dürfte wohl eher realistisch sein.

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


Lesenswert?

Eigentlich genügt es vollkommen, wenn zusammenhängende Codestücke auf 
eine Bildschirmseite passen. Die ist inzwischen durchaus auch schon mal 
etwas länger als nur 24 Zeilen wie noch vor ein paar Jahrzehnten.

Wichtiger als irgendwelche Dogmas ist, dass man sich in klaren 
Strukturen ausdrückt. Für das Beispiel von Gerhards Siebensegmentanzeige 
wäre daher eine Funktion, die jeweils die aktuelle Stelle neu ermittelt 
und ausgibt, sinnvoll. Die kann er dann aktuell aus main() heraus 
aufrufen und simpel ein Delay danach nehmen. Wenn er dann mal soweit 
ist, dass er auch Interrupts versteht, kann er die gleiche Funktion 
einfach aus dem Timerinterrupt heraus aufrufen.

von Jedes Kind coded (Gast)


Lesenswert?

Teo D. schrieb:
> Steve van de Grens schrieb:
>> Ich weiß nicht, wer diese 4-6 Zeilen nennt, aber das halte ich für
>> völlig unpraktikabel.
>
> Theoretiker
> Im Schnitt, gut das Doppelte, dürfte wohl eher realistisch sein.

Statt ein LoC-obergrenze für normale function zu nennen, kann man auch 
eine Untergrenze für wahrscheinlich zu lange functionen nennen. Und die 
liegt bei etwa 100 LoC.

> welche Bücher zum Erlernen von C für
> Controller-Anwendungen für nicht ganz blutige Anfänger empfehlenswert
> wären.

ISBN: 978-3897215672
entgegen dem Titel siehen viele Examples nach C aus. Allerdings weniger 
embedded/Controller als Büro-Informatik.

von Peter D. (peda)


Lesenswert?

Steve van de Grens schrieb:
> Die Ermahnung, Funktionen möglichst kurz zu halten ist ja OK, aber 4-6
> Zeilen halte ich für völlig unpraktikabel.

Och, das kriege ich schon hin, es gibt aber auch Ausreißer, die deutlich 
länger sind.
Allgemein versuche ich, Funktionen logisch aufzuteilen.
Hier mal ein Beispiel:
1
static void wd_reset(void)                              // force watchdog to reset the CPU
2
{
3
  cli();
4
  wdt_enable(WDTO_15MS);
5
  while (1);
6
}
7
8
void cmd_reset(void)
9
{
10
  schedule_remove(wd_reset);
11
  if (!schedule_add_oneshot(wd_reset, TICKS(0.1)))
12
    wd_reset();                                         // reset if delayed reset failed
13
  answer_success();
14
}
15
16
void cmd_eeclear(void)
17
{
18
  Eepdata.par.crc++;
19
  eeprom( (uint8_t*)&Eepdata.par.crc, EEPARAM_END - 2, 1, EE_WRITE );
20
  cmd_reset();                                          // reset after 0.1s
21
}

Geht natürlich nur bei MCs mit echtem Stack im RAM.
Kleine PICs mit limitiertem Hardwarestack erlauben das nicht. Da sieht 
man deshalb oft den berüchtigten Spaghetticode mit vielen 
fehlerträchtigen Copy&Paste Wiederholungen.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Jörg W. schrieb:
> Wichtiger als irgendwelche Dogmas ist, dass man sich in klaren
> Strukturen ausdrückt.

Die Tips sollte man nicht als Dogma ansehen, sondern als Empfehlung. 
Einzelne Abweichungen sind also erlaubt.

von Teo D. (teoderix)


Lesenswert?

Peter D. schrieb:
> Kleine PICs mit limitiertem Hardwarestack erlauben das nicht.

Wie kommst du auf dieses schmale Brett?!
Dass das nicht sooo effizient umgesetzt werden kann, OK aber das man da 
auf Spaghetti-Code ausweichen muss ist schlicht weg BLÖDSINNI³.
Das du die Dinger nicht magst, ist ja OK aber deswegen dummes Zeug 
verbreiten....

von Jodes Kind coded (Gast)


Lesenswert?

Peter D. schrieb:
> Steve van de Grens schrieb:
>> Die Ermahnung, Funktionen möglichst kurz zu halten ist ja OK, aber 4-6
>> Zeilen halte ich für völlig unpraktikabel.
>
> Och, das kriege ich schon hin, es gibt aber auch Ausreißer, die deutlich
> länger sind.

Ehrlich? Das ist scheiße, eine Funktion dadurch zu kürzen, das man code 
durch verschachtelte Funktionsaufrufe ersetzt.
 Einen Functionsaufruf ist IMHO auch kein funktionaler 
(informationsverarbeitender) Code sondern simple rumspringerei. man 
könnte auch sagen, da wird garnichts gemacht, da dreht sich nur der 
Programmcounter im kreise ;-)

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


Lesenswert?

Jodes Kind coded schrieb:
> man könnte auch sagen, da wird garnichts gemacht, da dreht sich nur der
> Programmcounter im kreise

Nicht zwingend. Wenn der Compiler feststellen kann, dass das alles nur 
Eintagsfliegen sind, dann bleibt der erzeugte Code weiter schön linear.

von Jedes Kind coded (Gast)


Angehängte Dateien:

Lesenswert?

Teo D. schrieb:
> Peter D. schrieb:
>> Kleine PICs mit limitiertem Hardwarestack erlauben das nicht.
>
> Wie kommst du auf dieses schmale Brett?!
> Dass das nicht sooo effizient umgesetzt werden kann, OK aber das man da
> auf Spaghetti-Code ausweichen muss ist schlicht weg BLÖDSINNI³.
> Das du die Dinger nicht magst, ist ja OK aber deswegen dummes Zeug
> verbreiten....

was ist daran dumm? Es gibt nun mal Controller, die können 
Unterprogrammaufrufe nur in wenigen Ebenen verschachteln (Bsp im Anhang 
AVR AT90S1200 -> 3 Ebenen) und da sollte man nicht vom unterprogramm ins 
unter-unterprogramm verzweigen.

von Stefan A. (king-crash)


Lesenswert?

Jodes Kind coded schrieb:
> ...sondern simple rumspringerei...

Funktionen wahllos klein zu machen halte ich auch für kontraproduktiv, 
aber wenn es sich aus Lesbarkeitsgründen anbietet ist ein Auslagern in 
eine extra Funktion sehr hilfreich. Mit einem "static inline" vor der 
Funktion gibt es dann auch kein Sprung oder andere Nachteile.

von Jedes Kind coded (Gast)


Lesenswert?

Jörg W. schrieb:
> Jodes Kind coded schrieb:
>> man könnte auch sagen, da wird garnichts gemacht, da dreht sich nur der
>> Programmcounter im kreise
>
> Nicht zwingend. Wenn der Compiler feststellen kann, dass das alles nur
> Eintagsfliegen sind, dann bleibt der erzeugte Code weiter schön linear.

Du meinst "Inlining"?!
Darauf würde ich mich aber nicht verlassen. Und dann schaut der (C-)Code 
auch nicht sonderlich consitent aus. Im Code ist es (langsamer9 
Unterprogrammaufruf, im Compilat dagegen flottes inlining (wenn die 
Compileroptionen entsprechend stehen).

von Teo D. (teoderix)


Lesenswert?

Jedes Kind coded schrieb:
> da sollte man nicht vom unterprogramm ins
> unter-unterprogramm verzweigen.

Das ist was ganz anderes, als geht nicht..... Hier gehts doch um C und 
nicht um Assembler....

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


Lesenswert?

Stefan A. schrieb:
> Mit einem "static inline" vor der Funktion gibt es dann auch kein Sprung
> oder andere Nachteile.

"static" genügt (bzw. hilft stark – bei LTO wäre nichtmal das nötig).

"inline" ist nur ein Hinweis an den Compiler, kann er ignorieren. 
Andererseits kann er problemlos auch ohne "inline" die Funktionen inline 
erweitern.

von Jedes Kind coded (Gast)


Lesenswert?

Stefan A. schrieb:
> odes Kind coded schrieb:
>> ...sondern simple rumspringerei...
>
> Funktionen wahllos klein zu machen halte ich auch für kontraproduktiv,
> aber wenn es sich aus Lesbarkeitsgründen anbietet ist ein Auslagern in
> eine extra Funktion sehr hilfreich.

Gerade Lesbarkeistgründe sprechen IMHO gegen das Auslagern von 
Code-schnipseln/-fragmenten in extra Funktionen.

>Funktionen wahllos klein zu machen halte ich auch für kontraproduktiv,

Ich würde das nicht als "wahllos" beschreiben, sondern als "zwanghaft 
minimal" oder konkret 4-6 Zeilen. Das ist dann wirklich schwerer lesbar.

Oben, das mit der "Bildschirmseite" (also "ohne scrollen alles im 
Blick") ist m.E. die beste Regel für die Länge einer Function .. obwohl 
es sicher auch "Spezies" gibt, die einen 1920-Bildschirm Hochkant 
aufstellen und den Font-size auf 8 stellen um 240 Zielen untereinander 
zu klatschen ;-)

von Jedes Kind coded (Gast)


Lesenswert?

Teo D. schrieb:
> Jedes Kind coded schrieb:
>> da sollte man nicht vom unterprogramm ins
>> unter-unterprogramm verzweigen.
>
> Das ist was ganz anderes, als geht nicht..... Hier gehts doch um C und
> nicht um Assembler....

Nö, das ist genau das selbe. Wenn ein Controller eben nur einen 
call-stack von 3 ebenen hat, dann hat er nur 3 ebenene, egal ob in C, 
assembler oder "HeisserScheiß" programmiert.

Beitrag #7337041 wurde von einem Moderator gelöscht.
von Peter D. (peda)


Lesenswert?

Jodes Kind coded schrieb:
> Ehrlich? Das ist scheiße, eine Funktion dadurch zu kürzen, das man code
> durch verschachtelte Funktionsaufrufe ersetzt.

Hab ich auch nie behauptet.
Eine Unterfunktion wird entweder an mehreren Stellen benötigt oder führt 
eine klar abgegrenzte Aufgabe aus. Nur aus Jux und Dollerei unterteile 
ich nichts. Es muß schon der Lesbarkeit dienen.
Nur einmal aufgerufene Funktionen werden eh vom Compiler inlined, d.h. 
verbrauchen keinen Stack.

von rbx (Gast)


Lesenswert?

Gerhard H. schrieb:
> Gibt es von euch ein paar Etzes für andere Bücher?
> (Grundlagen-Kenntnisse vorhanden)

Also so grundlegend muss man immer darauf hinweisen:
Lernen durch Übung, üben üben üben, Übung macht den Meister.

- K+R, auch wenn die Übersetzung zum Schmunzeln animiert, der Code eher 
nicht.
- Erlenkötter C, angenehm didaktischer Aufbau, man kann auch lernen, wie 
man eine Game-Engine schreibt. Diesbezüglich bräuchte man aber auch 
nicht zu knapp Mathe in Richtung Lineare Algebra. Statistik kann auch 
nicht schaden, oder Assembler.
- Sedgewick, Algorithmen in C

Ja, man könnte mal versuchen, Verschachtelungen, oder Verschattung auf 
der Assemblerebene hinzubekommen.
Man wird mehrere Wege finden, und sich vermutlich auch für Disassemblies 
interessieren.

oder: wer kann der kann:
https://crypto.stanford.edu/~blynn/c/craft.html

oder: man muss (darüberhinaus) schon wollen:
https://bellard.org/tcc/

Beitrag #7337052 wurde von einem Moderator gelöscht.
Beitrag #7337075 wurde vom Autor gelöscht.
von Falk B. (falk)


Lesenswert?

Teo D. schrieb:
>> Ich weiß nicht, wer diese 4-6 Zeilen nennt, aber das halte ich für
>> völlig unpraktikabel.
>
> Theoretiker
> Im Schnitt, gut das Doppelte, dürfte wohl eher realistisch sein.

Nicht mal das! 12 Zeilen für eine Funktion? Da hab ich ja gerade mal den 
Kopf geschrieben, die lokalen Variablen deklariert und das return 
geschrieben. Vollkommen weltfremd. Meine Funktionen sind irgendwas 
zwischen 5-1000 Zeilen.

von Teo D. (teoderix)


Lesenswert?

Jedes Kind coded schrieb:
> Teo D. schrieb:
>> Jedes Kind coded schrieb:
>>> da sollte man nicht vom unterprogramm ins
>>> unter-unterprogramm verzweigen.
>>
>> Das ist was ganz anderes, als geht nicht..... Hier gehts doch um C und
>> nicht um Assembler....
>
> Nö, das ist genau das selbe. Wenn ein Controller eben nur einen
> call-stack von 3 ebenen hat, dann hat er nur 3 ebenene, egal ob in C,
> assembler oder "HeisserScheiß" programmiert.

Hab ich irgendwo behautet, das sich der HW-Stack auf wundersame weise 
vermehrt?! :DDD

von Teo D. (teoderix)


Lesenswert?

Falk B. schrieb:
> 12 Zeilen für eine Funktion? Da hab ich ja gerade mal den
> Kopf geschrieben, die lokalen Variablen deklariert und das return
> geschrieben.

Schon klar, nur der Kopf gehört für mich nicht dazu und da dürfte ich 
wohl nicht der Einzige sein. ;)

von Lothar J. (black-bird)


Lesenswert?

Hallo Gerhard H.,
mein Rat (als Rentner) an Dich ist auch das, was Peter D. In diesem 
Thread vorgeschlagen hat:

Peter D. schrieb:
> Bücher über die C-Grundlagen würde ich keine kaufen. Die Syntaxregeln
> von C sind überraschend wenige und schnell zu lernen. Außerdem kann man
> sie schneller im Internet nachschlagen und auch die Operatoren und deren
> Rangfolge sowie die Funktionen der Standardlibs.
> Speziell Für den AVR-GCC findet man auch hier vieles:
> https://www.nongnu.org/avr-libc/user-manual/index.html
>
> Was Anfängern die meisten Probleme bereitet, ist die Herangehensweise an
> eine Aufgabe, d.h. der Programmierstil.

Fang einfach an. Nimm ein funktionierendes Code- Beispiel für Deinen 
Controller aus dem Forum und verändere und erweitere es für Deine 
Wünsche, Stück für Stück.
Sind die Regeln oder die Syntax unklar, hilft ein Buch zum 
!Nachschlagen! oder das Internet.

Peter D. hat auch einen wunderbar funktionierenden UART-Code geschrieben 
(findest Du im Forum), mit dem sich einfache Debug-Ausgaben und auch 
umfangreiche Ein- und sonstige Ausgaben (in ein Terminal-Programm auf 
den PC) machen lassen. Von ihm gibt es auch ein sehr gutes Code-Beispiel 
für Taster und Encoder-Eingaben.

Kannst Du verwenden, musst Du aber nicht.

Wenn Du schon soviel, wie beschrieben, auf die Beine gestellt hast, dann 
ist Lernen per Anleitung eines Buches verschwendete Zeit und bringt Dich 
nur minimal weiter.

Blackbird

von Mike J. (linuxmint_user)


Lesenswert?


von Gerhard H. (Firma: Rentner) (spectro)


Lesenswert?

Vielen Dank für die Tipps, Lothar!

Gruss, Gerhard

von Alexander S. (alesi)



Lesenswert?

Steve van de Grens schrieb:
> "Das Programm sollte in kurze Methoden (= Funktionen) aufgeteilt werden,
> sodass jede Methode möglichst nur eine konkrete Aufgabe erfüllt. Oft
> wird hier als Richtwert eine Anzahl von 4-6 Zeilen genannt."
>
> Die Ermahnung, Funktionen möglichst kurz zu halten ist ja OK, aber 4-6
> Zeilen halte ich für völlig unpraktikabel.

Richtig, bei 4-6 Zeilen pro Funktion sollte man in Forth mit refactoring 
starten bis man bei einer Zeile pro Funktion angekommen ist :-)

Over the Shoulder 1 - Text Preprocessing in Forth, Samuel Falvo II, 
Andreas Wagner
https://www.youtube.com/watch?v=mvrE2ZGe-rs

von Yalu X. (yalu) (Moderator)


Lesenswert?

IMHO sollte heutzutage ein C-Buch mindestens den C99-Standard abdecken,
weswegen der K&R leider etwas überholt ist.

Von den neueren Büchern gefallen mir die beiden folgenden ganz gut:

K. N. King, C Programming – A Modern Approach
- C99
- Enthält auch ein kleines Kapitel über hardwarenahes Programmieren
  (Bitgepopel, Zugriff auf Hardwareregister)
- Beschreibt auch recht ausführlich die Aufteilung großer Programme in
  separate Übersetzungseinheiten (Modularisierung)
- Stil: Eher Lehrbuch
- http://knking.com/books/c2/index.html

Peter Prinz, Tony Crawfordm, C in a Nutshell, 2nd Edition
- C11
- Kleine Einführung in GCC und Make
- Stil: Eher Referenzhandbuch
- https://www.oreilly.com/library/view/c-in-a/9781491924174/

: Bearbeitet durch Moderator
von Gerhard O. (gerhard_)


Lesenswert?

Hier ist noch ein Buch:
https://www-personal.acfr.usyd.edu.au/tbailey/ctext/ctext.pdf

"An Introduction to the C Programming Language and Software Design"

Von Tim Bailey

von Alexander S. (alesi)


Lesenswert?

Gerhard O. schrieb:
> Hier ist noch ein Buch:

... und hier noch eines:

    Notes on Data Structures and Programming Techniques by James Aspnes

    http://cs.yale.edu/homes/aspnes/classes/223/notes.html

von Wilhelm M. (wimalopaan)


Lesenswert?

Alexander S. schrieb:
> Gerhard O. schrieb:
>> Hier ist noch ein Buch:
>
> ... und hier noch eines:
>
>     Notes on Data Structures and Programming Techniques by James Aspnes
>
>     http://cs.yale.edu/homes/aspnes/classes/223/notes.html

Besonders gut ist: "7.1 What’s wrong with C". Wobei hier der erste 
genannte Punkt, dass C keine Garbage-Collection hat, der am wenigsten 
wichtigste ist.

von Wilhelm M. (wimalopaan)


Lesenswert?

Teo D. schrieb:
> Falk B. schrieb:
>> 12 Zeilen für eine Funktion? Da hab ich ja gerade mal den
>> Kopf geschrieben, die lokalen Variablen deklariert und das return
>> geschrieben.
>
> Schon klar, nur der Kopf gehört für mich nicht dazu und da dürfte ich
> wohl nicht der Einzige sein. ;)

12 Zeilen für die Signatur?
Und warum definierst Du alle lokalen Variablen am Anfang einer Funktion. 
Das ist doch Blödsinn.
Zeig doch mal ein Beispiel von so einem Monster.

von Alexander S. (alesi)


Lesenswert?

Gerhard H. schrieb:
> Ich habe mir AVR-Mikrocontroller  Programmierung in C von Heimo Gaicher
> und Micro-Controller Technik mit AVR , Programmierung in Assembler  und
> C  von Günter Schmitt und Andreas Riedenauer zugelegt,

Daneben gibt es auch noch das Buch AVR - Mikrocontroller von Ingo 
Klöckl.
https://www.degruyter.com/document/doi/10.1515/9783110407693/html
Darin wird die Hardware und die Software beschrieben. Der Fokus liegt 
weniger auf dem Erlernen von C, es gibt aber reichlich Beispiele.

Das wurde, glaube ich, noch nicht genannt.

von Stefan F. (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Wobei hier der erste genannte Punkt, dass C keine Garbage-Collection
> hat, der am wenigsten wichtigste ist.

Es ist halt ein fundamentaler Unterschied, den man wissen muss wenn man 
damit arbeitet. Aber nicht unbedingt schlecht. Garbage Kollektoren habe 
ihre eigenen Tücken, die man früher oder später schmerzlich kennen 
lernt, wenn man nicht drauf vorbereitet ist.

von Gerhard H. (Firma: Rentner) (spectro)


Lesenswert?

Ich habe ein hervorragendes Lehrbuch entdeckt:

"Mikrocontroller programmieren lernen. Einführung in die Programmierung 
von Mikrocontrollern-Vom Programmiergerät bis zu fertigen Projekten" von 
Holger Weiß.
Verwendet wird der ATMega328.
Ideal für Anfänger.
Endlich mal etwas, das wirklich was taugt.

Empfehlenswert!

von Mike J. (linuxmint_user)


Lesenswert?

Stefan F. schrieb:
> Es ist halt ein fundamentaler Unterschied, den man wissen muss wenn man
> damit arbeitet. Aber nicht unbedingt schlecht.

Man kann ja auch erlernen seinen Müll mal selbst weg zu räumen.

von Steve van de Grens (roehrmond)


Lesenswert?

Ein allgemein gehaltenes Buch über C auf Mikrocontrollern kann es meiner 
Meinung nach gar nicht geben.

Denn diese Programmiersprache war eigentlich für (mindestens) 16 Bit 
Computer mit Betriebssystem gemacht. Deswegen hat in C der normale 
Integer 16 Bit. Einzelne Bits gibt es in C eigentlich nicht. 
Interrupthandler und das Ansprechen von Registern war dem Betriebssystem 
vorbehalten, welches an diesen Stellen vorwiegend in Assembler 
programmiert wurde.

Auf Mikrocontrollern braucht man das alles aber, und zwar vorzugsweise 
direkt in C ohne Assembler Code einbetten zu müssen.

Jeder C Compiler wurde daher abweichend vom Standard C speziell für den 
jeweiligen Mikrocontroller Typ angepasst und bringt entsprechend 
spezifische Erweiterungen/Eigenheiten mit sich.

Wenn man das lernen will, muss man mit einem konkreten 
Mikrocontroller-Typ anfangen. Die klassischen AVR eignen sich dazu sehr 
gut, wie ich meine.

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


Lesenswert?

Steve van de Grens schrieb:
> Ansprechen von Registern war dem Betriebssystem vorbehalten, welches an
> diesen Stellen vorwiegend in Assembler programmiert wurde.

C war von vornherein dafür gedacht, möglichst große Teile des 
Betriebssystems damit implementieren zu können.

https://www.bell-labs.com/usr/dmr/www/cacm.html

"The preponderance of Unix software is written in the abovementioned C 
language [7]. Early versions of the operating system were written in 
assembly language, but during the summer of 1973, it was rewritten in 
C."

von Wilhelm M. (wimalopaan)


Lesenswert?


von Alexander S. (alesi)


Lesenswert?

Wilhelm M. schrieb:
...
>
> Im Gegenteil: Du solltest
>
> ...
>
> lesen.

Danke für den Link. "A commentary on the Sixth Edition UNIX Operating 
System, with Source Code" gibt es im Internet, u.a. bei archive.org
https://archive.org/details/CommentarySixthEditionUNIX/6thEdLions/mode/2up
Links oben ist auch der Link auf den Source Code (pdf).

Die 6th ed. war für eine PDP-11/40. Unter dem Namen xv6 gibt es eine 
moderne Implementierung für x86 und RISC-V:
"xv6 is a modern reimplementation of Sixth Edition Unix in ANSI C for 
multiprocessor x86 and RISC-V systems. It was created for pedagogical 
purposes in MIT's Operating System Engineering course in 2006."
https://en.wikipedia.org/wiki/Xv6

von Christian B. (casandro)


Lesenswert?

Also mir hat sehr geholfen vorher erst mal einen angenehmen Assembler 
(AVR-Risc) gut zu können.
Daraus habe ich folgende wichtige Punkte erlernt:
1. Was der Computer eigentlich macht: C hat keine Abstraktionsebenen die 
Dich vor der Maschine retten. Arrays sind beispielsweise nur Pointer bei 
denen ein "Multiplikationsfakor für den Index" im Compiler verwaltet 
wird. Was daraus folgt wird klar, wenn man schon mal Assembler 
programmiert hat.
2. Dinge die man in C nicht machen sollte tun in Assembler richtig weh: 
Beispielsweise verschachtelte if-Abfragen. So was tut in Assembler 
einfach weh.

C selbst ist dann relativ schnell erlernt. Wenn man von der 
Assemblerseite her kommt sieht man das schnell als Assembler mit jeder 
Menge Komfortfunktionen an.

Dann kommt die Phase in der man dann den Umgang mit diesen angenehmen 
Funktionen kennen lernen sollte. Es mag vielleicht erst mal absurd 
klingen, aber dort kann man von anderen Sprachen lernen. Es gibt da ein 
Erlang-Buch, das mir geholfen hat deutlich lesbareren C-Code zu 
schreiben.

"The Art of UNIX Programming" ist ein Standardwerk für die praktische 
Gestaltung von Programmen. Das ist zwar eigentlich auf UNIX-Systeme 
ausgelegt, man kann daraus aber auch viel für Embedded-Systeme lernen. 
(z.Bsp. dass es sehr häufig sinnvoll ist Textformate zu verwenden)

Dann muss man wissen, was Compiler heute können. Da hilft es wenn man 
sich den Assemblercode ausgeben lässt, den der Compiler erstellt. 
Standardfunktionen sind heute zum Beispiel "Tail-Recursion", was unter 
speziellen Bedingungen rekursive Funktionsaufrufe in Schleifen 
umwandelt. Dadurch kann man, ohne Probleme mit dem Stack, Rekursion 
anstelle von Schleifen verwenden, was unter bestimmten Bedingungen den 
Code sehr viel lesbarer machen kann.

Wichtig ist auch immer: Du programmierst nicht für den Compiler, Du 
programmierst für den der nach Dir den Code lesen muss. Je simpler Dein 
Code ist, je weniger unnötige Sprachelemente Du benutzt, um so leichter 
tut sich der Nächste. Das typische Negativbeispiel ist das typische 
"Hello World" in C++ mit Streams, bei Dem Du erst mal einige Wochen C++ 
lernen musst um es lesen zu können.

von Gerhard O. (gerhard_)


Lesenswert?

Christian B. schrieb:
> Wichtig ist auch immer: Du programmierst nicht für den Compiler, Du
> programmierst für den der nach Dir den Code lesen muss.

Das ist man meistens selber;-)

von M. K. (sylaina)


Lesenswert?

Gerhard O. schrieb:
> Das ist man meistens selber;-)

Gilt nur für die ersten Tage ;) :D

von Peter D. (peda)


Lesenswert?

M. K. schrieb:
> Gerhard O. schrieb:
>> Das ist man meistens selber;-)
>
> Gilt nur für die ersten Tage ;) :D

Gilt besonders, wenn der Kunde Eweiterungen möchte und man sich nach 
einem Jahr wieder reinfitzen muß.
Da zahlt es sich dann aus, wenn man nicht schnell mal eben den 
grausamsten C&P Spaghetticode runtergerotzt hat, sondern schon eine 
Struktur reingebracht hat.

von M. K. (sylaina)


Lesenswert?

Peter D. schrieb:
> M. K. schrieb:
>> Gerhard O. schrieb:
>>> Das ist man meistens selber;-)
>>
>> Gilt nur für die ersten Tage ;) :D
>
> Gilt besonders, wenn der Kunde Eweiterungen möchte und man sich nach
> einem Jahr wieder reinfitzen muß.
> Da zahlt es sich dann aus, wenn man nicht schnell mal eben den
> grausamsten C&P Spaghetticode runtergerotzt hat, sondern schon eine
> Struktur reingebracht hat.

von Christian B. (casandro)


Lesenswert?

Gerhard O. schrieb:
> Das ist man meistens selber;-)

Richtig, deshalb ist es wichtig, dass selbst der dümmste Mensch den man 
sich vorstellen kann, den Code noch verstehen kann... denn das ist man 
meistens selber. :)

Ich persönlich tendiere dazu, "schwierige" Konstrukte weg zu lassen, 
wenn sie nicht benötigt werden.

Ein Beispiel ist die destruktive Zuweisung auf Variablen. In C kann man 
folgendes machen:

int i=15; //Deklaration von Ganzzahlvariable i mit dem Wert 15
i++; //destruktives Überschreiben des Wertes von i mit 16

Besser, aber noch nicht gut ist da:
i=i+1;

Wobei man häufig sogar ganz darauf verzichten kann, wenn man sein 
Programm sinnvoll strukturiert.

Was ich aus Erlang gelernt habe ist, dass man Eingabevariablen auch 
gleich am Anfang testen kann, also nicht:

void irgendwas(char *s)
{
   if (s!=NULL) {
 ...
   }
}


sondern:
void irgendwas(char *s)
{
   if (s==NULL) return;
...

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


Lesenswert?

Christian B. schrieb:
> sondern:
> void irgendwas(char *s)
> {
> if (s==NULL) return;
> ...

Dann solltest du nie mit MISRA in Berührung kommen, denn die sind der 
Meinung, dass eine Funktion nur einen einzigen Ausgang haben darf.

Dass das dann zu undurchsichtigem if/else-Spaghetti führt, scheint sie 
nicht weiter zu berühren …

von P. S. (namnyef)


Lesenswert?

Jörg W. schrieb:
> Christian B. schrieb:
>> sondern:
>> void irgendwas(char *s)
>> {
>> if (s==NULL) return;
>> ...
>
> Dann solltest du nie mit MISRA in Berührung kommen, denn die sind der
> Meinung, dass eine Funktion nur einen einzigen Ausgang haben darf.
>
> Dass das dann zu undurchsichtigem if/else-Spaghetti führt, scheint sie
> nicht weiter zu berühren …

Den MISRA-Standard (£15!) kann man sich alleine deswegen schon ins Regal 
stellen, damit man nicht den getriggerten KMU-Bastlern, die noch nie in 
ihrem Leben sicherheits- oder missionskritische Firmware geschrieben 
haben, geschweige denn mit IEC 61508 oder ISO 26262 in Berührung 
gekommen sind, glauben schenken muss.

Dann wüsste man z. B. auch, dass die "single point of exit"-Regel 
lediglich "Advisory" ist. Diese Regel also nur eine "Recommendation" 
darstellt, die man nur "as far as reasonable practical" befolgen sollte.

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


Lesenswert?

P. S. schrieb:
> Dann wüsste man z. B. auch, dass die "single point of exit"-Regel
> lediglich "Advisory" ist.

Das hilft dir nichts, wenn dir die innerbetriebliche Bürokratie dann 
vorschreibt, dass du jegliche Abweichung davon in irgendeinem 
umständlichen Prozess dokumentieren musst. Weil darauf keiner Bock hat, 
wird dann doch lieber wieder Spaghetticode mit viel if / else 
geschrieben, denn darüber beschwert sich keiner der MISRA-Checker. 
Dass man den Mist hinterher gar nicht mehr lesen kann, bewertet kein 
maschineller Test, und MISRA schreibt auch nirgends, dass lesbarer Code 
einem stur die Regeln befolgenden Code zu bevorzugen wäre.

von Tam H. (Firma: Tamoggemon Holding k.s.) (tamhanna)


Lesenswert?

Guido Krüger, Programmieren in C
OReilly - Mastering Algorithms in C
Spinellis - Code Reading
Ted Faison - Taking Events to the Limit

Danach je nach Laune entweder mein Buch zu MCUs und/oder
OReilly - AI for Game Developers und OReilly - Physics for Game 
Developers



Alle antiquarisch gut erhaeltlich zuB bei Alibris

von Christian B. (casandro)


Lesenswert?

Jörg W. schrieb:
> Dann solltest du nie mit MISRA in Berührung kommen, denn die sind der
> Meinung, dass eine Funktion nur einen einzigen Ausgang haben darf.

Ja, das ist so wie eine "ISO-Zertifizierung" in einem Unternehmen. Das 
dient primär als Zeichen dafür, dass man in so ein Unternehmen nicht 
gehen will.

Solche Regelwerke bringen in der Regel nur "Boxticking" ohne echte 
Sicherheitsvorteile.

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


Lesenswert?

Christian B. schrieb:
> Das dient primär als Zeichen dafür, dass man in so ein Unternehmen nicht
> gehen will.

Würde ich so nicht sagen.

ISO900x besagt ja nur, dass du definierte (und dokumentierte) Prozesse 
haben musst. Das ist nicht per se schlecht, es ist nur initial etwas 
Aufwand, die Prozesse zu etablieren (ich habe das mal mehr beobachtend 
in einer eher kleinen Firma miterlebt).

Meine Kurzzusammenfassung davon war immer: Wenn bei einem solchermaßen 
bestätigten Prozess einmal Schei*** rauskommt, muss der Prozess 
garantieren, dass immer die gleiche Schei*** rauskommt.

von Gerhard O. (gerhard_)


Lesenswert?

Christian B. schrieb:
> Ja, das ist so wie eine "ISO-Zertifizierung" in einem Unternehmen. Das
> dient primär als Zeichen dafür, dass man in so ein Unternehmen nicht
> gehen will.

Das ist nicht immer ihre Schuld. Unsere Kunden bestehen auf ISO 
Zertifikation und das ist eben so.

Wenn man ISO Prinzipien intelligent befolgt, bringt es durchaus 
Vorteile, und dass man sich z.B. darauf verlassen kann, dass die 
Messgeräte kalibriert sind und nützliche Regeln konsistent befolgt 
werden. Es muss nicht unbedingt schlecht sein. Die Einhaltung der selbst 
aufgestellten ISO Prozeduren gibt keine Garantie für Qualität. 
ISO-Regeln machen sie nur konsistent. Abgesehen davon wird das jedes 
Jahr geprüft. Was mich betrifft, finde ich es durchaus ein gutes 
Konzept, solange es intelligent aufgestellt wurde und die Kollegen 
halten sich daran.

Nachtrag: Ich stimme Joerg zu.

: Bearbeitet durch User
von Philipp K. (philipp_k59)


Lesenswert?

Also so für das Hobby, ohne jetzt der Pro werden zu wollen,fand ich nach 
nen paar Jahren Autodidakt das Buch "c++ programmieren: c++ lernen" 
schonmal nicht schlecht.

Das hat mir dann ohne langweilig zu werden noch einige Tips und Kniffe 
gezeigt.

Man kann sich natürlich auch direkt nen Wälzer empfohlen von den 
professionellen Informatikern reinziehen, aber das war mir für meine 
Ziele etwas too much.

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

Tam H. schrieb:
> Alle antiquarisch gut erhaeltlich zuB bei Alibris

und in der Library Genesis http://libgen.rs/

von Steve van de Grens (roehrmond)


Lesenswert?

P. S. schrieb:
> Dann wüsste man z. B. auch, dass die "single point of exit"-Regel
> lediglich "Advisory" ist. Diese Regel also nur eine "Recommendation"
> darstellt, die man nur "as far as reasonable practical" befolgen sollte.

Klingt sinnvoll.

In der Regel bemühe ich mich darum, dass Funktionen nur ein 
erfolgreiches Ende haben (und zwar ganz unten). Aber im Fehlerfall 
dürfen sie auch früher aussteigen.

von Oliver S. (oliverso)


Lesenswert?

Jörg W. schrieb:
> Meine Kurzzusammenfassung davon war immer: Wenn bei einem solchermaßen
> bestätigten Prozess einmal Schei*** rauskommt, muss der Prozess
> garantieren, dass immer die gleiche Schei*** rauskommt.

Und dann kommt noch irgend ein Berater, und lässt den Prozess in 
Software giessen. Damit die gleiche Schxxx sehr viel schneller 
rauskommt.

Oliver

von Steve van de Grens (roehrmond)


Lesenswert?

Gerhard O. schrieb:
> Unsere Kunden bestehen auf ISO Zertifikation und das ist eben so.

Unsere auch. Deswegen kann ich doch nicht einfach das Handtuch werfen.

von Peter D. (peda)


Lesenswert?

Jörg W. schrieb:
> Dann solltest du nie mit MISRA in Berührung kommen, denn die sind der
> Meinung, dass eine Funktion nur einen einzigen Ausgang haben darf.

Man könnte MISRA ja austricksen:
1
  do
2
  {
3
    if ( Errorcase0 )
4
      break;
5
    do_something0();
6
    if ( Errorcase1 )
7
      break;
8
    do_something1();
9
    if ( Errorcase2 )
10
      break;
11
    do_something2();
12
    if ( Errorcase3 )
13
      break;
14
    do_something3();
15
  }
16
  while( 0 );
Statt break geht auch continue, z.B. wenn man per switch abbrechen will.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Peter D. schrieb:
> Man könnte MISRA ja austricksen:
> ...

Auch von mehrfachen Breaks in Schleifenkonstrukten wird in MISRA
abgeraten :)

Mehrfache Returns, mehrfache Breaks und auch Gotos werden in MISRA alle
ähnlich bewertet: Man sollte sie vermeiden, sie sind aber nicht
verboten. Für die Fehlerbehandlung einer längeren Kette von Aktionen
sind oft Gotos zu einem gemeinsamen Ziel ganz praktisch, weil man dann
dort noch eine gemeinsame Abschlussaktion unterbringen kann.

von Philipp K. (philipp_k59)


Lesenswert?

Jörg W. schrieb:
> ISO900x besagt ja nur, dass du definierte (und dokumentierte) Prozesse
> haben musst.

Kann bei alten Strukturen in der Firma aber auch auf "Excel Tabellen 
sind nicht mehr zeitgemäß" und zwingende Umstellung auf ein ERP führen.

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.