Forum: PC-Programmierung wiederverwendbare Software in C


von Marcus (Gast)


Lesenswert?

Im Moment beschäftige ich mich damit, wiederverwendbare Software-Module 
zu schreiben.

Dazu habe ich ein Buch gefunden:
http://www.amazon.de/Interfaces-Implementations-Techniques-Addison-Wesley-Professional/dp/0201498413
Es scheint schon ein wenig älter, kennt es jemand?

: Verschoben durch Admin
von Karl H. (kbuchegg)


Lesenswert?

Marcus schrieb:

> Es scheint schon ein wenig älter,

ist völlig egal.
C ist ja auch schon älter. Nach 1999 ist da auch nichts dazu gekommen, 
was dir bei der Thematik irgendwie grossartig weiter helfen würde. D.h. 
wenn du den Buch-Stand von 1999 umsetzen kannst, dann bist du in dieser 
Thematik ziemlich 'state of the art' oder zumindest dicht drann.

Die Rezensionen sind ja recht gut.

Und abgesehen davon, würde ich aus dem Hause "Addison-Wesley 
Professional Computing" so ziemlich alles auch unbesehen kaufen.

: Bearbeitet durch User
von Mathias O. (m-obi)


Lesenswert?

Das Buch klingt sehr interessant. In welchen Applikationen kommt den 
wiederverwendbare Software vor?  I/O-Module?

von Querleser (Gast)


Lesenswert?

Habe das Buch gerade mal quergeblättert. Der Titel ist irreführend, 
meiner Meinung nach.

Das Buch ist quasi eine gedruckte Form einer Utility-Bibliothek, mit 
Dingen wie Listen, Sets, String-Funktionen, Threads und noch einige 
anderen, auch etwas ungewöhnlicheren Dingen. Ja, die einzelnen 
Funktionen sind ausführlich beschrieben etc. Aber es geht in diesem Buch 
genau nicht darum, wie man ein gutes Interface schreibt etc. Es wird nur 
Source-Code besprochen.

50 Kröten dafür? Never. Suchmaschine und trojanerresistenten Browser auf 
einem virenfesten Betriebssystem bemühen...

von Noch einer (Gast)


Lesenswert?

Und damit sind wir mitten in einem ganz düsteren Thema.

Da finde ich 3 Module mit hervorragendem Interface, die genau das 
machen, was ich brauche. Ließe sich für das aktuelle Projekt 
wiederverwenden, aber alle 3 Module benutzen unterschiedliche Ansätze 
für Listen, Sets und String-Funktionen.

Hätte sich damals nur eines dieser Bücher durchgesetzt...

von W.S. (Gast)


Lesenswert?

Marcus schrieb:
> Im Moment beschäftige ich mich damit, wiederverwendbare Software-Module
> zu schreiben.

Das ist brotlose Kunst.
Laß es lieber und programmiere was vernünftiges.

Mich erinnert das an das, was man seit Jahren auf der Embedded sehen 
kann: 99 Ingenieurbüros, die irgendwelche wiederverwendbare 
Hardware-Module anbieten und nach Anwendungen suchen. Habe Lösung, suche 
Anwendung für meine Lösung.

So herum wird das nix.

Meine Erfahrung ist, daß sich wiederverwendbares Zeugs von selbst 
ergibt, wenn man ein konkretes Projekt sinnvoll modularisiert. Letzteres 
(das sinnvolle Modularisieren) ist viel wichtiger als der Vorsatz, 
Wiederverwendbare Module schreiben zu wollen ohne selbige selbst im 
konkreten Projekt zuvor eingesetzt zu haben.

W.S.

von Noch einer (Gast)


Lesenswert?

> wenn man ein konkretes Projekt sinnvoll modularisiert.

Gibt es Bücher, aus denen man so etwas lernen kann? Oder geht das nur 
aus Erfahrung?

von M. K. (sylaina)


Lesenswert?

Querleser schrieb:
> 50 Kröten dafür? Never. Suchmaschine und trojanerresistenten Browser auf
> einem virenfesten Betriebssystem bemühen...

Naja, und dann viel Spass beim Suchen. Ich denke, wenn man sich wirklich 
ernsthaft mit dem Thema beschäftigen will und es nutzen will haben sich 
die 50 Kröten fix amortisiert.

von Karl H. (kbuchegg)


Lesenswert?

