Forum: Compiler & IDEs string oder int an Display ausgeben


von Christian O. (goustrup)


Lesenswert?

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
int count;
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

von <yxcvbnm (Gast)


Lesenswert?

Du musst deine Zahlen in Zeichenketten verwandeln. Guckst du itoa().

von Hmm (Gast)


Lesenswert?

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.

von Christian O. (goustrup)


Lesenswert?

Ok werde ich mich mal Einlesen, Danke schon mal.

Also sehe ich das richtig, das es unter C keine Variable "string" gibt, 
um z.B. folgendes zu Bauen:
1
string text;
2
3
text = "Hello World";
4
5
  lcd_set_cursor(0,LINE0);
6
  lcd_putc(small_font, text);

Wo sind die Unterschiede bei:
- putc , puts , puts_p?

Gruß
Chris

von Hmm (Gast)


Lesenswert?

Ich möchte Dir höflich empfehlen ein C-Buch zu lesen.

von Christian O. (goustrup)


Lesenswert?

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

von Hmm (Gast)


Lesenswert?

>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?

von Christian O. (goustrup)


Lesenswert?

Dieses hier:

ISBN:  978-3-499-60074-6

von Hmm (Gast)


Lesenswert?

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).

von Christian O. (goustrup)


Lesenswert?

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

von Hmm (Gast)


Lesenswert?

>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.

von Christian O. (goustrup)


Lesenswert?

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
string text;
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

von Hmm (Gast)


Lesenswert?

>Schon ok, nicht aufregen!
Wieso aufregen? Wer regt sich auf, verdammt noch mal? :-)
Kritische Bemerkungen kann man auch ganz ruhig machen.

von Route_66 H. (route_66)


Lesenswert?

Hallo @ Hmm!
In deiner Aufstellung unter 4.b hast du dich sicher nur verschrieben?

von Oliver S. (oliverso)


Lesenswert?

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

von Hmm (Gast)


Lesenswert?

>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.
...

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.