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.
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...
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...
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.
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.
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.
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
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.
> 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.
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.
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.
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
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.
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.
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.
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.
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.
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.
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
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.
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.
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++.
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
voidSYSTEM_putchar(uint8_tc);
2
uint8_tSYSTEM_getchar(void);
3
voidSYSTEM_printText(uint8_t*str);
4
voidSYSTEM_waitms(uint32_ttime_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.
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.
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.
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!
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!
> 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.
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.
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.
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.
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.)
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 ).
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.
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.
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.