Noch einer schrieb:
>> wenn man ein konkretes Projekt sinnvoll modularisiert.
>
> Gibt es Bücher, aus denen man so etwas lernen kann? Oder geht das nur
> aus Erfahrung?

Letzten Endes ist vieles davon Erfahrung. Die Suche nach Kochrezepten 
für Kreativität geht in der Informatik regelmässig in die Hose. Aber 
auch anders rum: viele anerkannte Regeln sind von der Form, dass man 
auch im angemessenen Fall die Regel über Bord wirft. Die Frage ist nur: 
was ist 'angemessen'? Womit wir wieder bei Erfahrung sind.

Es hilft allerdings, wenn man anderer Leute Code studiert und sich 
ansieht wie die das gemacht haben. Besonders gut ist es natürlich, wenn 
der Autor dann auch noch erklärt, warum er so manche Designentscheidung 
gemacht hat und warum er sich gegen welche anderen Alternativen 
entschieden hat.

Alle Regeln bzw. Grundgedanken wird man nicht von Anfang an beherzigen 
können, weil man sich die gar nicht merken kann. Zudem ist jeder Fall 
anders gelagert und sei es nur in Details. Womit wir wieder beim Thema 
'Erfahrung' sind.

Ein nicht unwesentlicher Punkt beim Thema Erfahrung sind auch die 
Fehler, die man selber macht.
Es gibt einen alten Spruch: Ein erfahrener Programmierer unterscheidet 
sich von einem unerfahrenen dadurch, dass er alle Design-Fehler, die der 
unerfahrene in den nächsten 10 Jahren machen wird, alle schon mindestens 
einmal gemacht und beseitigt hat.
Das heisst so viel wie: Du musst Fehler machen. Du musst sehen, wie 
sich ein Design-Fehler auswirkt. Du musst dich selbst ein paar mal in 
die Ecke manövriert und dich mühsam wieder aus dieser rausmanövriert 
haben, um in Zukunft den Braten rechtzeitig zu riechen. Kein Handbuch 
kann dir diese Erfahrung geben. Es kann dir Anregungen geben, es kann 
dich bis zu einem gewissen Grad leiten. Es kann dir recht 
offensichtliche Designfehler vorführen und auch das Gegenteil. Aber es 
wird nie so sein, dass du nur dieses eine Buch zu lesen brauchst und 
dann bist du perfekt.

: Bearbeitet durch User
von Falk S. (db8fs)


Lesenswert?

Ich kenn obiges Buch leider nicht, kann Dir aber das "Test-Driven 
Development for Embedded C" von J. Grenning nahe legen. Legt sehr viel 
Wert auf CleanCode und Interface-Driven-Development. Als Interfaces 
werden dabei Funktionspointertypen verwendet - die implementierten 
Funktionen, die diesem Typ entsprechen, werden dann austauschbar gemäß 
dem Strategiemuster. Ich fand's 'nen sehr interessanten Ansatz - ist 
aber letztlich das, was C++ unter der Haube bei den VTables auch macht. 
Wer aber auf reine ANSI-C-Entwicklung angewiesen ist und versuchen 
möchte, Design-Patterns prozedural anzuwenden um SOLIDen Code zu 
produzieren, dem sei das TDD-Buch durchaus zu empfehlen:

http://www.amazon.de/Driven-Development-Embedded-Pragmatic-Programmers/dp/193435662X/ref=pd_sim_14_3?ie=UTF8&refRID=0FMP5QRX2FSFZXE4PFWZ

von Christian B. (casandro)


Lesenswert?

Also der Klassiker, den man zumindest mal gelesen haben sollte ist "The 
Art of UNIX Programming". Das Buch gibts selbstverständlich auch vom 
Autor online. Das stellt im Prinzip vor, wie denn Wiederverwendung unter 
UNIX gemacht wird.

von Noch einer (Gast)


Lesenswert?

> Ich fand's 'nen sehr interessanten Ansatz

Das Problem bei den interessanten Ansätzen ist leider - es gibt so viele 
interessante Ansätze, die nicht zusammen passen.

Gerade weil eine Komponente einen genialen Ansatz hat, der nicht mit dem 
langweiligen Rest zusammen arbeitet, kann man sie nicht wieder 
verwenden.

von W.S. (Gast)


Lesenswert?

Noch einer schrieb:
> Gibt es Bücher, aus denen man so etwas lernen kann? Oder geht das nur
> aus Erfahrung?

