mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verständinsproblem char


Autor: Thomas Frosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi leute hab nun schon sehr viel rumgeschaut aber irgendwie find ich 
keine passende Antwort bzw. Erklärung für mein Problem

ich möchte einzelne Zeichen die gesendet werden in einen zu einem char 
zusammenfassen. Also einen String aufbauen. Und eben in die Variable 
immer wieder ein zeichen dazu schreiben.

Anschließend möchte ich den String auf meinem LCD ausgeben

lcd_string(.....);

allerdings weiss ich nicht genau wie ich die Variablen richtig 
deklariere und beschreibe.

Zum test hab ich es erstmal so probiert aber selbst dass scheitert schon

char *Titel ="String";

lcd_string(*Titel);

Fehler:
 warning: character constant too long for its type
initialization makes pointer from integer without a cast

wie müsste ich die Variable deklarieren und schreiben um die funktion 
vollständig zu erhalten.

Und wie befülle ich eine char Variable nacheinander mit Zeichen?
Gibt es auch die Möglichkeit abzufragen wieviel Zeichen in der Variable 
drin sind?

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es gibt wie immer viele möglichkeiten
am einfachsten ist es sich einen buffer anzulegen und
eine zählvariable die merkt wieviel schon reingeschrieben wurden

char buffer[32];
unsigned char idx = 0;

buffer[idx++] = 'A';
buffer[idx++] = 'B';
...

wenn du buffer weiter an eine funktion geben willst,
dann muss man auf alle fälle nachlesen und sich
vergewissern wie diese funktion die daten erwartet.

sie könnte nämlich im buffer alle zeichen nehmen,
bis sie auf 0 stosst. nicht '0' sondern 0.
diese terminiernde 0 muss du selbst als letzts hinschreiben
buffer[idx] = 0;

in anderen fällen erwartet die funktion explizit
die anzahl der zeichen. hier ist der vorteil, dass
man auch binäre 0 als daten übergeben kann.
in manchen anwendungen macht es ja sinn, zb koordinaten oder ähnliches.

morgengrüsse^^, daniel

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In dem von dir kompilierten Programm steht höchstwahrscheinlich nicht
char *Titel ="String";

sondern
char *Titel ='String';

was zu der genannten Fehlermeldung führt.

Beim Funktionsaufruf ist der * zuviel. Es führt dazu, dass das Zeichen,
auf das Titel zeigt, nämlich das 'S' an lcd_string übergeben wird.
lcd_string erwartet aber wahrscheinlich eine char-Zeiger, also muss es
so heißen:
lcd_string(Titel);

Die obige Definition von Titel legt einen String ("String") an und
eine Zeigervariable (Titel), die auf das erste Zeichen dieses Strings
zeigt. Das ist zwar korrekt, i. Allg. kann man sich aber den
Speicherplatz für den zusätzlichen Zeiger sparen, indem man Titel
selbst ein Array sein lässt:
char Titel[] ="String";

lcd_string(Titel);

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich möchte einzelne Zeichen die gesendet werden in einen zu einem char
zusammenfassen.

Das wird nicht gehen, es ist ein Widerspruch: Ein (1) CHAR ist ein 
einzelnes Zeichen (Buchstabe, Zahl, Sonderzeichen, Steuerzeichen etc. 
(es ist meistens 1 Byte groß, wenn es in ASCII, ISO-xxx, EBCDIC oder 
ähnlich interpretiert werden soll)

Demzufolge wird es dir nicht gelingen, mehrere CHAR "zusammen zu fassen" 
und in einer Variable vom Datentyp CHAR hinein zu quetschen.

Was allerdings geht, ist folgendes:

Du kannst ein Array einer bestimmten Größe definieren, und dort mehrere 
CHAR "irgendwo" innerhalb des zur Verfügung stehenden Platzes ablegen. 
Der Zugriff auf die Position wo du was ablegst mußt du selbst verwalten. 
Er geschieht über "Zeiger auf den Anfang der Speicheradresse des Array"

Autor: Thomas Frosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohh wunderbar

habs ez so gelöst
char Titel[255];
  unsigned char idx = 0;
  //Titel = 'S';
  //char *Interpret;
  
  Titel[idx++] = 'A';
  Titel[idx++] = 'b';
  Titel[idx++] = 'e';
  Titel[idx++] = 'r';
  Titel[idx++] = 'r';
  
  lcd_string(Titel);
  lcd_data(idx+48);

allerdings würde es mich interessieren warum ich für diese idx variable 
die ich ja hochzähle char nehme?

Autor: Thomas Frosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie kann ich Titel komplett löschen? Klar idx auf 0 um wieder vorne 
anzufangen. Aber wenn nun vorher mehr zeichen drin waren als jetzt 
geschrieben werden?

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um den Quatsch hier mal zu beenden:

char *Titel = "String";

lcd_string(Titel);

wird funktionieren.

Autor: Thomas Frosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt

was zwei zeichen alles ausmachen können!

trotzdem warum für die idx variable char nehmen?

Autor: Sebastian B. (mircobolle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Frosch wrote:
> stimmt
>
> was zwei zeichen alles ausmachen können!
>
> trotzdem warum für die idx variable char nehmen?

char Titel[255];
  unsigned char idx = 0;

deine Puffer kann 255 Zeichen entgegen nehmen! Hast du da so festgelegt:
char Titel[255];

um nun auf jedes Zeichen zugreifen zu können brauchst du einen Index der 
von 0 bis 254 (maximal) laeuft... Char ist da ja bekanntermaßen 
ausreichend... (2^8)-1 = 255! (8 bit)

Wie du den Puffer loescht solltest du selber wissen, oder?

entweder:

unsigned char i = 0;
for (i=0; i<255; i+=1){
   Titel[i] = 0; 
} 

idx = 0;


Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder Titel[0] = '\0';

Autor: daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du kannst auch int nehmen, nur ist unsigned char ausreichend

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.