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!
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.
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!
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'.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.