Bücher?

Hör mal: Erfahrung ist keine Handelsware. Man muß sie selber machen. 
Ein jeder für sich.

Aber es hilft vielleicht, wenn man mal aus dem Nähkästchen plaudert und 
wenn einem dabei zugehört wird.

Ein Beispiel:
Mich hatte schon vor Ewigkeiten sowas wie sprintf und Konsorten 
geärgert. Warum? weil man einerseits völlig unnütze Formatstrings in den 
knappen Speicher von µC einbauen mußte (und weil C im Gegensatz zu 
Pascal keinerlei Literalsharing kennt) und andererseits einen fetten 
Textinterpreter noch dazu, der diese Formatstrings auswertet. Obendrein 
mußte das Ergebnis ja erstmal in einen RAM-Bereich hinein, entweder auf 
den knappen Stack oder noch schlimmer in statische RAM-Arrays - oder 
(noch viel schlimmer) in per malloc und so akquirierten RAM.

Kurzum, das übliche C-Verfahren ist auf µC einfach nur gequirlte Sch***, 
weil es in diese Sprache eben keine Auflösung komplexerer Funktionen zur 
Compilierzeit gibt (Gegensatz: write bei Pascal).

Also schrieb ich mir vor wirklich langer Zeit einen Unit "conv.c", der 
die wichtigsten Konvertierungen enthält und den ich zusammen mit sowas 
wie String_Out(String, wohin) verwenden konnte, OHNE Formatstrings und 
Interpreter in die Firmware hineinlinken zu müssen. Zu Zeiten, wo 64K 
Flash die Obergrenze war, war das äußerst hilfreich.

Tja, dieses Stück Quellcode hat überlebt, hat diverseste µC Generationen 
gesehen - 8 und 16 und 32 Bit, BigEndian und LittleEndian, ist 
währenddessen auch mächtiger geworden (int64 usw) und ich benutze es 
immer noch. Eas war nie geplant, sowas als "wiederverwertbaren 
Softwaremodul" u schreiben, sondern es hat sich eben so ergeben. So 
herum läuft es.

Ein ähnliches Stück Software sind meine Fonts und mein GDI, was 
mittlerweile in Color-Version und B/W-Version und (Lernbetty) in 4 
Stufen Grau-Version auf untershiedlichsten Systemen und mit 
unterschiedlichsten Displays läuft. Das war auch nie als Universal-GDI 
geplant, aber wenn man die Fundamente sinnvoll gelegt hat, kommt sowas 
fast wie von selbst.

Ein putziges Beispiel am Rande: manchmal findet man den gleichen 
Peripherie-Core in Konkurrenzprodukten: Als ich meinen SDIO-Treiber für 
die LPC24xx fertig hatte und selbiges auch für die STM32F1xx anfing, 
fiel mir auf, daß die Cores fast gleich sind und der einzige Unterschied 
die Adressen und die Bezeichnungen sind (MCI_xxx versus SDIO_xxx). So 
paßte der NXP-Treiber nach Adreß- und Namenskorrektur perfekt auch auf 
die STM32 drauf.

Bei anderen, eher hardwarenahen Teilen zählt die Erfahrung: Wer einen 
gepufferten per Interrupt organisierten UART-Treiber für einen Prozessor 
mal geschrieben hat, der kann das in 99% aller Fälle auch für andere 
Prozessoren in gleicher Weise tun. Die Namen der Interrupt-Handler mögen 
sich unterscheiden, aber die Herangehensweise ist gleich. Genau dasselbe 
gilt auch für sowas wie das hinlänglich hier diskutierte Entprellen von 
Tasten.

W.S.

von Marcus (Gast)


Lesenswert?

W.S. schrob:
>Bücher?
>Hör mal: Erfahrung ist keine Handelsware. Man muß sie selber machen.
>Ein jeder für sich.

Erfahrung ist der Weisheit bitterster Weg.

von 7856ujtzuitzu (Gast)


Lesenswert?

Querleser schrieb:
> Habe das Buch gerade mal quergeblättert. Der Titel ist
> irreführend,
> meiner Meinung nach.
>
> Das Buch ist quasi eine gedruckte Form einer Utility-Bibliothek, mit
> Dingen wie Listen, Sets, String-Funktionen, Threads und noch einige
> anderen, auch etwas ungewöhnlicheren Dingen. Ja, die einzelnen
> Funktionen sind ausführlich beschrieben etc. Aber es geht in diesem Buch
> genau nicht darum, wie man ein gutes Interface schreibt etc. Es wird nur
> Source-Code besprochen.
>
> 50 Kröten dafür? Never. Suchmaschine und trojanerresistenten Browser auf
> einem virenfesten Betriebssystem bemühen...

