Forum: Mikrocontroller und Digitale Elektronik Verständinsproblem char


von Thomas Frosch (Gast)


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?

von daniel (Gast)


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

von yalu (Gast)


Lesenswert?

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

sondern
1
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:
1
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:
1
char Titel[] ="String";
2
3
lcd_string(Titel);

von Wegstaben V. (wegstabenverbuchsler)


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"

von Thomas Frosch (Gast)


Lesenswert?

Ohh wunderbar

habs ez so gelöst
1
char Titel[255];
2
  unsigned char idx = 0;
3
  //Titel = 'S';
4
  //char *Interpret;
5
  
6
  Titel[idx++] = 'A';
7
  Titel[idx++] = 'b';
8
  Titel[idx++] = 'e';
9
  Titel[idx++] = 'r';
10
  Titel[idx++] = 'r';
11
  
12
  lcd_string(Titel);
13
  lcd_data(idx+48);

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

von Thomas Frosch (Gast)


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?

von Marcus (Gast)


Lesenswert?

Um den Quatsch hier mal zu beenden:

char *Titel = "String";

lcd_string(Titel);

wird funktionieren.

von Thomas Frosch (Gast)


Lesenswert?

stimmt

was zwei zeichen alles ausmachen können!

trotzdem warum für die idx variable char nehmen?

von Sebastian B. (mircobolle)


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;
1
for (i=0; i<255; i+=1){
2
   Titel[i] = 0; 
3
} 
4
5
idx = 0;

von Simon K. (simon) Benutzerseite


Lesenswert?

oder Titel[0] = '\0';

von daniel (Gast)


Lesenswert?

du kannst auch int nehmen, nur ist unsigned char ausreichend

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.