Hallo,
Bin noch ein Blutiger Anfänger in der Sprache C. Ich habe mein Display
nun mit der Lib (Beitrag "GLCD Routinen ( KS0108, HD61202 )") zum laufen
gebracht.
Einfache Textausgaben wie etwa:
1
lcd_set_cursor(75,LINE0);
2
lcd_puts_p(med_font,PSTR("Hauptmenu"));
geht schon ganz gut. Doch was ich nicht verstehe, bzw. wie kann ich eine
String Variable oder int Variable aus geben.
Wenn ich z.B. folgendes mache:
1
intcount;
2
3
count=0;
4
5
while(1)
6
{
7
8
lcd_set_cursor(75,LINE4);
9
lcd_putc(med_font,count);
10
11
count=count+1;
12
for(loop=0;loop<=100;loop++,_delay_ms(20));
13
}
geht der die gesamte ASCii Tabelle durch. Wie kann ich nun es so machen,
dass mir am Display nur der int wert hochgezählt wird (1,2,3,4…usw)
Vielen Dank im Voraus
Das allgemeine Thema ist die Repräsentation von Daten und ihre
Interpretation.
Vermutlich weisst Du einiges von dem folgenden schon:
1. Alle Daten werden mindestens als Folgen von 0 und 1 repräsentiert.
Ich schreibe "mindestens" weil noch andere Repräsentationen existieren.
Dazu weiter unten mehr.
2. Solche Folgen werden je nach Zweck und Nutzen zu 8, zu 16, zu 32 Bit
gruppiert. Diese Gruppen werden als "Byte" (8-Bit) oder "Wort" (16 und
32-Bit oder mehr) bezeichnet.
Bemerkung: Der Terminus "Wort" wird (etwas verwirrend für Anfänger)
sowohl als ein Überbegriff für eine beliebige Anzahl (oft aber
Zweierpotenzen) von Bits als auch für eine bestimmte (aber durch
Konvention festgelegte) Anzahl von Bits angewendet.
3. Die Bezeichnungen Byte, Wort etc. sagen für sich nichts über die
Interpretation der Bit-Gruppe aus. Mit Interpretation ist hier gemeint,
das eine Festlegung gemacht wird, ob eine 0 nun "Regen" oder
"Sonnenschein" bedeutet, welche 1 an welcher Stelle der Folge von Bits
nun welchem Zahlenwert eines Stellenwertsystems entspricht. (Siehe
"Stellenwertsystem").
4. Die Interpretation eines Bytes kann z.B. sein
4.a. Eine vorzeichenlose, ganze (natürliche) Zahl zwischen 0 und 255
4.b. Eine vorzeichenbehaftete, ganze (natürliche) Zahl zwischen -255 und
+254.
4.c. Ein sog. ASCII-Zeichen: Buchstaben, Zahlzeichen, Satzzeichen etc.
4.d. Eine andere Interpretation die durch den Benutzer festgelegt wird.
5. In der Programmiersprache C existieren Bezeichner für weitere
Interpretationen von Bitgrupppen. Z.B. "int" oder "char".
Ein "int" ist nach dem Standard erstmal nur eine vorzeichenbehaftete
Zahl. Ein "char" ein "Zeichen".
6. Welche genaue Folge von 0 und 1 nun welcher ganzen positiven Zahl
bzw. einem lateinischem Buchstaben, Zahlzeichen zugeordnet ist, ist an
sich willkürlich. Dennoch folgen diese Festlegungen in der weitaus
überwiegenden Zahl von Fällen (also Computern bzw. Programmiersprachen)
bestimmten, allgemein bekannten Konventionen.
So werden etwa die Bits eines "int", entsprechend eines
Stellenwert-Systems als
eine ganze positive oder negative Zahl interpretiert.
Analog werden die selben Bits, aber nunmehr als "char" deklariert,
entsprechend der sog. ASCII-Tabelle als lateinische Buchstaben,
Zahlzeichen etc. interpretiert.
Welchen Wertebereich genau ein Typbezeichner beschreibt ist aus der
Beschreibung der Sprache C und des Compilers ersichtlich. (Letzteres ist
wichtig, weil die Definition der Sprache C in einigen Fällen dem
Compiler-Programmierer überlässt, welchen Wertebereich er als einen
bestimmten Typ bezeichnen will).
8. Ebenso ist die Folge von 0 und 1 eine der möglichen Repräsentationen.
Aber sie ist die primitivste. Eine andere, oft verwendete ist die
sogenannte Hexa-Dezimal-Zahl. Dabei wird letztlich nur ein anderes
Stellenwertsystem und ein (gegenüber den üblichen arabischen
Zahlzeichen) erweiterter Satz von Zahlzeichen verwendet.
7. Aus dem unter 6. beschriebenen folgt, dass ein und die selbe Folge
von 0en und 1en einmal als natürliche, ganze Zahl und ebenso als
ASCII-Zeichen interpretiert und repräsentiert werden können.
Zum Beispiel, kann die Folge
von Bits 00110000 als Hexadezimalzahl 0x30, als positive Dezimalzahl 48,
als vorzeichenbehaftete Dezimalzahl +48 und als das ASCII-Zeichen '0'
repräsentiert werden.
Wohlgemerkt: Es handelt sich jedesmal um die selbe Bitfolge.
9. Hast Du nun also ein "int", dann ist durch "int" festgelegt, das
gewisse primitive Operationen wie "+", "-", "*" etc. die Bitfolge als
vorzeichenbehaftete Zahl interpretieren.
10. Die Sprache C selbst bietet keine primitiven Ausgabeoperationen die
eine bestimmte Bitfolge in festgelegter Weise repräsentieren. Das liegt
daran, das C auch keine bestimmte Art von Schnittstellen nach aussen
kennt.
Das aber müste es, denn ob etwa der Buchstabe 'C' als die Note C mit
einer bestimmten Frequenz am Lautsprecher repräsentiert wird oder als
schwarze und weisse Punkte auf einem Bildschirm erfordert jeweils völlig
andere primitive Operationen. C kennt letztlich nur Bits und Folgen von
ihnen.
11. Zur Ausgabe und Interpretation von Bitfolgen und davon abgeleiteten
Typen wie "int", "char" etc. gibt es verschiedene Funktionen. Das sind
nicht-primitive Folgen von primitiven C-Operationen.
Eine davon ist, das erwähnte "itoa", das ein Akronym für "integer to
ascii" ist. Es interpretiert eine Bitfolge als vorzeichenbehaftete ganze
Zahl und wandelt sie in eine andere Bitfolge um, die als Folge von
ASCII-Zeichen interpretiert werden kann.
Wie unter 8. als Beispiel gezeigt, wird etwa die Bitfolge 00110000 von
dieser Funktion als die vorzeichenbehaftete Dezimalzahl 48 interpretiert
und in zwei ASCI-Zeichen, nämlich die '4' und die '8' umgewandelt.
Umgekehrt sind diese '4' als Bitfolge 00110100 bzw. die '8' als Bitfolge
001110000 zu repräsentieren. Man sieht, das sie keine Ähnlichkeit
miteinander haben (obwohl mit ein wenig mehr Einsicht in den
Problemkreis erkennbar wird, das der Zusammenhang recht einfach ist).
12. Deine Funktion lcd_putc erwartet als zweites Argument ein "char".
Also eine Bitfolge, die als ein einzelnes ASCII-Zeichen zu
interpretieren ist. Auch wenn Du wie hier, ein "int" übergibst (was
eigentlich auch eine Compilerwarnung geben sollte), wird die Funktion
die dort gespeicherte Bitfolge, und zwar die ersten 8 Bits davon als
ASCII-Zeichen interpretieren. Das aber kann nicht funktionieren, denn,
wie oben gezeigt, existiert keine Übereinstimmung der Interpretation
eines "int" mit der eines "char". Du musst sie, wie unter 11.
beschrieben, erst mit itoa umwandeln.
13. Dann stehst Du aber vor einem, hier noch nicht genannten, weiteren
Problem. Ein "int" kann im allgemeinen Bitfolgen von 16 Bit speichern
(das hängt, wie erwähnt von dem konkreten Compiler under Maschine ab).
Interpretiert man alle möglichen Bitkombinationen (das sind 2^16) als
Folge von vorzeichenbehafteten Dezimalzahlen, so decken sie den Bereich
von -32768 bis + 32767 ab. Wie Du siehst braucht man zur Darstellung
dieser Zahl als ASCII-Zeichen zwischen einem '0' bis zu 6 Zeichen.
Die Funktion lcd_putc aber erwartet nur ein einzelnes Zeichen. Keine
Folge von Zeichen. Ich kenne die konkrete Bibliothek nicht, die Du
verwendest. Aber oft gibt es auch eine analoge Funktion die
Zeichenketten ausgeben kann.
Lies Dir mal die Dokumentation von itoa durch. Da werden noch weitere
Fragen auftauchen, denke ich.
Nun ja das habe ich, nur muste ich feststellen das zwischen C und C ein
unterschied gibt.
Im Buch sind halt sehr viele Beispiele auf Konsole bezogen, die aber
beim Compelieren zu Syntax fehlern führen.
Des weiteren stehen sachen wie:
- putc , puts , puts_p?
ja dort ebenfals nicht drin. Ich finde es echt sehr nett mir den Tip zu
geben, doch wenn es so einfach wäre, hätte ich es gefunden. Ich weiß,
dass ich noch sehr unerfahren in C bin, doch bin ich sehr bemüht dieses
zu ändern. Was mir halt auch probleme macht, ist die tatsache das ich C#
etwas in der Schule hatte. Da war alles etwas einfacher.
Ich hoffe das nimmst du mir nicht übel.
Ich will einfach weg von BASCOM, auch wenn das Schreiben in der Sprache
sehr einfach ist.
Gruß
Chris
>Nun ja das habe ich, nur muste ich feststellen das zwischen C und C ein>unterschied gibt.>Im Buch sind halt sehr viele Beispiele auf Konsole bezogen, die aber>beim Compelieren zu Syntax fehlern führen.
Was sollen denn das für Unterschiede sein, die in Bezug auf Deine Frage
relevant sind?
Das hat doch alles nichts mit Deiner Frage:
>Also sehe ich das richtig, das es unter C keine Variable "string" gibt,...
zu tun.
Es gibt zwar Unterschiede zwischen K&R-C, ANSI-C, C99 usw. Aber die
betreffen Deine Frage nicht. Gerade in Bezug auf die Frage nach
C-Strings.
Was die Frage nach
>- putc , puts , puts_p?
betrifft, da lies einfach da nach, wo Du diese Namen herhast, bzw. suche
bei Google in dem Kontext in dem Du sie gefunden hast, wenn Du sie in
Deinem C-Buch nicht findest.
Was hast Du für ein C-Buch?
Aha. Kenne ich nicht.
Und steht nichts über C-Strings drin. Guck mal unter Vektoren oder
Arrays.
Alternativ noch http://openbook.galileocomputing.de/c_von_a_bis_z/ zum
Vergleich.
Unbedingt empfehlen würde ich Dir einen Kernighan $ Ritchie. Zweite
Ausgabe. Alle anderen C-Bücher die sich so nenne sind ohnehin nur
Kompilationen davon. (Meine Meinung).
Gut, vielen Danke erst mal für die Hilfe. Ich war von einer Antwort "ne
total falsch das geht so" ausgegangen. Nun muss ich mir doch alles
selbst erarbeiten und nachlesen. Bitte nicht falsch verstehen, dass ich
zu faul währe, nur dachte ich, es läge an meiner interpretation der
Syntax.
Hab gerade Buch bestellt und werde mich mit der Materie etwas tiefer
beschäftigen.
Gruß
Chris
>Ich war von einer Antwort "ne total falsch das geht so" ausgegangen.>Nun muss ich mir doch alles selbst erarbeiten und nachlesen.
Genau das möchte ich. Wie sollten wir das für Dich erarbeiten?
Deswegen gibt es Bücher über die Sprache.
>Bitte nicht falsch verstehen, dass ich zu faul währe, nur dachte ich, es läge an
meiner interpretation der Syntax.
Welche Syntaxbeschreibung hast Du denn da interpretiert?
Und wo ist in Deinen Fragen eine Interpretation? Ich sehe nirgends ein
Zitat. Keine Referenz. Keine Kategorisierung.
Vermutlich ist die Formulierung:
>Also sehe ich das richtig, das es unter C keine Variable "string" gibt,>um z.B. folgendes zu Bauen:
das Ergebnis einer Interpretation.
Die Frage müsste lauten: Gibt es in C einen Variablentyp der sich analog
wie in BASIC der Typ "String" verhält? Der also Zeichenketten enthalten
kann, deren Einzelzeichen man indizieren kann; die man verketten, und
zergliedern kann; die der Benutzer eingeben und die man auf die Konsole,
ein LC-Display, eine serielle Schnittstelle ausgeben kann; in die und
aus denen man andere Datentypen konvertieren kann?
Antwort: Ja. Den Char-Vektor (deutsch), das Char-Array (englisch) resp.
Zeiger auf solche Vektoren.
Falls das in Deinem Buch nicht steht, schmeiss es weg.
Zur Not lies mal in dem Galileo-Buch nach.
Schon ok, nicht aufregen!
Ich bin Anfänger! Bitte nicht schlagen.
>Antwort: Ja. Den Char-Vektor (deutsch), das Char-Array (englisch) resp.>Zeiger auf solche Vektoren.
Hätte mir von Anfang an gereicht!
>Falls das in Deinem Buch nicht steht, schmeiss es weg.
Habe auf deinen rat hin, das Buch "Kernighan, B: Prog. in C (2.A.)"
bestellt. Ich lerne C nun doch von Anfang an und versuche mich in
Fragestellungen zu üben.
>Welche Syntaxbeschreibung hast Du denn da interpretiert?>Und wo ist in Deinen Fragen eine Interpretation? Ich sehe nirgends ein>Zitat. Keine Referenz. Keine Kategorisierung.
Als Interpretation war das hier gemeint:
1
stringtext;
2
3
text="Hello World";
4
5
lcd_set_cursor(0,LINE0);
6
lcd_putc(small_font,text);
so ungefähr hätte ich das unter C# gemacht. Nun das Ergebniss war halt,
das es nicht klappte.
Ich lese mich nun mit dem neuen Buch ein und hoffe das ich dann die
Materie etwas besser verstehe. Damit kann man das hier wohl beenden.
Danke noch mal für deine Hilfe.
Chris
Hmm schrieb:> Den Char-Vektor (deutsch), das Char-Array (englisch)
Ein Vektor ist ein Vektor, und ein Array ein Array. Auch im Deutschen.
Wenn überhaupt, ist ein Array auf Deutsch ein Feld. Da aber die ganze
Welt von Array spricht, kann man ruhig dabei bleiben.
Oliver
Christian O. schrieb:> Wo sind die Unterschiede bei:> - putc , puts , puts_p?
putc und puts sind Standradfunktionen aus der C-Standardbibliothek.
goggle weiß in solchne Fällen eigentlich immer Bescheid. puts_p ist was
AVR-spezifisches, näheres dazu sollte in der Doku deiner lib stehen.
Wenn gar nichts hilft, schau dir halt den Quelltext der Funktionen an.
Oliver
>4.b. Eine vorzeichenbehaftete, ganze (natürliche) Zahl zwischen -255 und
+254.
muss heissen
4. Die Interpretation eines Bytes kann z.B. sein
...
4.b. Eine vorzeichenbehaftete, ganze (natürliche) Zahl zwischen -128 und
+127.
...