also ich war erschrocken ...
dieser ratschlag zieht mal wirklich

wenn man die google suche bemüht resultiert ein link zu einer PDF die 
witzigerweise das buch enthält
gleich darunter ein github link mit scheinbar allen sourcen


und das nur weil man sucht und mal wissen will ob das buch jemand kennt

von Walter T. (nicolas)


Lesenswert?

7856ujtzuitzu schrieb:
> wenn man die google suche bemüht resultiert ein link zu einer PDF die
> witzigerweise das buch enthält

Und Frank Liu wird vermutlich jede Menge Ärger bekommen.

von Peter D. (peda)


Lesenswert?

W.S. schrieb:
> Mich hatte schon vor Ewigkeiten sowas wie sprintf und Konsorten
> geärgert.

Als erfahrener Programmierer sollte man aber auch alte Vorurteile 
revidieren können, denn nichts ist in Stein gemeißelt.
Die Zeit ist ja seit 1980 beim 8051 mit 4kB PROM und 128Byte RAM nicht 
stehen geblieben.
Z.B. ein im gleichen DIP-40 Gehäuse sitzender ATmega1284 hat 128kB Flash 
und 16kB RAM.
Ich habe früher auch mal printf/scanf und float gemieden, aber 
heutzutage muß man das nicht mehr.
Auch sind die C-Compiler deutlich besser geworden und lehren so manchen 
Assembler-Fan das Fürchten.

: Bearbeitet durch User
von Route_66 H. (route_66)


Lesenswert?

Peter D. schrieb:
> Auch sind die C-Compiler deutlich besser geworden und lehren so manchen
> Assembler-Fan das Fürchten.

Wie kommst Du darauf, das sich Assewmbler Fans für C überhaupt 
interessieren?
Einem eingefleichten Kite-Surfer ist es Wurst (sorry, Herr Conchita!), 
ob die Rennräder immer besser werden.
Das sind zwei verschiedene Dinge, die überhaupt nicht vergleichbar sind. 
Das bringt jemand weder zum Lächeln, noch zum Fürchten.

von Peter D. (peda)


Lesenswert?

Route 6. schrieb:
> Wie kommst Du darauf, das sich Assewmbler Fans für C überhaupt
> interessieren?

Das nicht, aber sie merken, daß sich damit kein Geld mehr verdienen 
läßt.
Assembler ist nur noch in der Hobby-Nische vorhanden.

von xXx (Gast)


Lesenswert?

Und genauso wie die Assembler-Fans ihren verlorenen Posten gegenueber C 
verteidigt haben, tun es nun die C-Fans gegenueber C++ - nur mit noch 
schlechteren Argumenten.

von Noch einer (Gast)


Lesenswert?

Falls du mit "verlorenen Posten" den verloren gegangen bezahlten 
Arbeitsplätze meinst.

Erstaunlicherweise lässt sich aus keiner der widersprüchlichen Statisten 
ableiten, C würde von C++ verdrängt. Sieht eher so aus, als würden neue 
Sprachen wie C# oder Ruby die alten verdrängen.

von Mark B. (markbrandis)


Lesenswert?

Noch einer schrieb:
>> Ich fand's 'nen sehr interessanten Ansatz
>
> Das Problem bei den interessanten Ansätzen ist leider - es gibt so viele
> interessante Ansätze, die nicht zusammen passen.
>
> Gerade weil eine Komponente einen genialen Ansatz hat, der nicht mit dem
> langweiligen Rest zusammen arbeitet, kann man sie nicht wieder
> verwenden.

Dafür gibt es das Adapter Pattern bzw. Wrapper. ;-)

xXx schrieb:
> Und genauso wie die Assembler-Fans ihren verlorenen Posten gegenueber C
> verteidigt haben, tun es nun die C-Fans gegenueber C++ - nur mit noch
> schlechteren Argumenten.

Sieht das hier für Dich nach verlorenem Posten aus?

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

: Bearbeitet durch User
von Jay (Gast)


Lesenswert?

