www.mikrocontroller.net

Forum: Compiler & IDEs char als string übergeben, warum geht nicht?


Autor: maccallan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich will an eine funktion, die einen string verarbeitet nur einen char
übergeben. jetzt brauche ich dazu ja eigentlich nur die adresse des
char  dazu angeben, also &variablenname.
habe ich zumindest gedacht, der char wird auch richtig ausgegeben, aber
dahinter kommt noch etwa 1-4 chars mist.
liegt das daran, dass bei einem string als letztes zeichen immer eine
art EOF nur auf strings bezogen ist, was natürlich beim char fehlt und
die funktion(hier lcd_puts) solange im speicher liest bis sie etwas
dergleichen findet?
wenn dem so ist(denke ich mal) wie könnte ich das problem umgehen? ziel
soll sein, dass ich von einem string immer nur ein element an die
lcd_puts schicken will;

hier eine beispielanwendung, die funktion lcd_puts() ist die von peter
fleury als beispiel, die habe ich nur zum debuggen, in meiner funktion
habe ich das gleiche problem.


void action_message(uint8_t *string){
uint8_t temp;
while(*string){
  temp= *string;
  lcd_home();lcd_puts(&temp);
        string++;
        }
}

ich danke euch!

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ein String in C hat per Definition als Endekennung eine Null, sonst
wüssten die Funktionen ja nicht wie lang ein String ist. Es wird also
soviel 'Müll' mitausgegeben bis eine Null gefunden wird. Du musst
also dafür sorgen das hinter deinem char eine Null steht.

Autor: maccallan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahhh jetzt wirds mir klar...
ich habe das problem nun so umgangen:

uint8_t *s="t";
  while(*string){
  s[0]=*string;

alternatov könnte ich ein char array declarieren mit 2 stellen, wobei
die zweite = 0 ist.

ich danke dir!

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint8_t *s="t";
erzeugt zwei Zeichen: 't' und 0x00. Damit hast du einen String der
Nullterminiert ist.
  s[0]=*string;
ist da unnötig, es führt nur dazu das immer das erste Zeichen
verarbeitet wird. Wenn aber gar keine Null folgt hast du eine Schleife
die viel zu oft durchlaufen wird (könnte theoretisch sogar endlos
sein).
  while(*string)
ist heist ja 'laufe solange das Zeichen auf das string zeigt ungleich
0 ist'.

Autor: maccallan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm ich will ja immer nur ein zeichen verarbeiten.
ich habe es letztendlich so gemacht:

void action_message(uint8_t *string){
  uint8_t i=0;
  uint8_t temp[2]={1,0};

    while(*string){
      temp[0]= *string;
      lcd_home();lcd_puts(temp);
                        }
wenn ich jetzt temp übergebe, folgt auf das erste zeichen, dass mich
interessiert immer eine 0.
(es ist leider wichtig, das immer nur ein teil verarbeitet wird, um
z.b. ein delay o.ä. zu verarbeiten)
allerdings verstehe ich gerade nicht, warum es auch funktioniert, wenn
ich als abschlusszeichen eines nehme !=0 zum beispiel 49 (also
temp[2]={0,49}, das kann ja kein zufall sein.

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist auch kein Zufall. Deine Schleife wird eben mehrmals durchlaufen bis
eine Null kommt. Und wenn du in der Schleife auf lcd_home springst und
das Zeichen ausgibst dann siehst du das bei ein paar Zeichen nicht.
Ich kenne die die lcd_ lib/funktionen nicht. Gibt es evtl. ein lcd_put
oder lcd_putc was nur ein char ausgibt ? Wenn nicht, gibt es die
Quellen ? Dann sollte es einfach sein aus lcd_puts() die Schleife
auszubauen und nur ein Zeichen auszugeben. Das ist doch meistens so
geschachtelt.

Autor: maccallan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm vielleicht habe ich mich immer etwas wirr ausgedrückt, dein hinweis
mit zeichen die es nicht gibt, war entscheidend.
nehme ich gültige zeichen wie zum beispiel 0x58 = 'X' und dahinter
erst eine null wie hier:
void action_message(uint8_t *string){
  uint8_t i=0;
  uint8_t temp[3]={0,88,0};
    while(*string){
      temp[0]= *string;
      lcd_home();lcd_puts(temp);
                        }
handelt er in lcd_puts() immer ein char vom string string ab und
schreibt ein X dahinter, wie ich es mir gedacht hatte.

ein zeiger auf den anfang eines char arrays indem das letzte element
0x00 ist ist also das gleiche wie ein zeiger auf einen string, das ist
trivial aber ich habs jetzt gerallt, danke!

sicherlich mag es idiotisch erscheinen, aber die funktion die ich
ansprechen will (nicht die lcd_puts) darf nicht geändert werden.

gruß
m.

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.