xXx schrieb:
> Und genauso wie die Assembler-Fans ihren verlorenen Posten gegenueber C
> verteidigt haben, tun es nun die C-Fans gegenueber C++ - nur mit noch
> schlechteren Argumenten.

Es ist eher umgekehrt. Die C++-Fans machen lautstark Rabatz weil die 
Zukunft wie sie sie gerne hätten einfach nicht kommen möchte. Es gibt 
ganz objektive Gründe warum sie nicht kommt, aber das lohnt sich nicht 
hier auszubreiten.

von Klaus W. (mfgkw)


Lesenswert?

Jay schrieb:
> s ist eher umgekehrt. Die C++-Fans machen lautstark Rabatz weil die
> Zukunft wie sie sie gerne hätten einfach nicht kommen möchte. Es gibt
> ganz objektive Gründe warum sie nicht kommt, aber das lohnt sich nicht
> hier auszubreiten.

Es scheint noch nicht überall bekannt zu sein, daß C++ bereits verwendet 
wird.

von Karl Käfer (Gast)


Lesenswert?

Klaus W. schrieb:
> Jay schrieb:
>> s ist eher umgekehrt. Die C++-Fans machen lautstark Rabatz weil die
>> Zukunft wie sie sie gerne hätten einfach nicht kommen möchte. Es gibt
>> ganz objektive Gründe warum sie nicht kommt, aber das lohnt sich nicht
>> hier auszubreiten.
>
> Es scheint noch nicht überall bekannt zu sein, daß C++ bereits verwendet
> wird.

Kommt Zeit, kommt C++.

von chris_ (Gast)


Lesenswert?

Wie wäre es mit ein wenig Praxis?

Bei MCs verwende ich immer folgendes Verfahren für meine 
"wiederverwendbaren" Module:

Ich mache mir eine Schnittstellenbeschreibung als "system_io.h" file.
In dieser Datei stehen dann die Schnittstellen
1
void      SYSTEM_putchar(uint8_t c);
2
uint8_t   SYSTEM_getchar(void);
3
void      SYSTEM_printText(uint8_t * str);
4
void      SYSTEM_waitms(uint32_t time_ms);
5
..

Die Runtime-Umgebung muss dann diese "Requested Interfaces" zur 
Verfügung stellen.
Üblicherweise ist das bei mir eine Simulationsumgebung auf dem PC um die 
Routinen schnell zu testen und dann mehrere Microcontroller Derivate.

von W.S. (Gast)


Lesenswert?

Peter D. schrieb:
> Als erfahrener Programmierer sollte man aber auch alte Vorurteile
> revidieren können, denn nichts ist in Stein gemeißelt.

Als noch erfahrenerer Programmierer hat man Urteile und keine 
Vorurteile.

Mal im Klartext: Manche Dinge passen in eine bestimmte Umgebung und sind 
deplaziert in einer anderen Umgebung. Und hier ging es um ein Stück 
Beispielquelle, das sich zumindest bei mir bewährt hat. Aber das ist 
mein Bier und andere halten es anders:

chris_ schrieb:
> In dieser Datei stehen dann die Schnittstellen
> void      SYSTEM_putchar(uint8_t c);
> uint8_t   SYSTEM_getchar(void);
> void      SYSTEM_printText(uint8_t * str);
> void      SYSTEM_waitms(uint32_t time_ms);

Siehst du, so macht sich ein jeder sein Zeugs zurecht und sammelt seine 
Erfahrungen selbst. Ob ich den stil von Chris mögen würde, ist was 
anderes, ich hätte an seiner Stelle mir nen Unit gemacht, der sowas wie 
ne E/A-Weiche ist. Damit braucht man im Hauptteil der Firmware nichts 
mehr zu ändern, wenn man E/A-Ströme auf verschiedene Kanäle lenken will.

Also z.B. SYSTEM_PutChar(char c, int DeviceID);

btw: was soll eigentlich der bellende Unsinn, für eine ZEICHEN - 
Ausgabe einen uint8_t zu nehmen??? Dort gehört ein simpler char hinein, 
es sei denn man braucht 16 Bit Unicode, wo dann ein TCHAR oder so 
ähnlich hingehören würde. Die jungen Leute denken einfach nicht mehr 
nach oder haben vor lauter Umdefiniererei den Boden unter den Füßen 
verloren.


W.S.

von F. F. (foldi)


Lesenswert?

Karl H. schrieb:
> Und abgesehen davon, würde ich aus dem Hause "Addison-Wesley
> Professional Computing" so ziemlich alles auch unbesehen kaufen.

Möchte ich mal unterstreichen. Alle Bücher von denen waren 
ausgesprochen gut.

von Tcf K. (tcfkao)


Lesenswert?

Falk S. schrieb:
> Ich kenn obiges Buch leider nicht, kann Dir aber das "Test-Driven
> Development for Embedded C" von J. Grenning nahe legen. Legt sehr viel
> Wert auf CleanCode und Interface-Driven-Development. Als Interfaces
> werden dabei Funktionspointertypen verwendet - die implementierten
> Funktionen, die diesem Typ entsprechen, werden dann austauschbar gemäß
> dem Strategiemuster. Ich fand's 'nen sehr interessanten Ansatz - ist
> aber letztlich das, was C++ unter der Haube bei den VTables auch macht.
> Wer aber auf reine ANSI-C-Entwicklung angewiesen ist und versuchen
> möchte, Design-Patterns prozedural anzuwenden um SOLIDen Code zu
> produzieren, dem sei das TDD-Buch durchaus zu empfehlen:

[Link mit Copyright-Verstoß gelöscht]

Vortrag dazu:
http://www.odd-e.com/material/2012/08_tdd_in_c/tddec.pdf

Übrigens sehr interessanter Thread!

: Bearbeitet durch Moderator
von OldMan (Gast)


Lesenswert?

Tcf K. schrieb:
> Ist auch als PDF "verfügbar":
> [Link mit Copyright-Verstoß gelöscht]

Dass dieser Beitrag noch nicht gelöscht ist verwundert mich.
Als ich mal einen Link auf eine Universitätsseite mit einem freien 
PDF-Dokument angegeben habe, wurde der gleich wie gelöscht.
Tja, so sind sie eben die lieben Menschen.
Keine festen Regeln!

: Bearbeitet durch Moderator
von Carl D. (jcw2)


Lesenswert?

> Sieht das hier für Dich nach verlorenem Posten aus?
>
> http://www.tiobe.com/index.php/content/paperinfo/t...

Bei Statistiken muß man halt immer schauen, wo die Daten herkommen.
In diesem Fall werden Sprachen hoch ge-rated, die bei u.A. bei Google 
und Youtube häufig erwähnt werden.
Man könnte mit gleicher Sicherheit auch sagen, das sind die, die die 
meisten Probleme machen. Genau so gut könnten das die beliebtesten 
Sprachen sein. Betonung liegt jeweils auf könnte.
Seriöse Statistiken würden die Anzahl Stellenausschreibungen, Projekte, 
oder auch LineOfCode verwenden. Denn das zu wissen, damit werben die 
groß.
So hat man eher den Verdacht, daß es hauptsächlich um "Werbe-Clicks" 
geht.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

OldMan schrieb:
> Dass dieser Beitrag noch nicht gelöscht ist verwundert mich.

Jetzt issers.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Querleser schrieb:
> Habe das Buch gerade mal quergeblättert. Der Titel ist irreführend,
> meiner Meinung nach.
>
> Das Buch ist quasi eine gedruckte Form einer Utility-Bibliothek, mit
> Dingen wie Listen, Sets, String-Funktionen, Threads und noch einige
> anderen, auch etwas ungewöhnlicheren Dingen.

Ich habe das Buch auch mal überflogen und komme zu einem ähnlichen
Ergebnis:

Die 24 behandelten Interfaces sind wohl eher als Beispiele für die
Umsetzung zu sehen. Was allerdings viel zu kurz kommt, ist eine
Erläuterung, warum die Interfaces in der beschriebenen Form "gut" sind
und wie im Vergleich dazu "schlechte" Interfaces aussehen würden.
Stattdessen wird der Schwerpunkt auf die jeweilige Implementation
gelegt.

Da anfangs auch von abstrakten Datentypen die Rede ist (die ja in engem
Zusammenhang mit Interfaces stehen), hätte ich eigentlich ein paar
Vorgehensweisen zu deren Einsatz in der generischen Programmierung
erwartet, was auch den Bogen zu der im Vorwort erwähnten
Wiederverwendung von Softwaremodulen geschlossen hätte.

Andererseits muss man sagen, dass die behandelten Softwaremodule
größtenteils sehr elegant implementiert sind, so dass sie zumindest
implementierungstechnisch ein gutes Beispiel für den angehenden
C-Programmierer darstellen. Insofern ist das Buch nicht für die Katz,
wenn es nur einen anderen Titel hätte. Mit dem aktuellen Titel wird es
aber vermutlich von den falschen Leuten gekauft.

von Mikro 7. (mikro77)


Lesenswert?

W.S. schrieb:
> btw: was soll eigentlich der bellende Unsinn, für eine ZEICHEN -
> Ausgabe einen uint8_t zu nehmen??? Dort gehört ein simpler char hinein,

Ich habe mir ebenfalls angewöhnt, mit uint8_t als Basis bei der Daten 
De/Serialisierung zu arbeiten.

Hat da jemand tatsächlich schon Mal 'ne Weiche im Code gebaut für !=8 
Bit char?! Mag ich gar nicht dran denken.

Der Typ char ist imho auch "verwirrend". Mir fällt auf aktuellen 
Systemen keine vernünftige Anwendung ein. Vielleicht weiß hier jemand 
wie char -- zusätzlich zu signed/unsigned char -- entstanden ist.

von Klaus W. (mfgkw)


Lesenswert?

Was ist daran verwirrrend?
char ist genau dafür da: ein Zeichen zu speichern und ggf. auf ==0 oder 
!=0 zu testen.

Da interessiert mich das Vorzeichen nicht.

Nimmt jemand dafür int8_t oder uint8_t, fragt sich der geneigte Leser 
wieso mit diesem Typ gerechnet werden soll (nur dann wäre signed oder 
unsigned überhaupt sinnvoll).

Schreibt man char, drückt man klar aus, worum es geht: Zeichen.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

S. J. schrieb:
> W.S. schrieb:
>> btw: was soll eigentlich der bellende Unsinn, für eine ZEICHEN -
>> Ausgabe einen uint8_t zu nehmen??? Dort gehört ein simpler char hinein,
>
> Ich habe mir ebenfalls angewöhnt, mit uint8_t als Basis bei der Daten
> De/Serialisierung zu arbeiten.

Für Binärdaten ist das auch ok, aber nicht für Text.
Bei putchar steht das char ja schon im Namen. Da kommt es etwas 
überraschend, daß dann statt eines char ein uint8_t ge"puttet" wird. 
Warum heißt die Funktion dann nicht putuint8_t?

> Der Typ char ist imho auch "verwirrend". Mir fällt auf aktuellen
> Systemen keine vernünftige Anwendung ein. Vielleicht weiß hier jemand
> wie char -- zusätzlich zu signed/unsigned char -- entstanden ist.

Das wurde in letzter Zeit öfters hier im Forum durchgekaut:

Wenn du Text brauchst, nimm char.
Wenn du einen möglichst kleinen Integer brauchst, nimm [un]signed char.
Wenn du einen Integer brauchst, der zwingend exakt 8 Bit breit sein muß, 
nimm uint8_t.
Wenn du einen möglichst effizient zu verarbeitenden Integer brauchst, 
der mindestens 8 Bit breit ist, nimm uint_fast8_t.
Wenn du einen möglichst kleinen Integer mit mindestens 8 Bit brauchst, 
nimm uint_least8_t. (Bringt bei 8 Bit noch nicht so viel. Die 
*_least*-Typen werden erst bei meht als 8 Bit wirklich interessant.)

von chris_ (Gast)


Lesenswert?

W.S. schrieb:
>btw: was soll eigentlich der bellende Unsinn, für eine ZEICHEN -
>Ausgabe einen uint8_t zu nehmen??? Dort gehört ein simpler char hinein,
>es sei denn man braucht 16 Bit Unicode, wo dann ein TCHAR oder so
>ähnlich hingehören würde. Die jungen Leute denken einfach nicht mehr
>nach oder haben vor lauter Umdefiniererei den Boden unter den Füßen
>verloren.

Tja, wie war das noch mal gleich mit der Erfahrung? Der eine hat sie, 
der andere nicht.
Üblicherweise ist der Typ "char" als "sint8_t" definiert. Manche 
Compiler bieten allerdings die Option "char" als "int8_t" 
umzudefinieren. Da das in einem der Projekte an denen ich mitgeabeitet 
habe, der Fall war, gab es lange Suchaktionen der ganzen Manschaft nach 
einem Fehler der durch ein Stück Code von einem der Programmierer 
entstand. Deshalb hege ich eine inherente Abneigung gegen "unscharfe" 
Datentypen ( übrigens auch gegen Besserwisser ).

von Peter D. (peda)


Lesenswert?

Klaus W. schrieb:
> char ist genau dafür da: ein Zeichen zu speichern und ggf. auf ==0 oder
> !=0 zu testen.
>
> Da interessiert mich das Vorzeichen nicht.

Ja, das sorgt regelmäßig für Spaß bei den Programmierern.
Warum funktioniert denn das verdammte Mapping der Umlaute von ASCII nach 
LCD nicht?
Bis man endlich dahinter kommt, daß Umlaute negativ sind.
Oder man hat im String mehrbytige Zahlen, die jedes Byte sign extended 
nur Mumpitz ergeben.

Also immer bei Rechnungen und Vergleichen mit Strings erstmal alles nach 
uint8_t casten.
Hätte man wirklich besser machen sollen.

von Mikro 7. (mikro77)


Lesenswert?

Rolf M. schrieb:
> Für Binärdaten ist das auch ok, aber nicht für Text.

Gerade für "Text" wäre die Definition als unsigned char völlig 
ausreichend gewesen.

von Mikro 7. (mikro77)


Lesenswert?

Weil's mich interessiert, habe ich es mal hier weitergeführt:

Beitrag "C Language: char vs. signed char vs. unsigned char"

von Rolf M. (rmagnus)


Lesenswert?

chris_ schrieb:
> Deshalb hege ich eine inherente Abneigung gegen "unscharfe"
> Datentypen ( übrigens auch gegen Besserwisser ).

Ich wäre auch eher dafür gewesen, char fix als signed festzulegen, da es 
letztendlich auch nur genau so ein Integer-Typ ist, wie die anderen. Und 
bei allen Integertypen ist eindeutig definiert, daß sie ohne explizite 
Angabe signed sind, außer eben bei char. Damit ist das nicht konsistent 
umgesetzt.
Deine Abneigung sollte sich übrigens auch gegen Programmierer richtgen, 
die mit den Datentypen nicht richtig umgehen können. Und nein, das hat 
nichts mit Besserwisserei zu tun. Es ist nur so, daß wenn jemand ein 
Werkzeug nicht richtig benutzt, das nicht immer die Schuld des Werkzeugs 
ist.

S. J. schrieb:
> Rolf M. schrieb:
>> Für Binärdaten ist das auch ok, aber nicht für Text.
>
> Gerade für "Text" wäre die Definition als unsigned char völlig
> ausreichend gewesen.

Gerade für Text ist es aber eigentlich auch egal.

Peter D. schrieb:
> Klaus W. schrieb:
>> char ist genau dafür da: ein Zeichen zu speichern und ggf. auf ==0 oder
>> !=0 zu testen.
>>
>> Da interessiert mich das Vorzeichen nicht.
>
> Ja, das sorgt regelmäßig für Spaß bei den Programmierern.
> Warum funktioniert denn das verdammte Mapping der Umlaute von ASCII nach
> LCD nicht?

Da wurde die nötige Konvertierung vom Text-Typ in den Registerwert 
vergessen.

> Also immer bei Rechnungen und Vergleichen mit Strings erstmal alles nach
> uint8_t casten.

Warum sollte man bei Vergleichen irgendwas casten müssen?
Und die Rechnungen braucht man nur an der einen Schnittstelle zwischen 
der eigentlichen Funktionalität des Programms und der Lowlevel-I/O. Von 
"immer" würde ich da nicht sprechen, denn das sollte eigentlich nur pro 
Hardware-Einheit, an die Text ausgegeben werden soll, genau an einer 
Stelle passieren.

> Hätte man wirklich besser machen sollen.

Ja. Man hätte komplett getrennte Typen für Text und Integer definieren 
sollen, genau so, wie z.B. in Pascal: char nur für Text und ohne 
irgendwelche signed/unsigned-Varianten und ohne direkten Zugriff auf den 
internen Zahlenwert. Und dann einen Typ byte, den's mit oder ohne 
Vorzeichen gibt. Zur Konvertierung zwischen Text und Integer dann pro 
Richtung eine Funktion.
In C kann (und sollte) man es eigentlich auch entsprechend diesem 
Prinzip machen, aber das erfordert eben etwas mehr Disziplin, da die 
Sprache es nicht erzwingt.

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.