Hallo, ich versuche derzeit ein LC Display anzusteuern. Jetzt bin ich an der Schriftdarstellung dran (Grafik LCD). Ich übergebe der Funktion: lcd_text("HALLO LINIE",1,11); (die hinteren beiden Zahlen sind die Startkoordinaten des Textes) in der Funktion wird diese while Schleife 2 mal aufgerufen: while(*text != '\0') {.... *text++; } aber beim 2ten mal (so ist die Vermutung) steht der *text ja bei \0 und dann wird die nicht mehr aufgerufen. Kann man den *text wieder "zurücksetzen" auf den Übergabewert? void lcd_text(const char *text,uint8_t xvar, uint8_t yvar)
Wieso wird die Schleife nur zweimal aufgerufen? Sie müsste 11 mal augerufen werden und beim 12. Durchlauf dann *text != '\0' false sein.
habe mich falsch ausgedrückt. die while Schleife läuft 11 mal durch aber dann wird sie ein 2tes mal aufgerufen.
Achso dann kopier dir die Pointeradresse doch einfach in einen temporären Pointer.
>habe mich falsch ausgedrückt. die while Schleife läuft 11 mal durch aber >dann wird sie ein 2tes mal aufgerufen. Wieso zeigst du den Code nicht einfach statt dir einen mit Beschreibungen abzubrechen?
1 | //1. Durchlauf
|
2 | tmp_ptr = text; |
3 | while(*tmp_ptr!= '\0') |
4 | {....
|
5 | *tmp_ptr++; |
6 | }
|
7 | |
8 | //2. Durchlauf
|
9 | tmp_ptr = text; |
10 | while(*tmp_ptr!= '\0') |
11 | {....
|
12 | *tmp_ptr++; |
13 | }
|
danke Christian, habe schon gesucht wo ich das finde :/. Kam immer eine Fehlermeldung, weil ich nicht wusste wie man einen Zeiger wieder zuweist. Wollte den Code nicht schicken, da der grausam aussieht^^
Christian schrieb: > Achso dann kopier dir die Pointeradresse doch einfach in einen > temporären Pointer. Oder einfach eine Ausgabefunktion schreiben, wo nur eine Referenz übergeben wird. Dann bleibt der Originalpointer immer unverändert. Und dann halt nur die Ausgabefunktion zweimal aufrufen.
string schrieb: > danke Christian, habe schon gesucht wo ich das finde :/. Kam immer > eine > Fehlermeldung, weil ich nicht wusste wie man einen Zeiger wieder > zuweist. > Wollte den Code nicht schicken, da der grausam aussieht^^ Wenn du dich mit Strings beschäftigen willst, solltest du dir etwas über Arrays und Zeiger anlesen, z.B. das hier fürs erste: http://www.mikrocontroller.net/articles/Zeiger
ok, gibt immernoch Probleme. Mit dem was du gesagt hast funktioniert es: http://www.c-howto.de/tutorial-strings-zeichenketten.html Dann kann man das Programm umschreiben, sodass statt dem Zeiger immer ein Feld weitergegangen wird. Aber ich will das so beibehalten. Ich frage mich, wie ich dann diesen temporären Zeiger initialisiere. void lcd_text(const char *text,uint8_t xvar, uint8_t yvar) { const char *vartext = *text; //temporär ... } funktioniert jedenfalls nicht. Ich kann ja auch nicht einfach nur: char vartext = *text; machen. Da muss ja irgendwie der gleiche Zeiger erstellt werden aber unter anderem Namen.
>>> const char *vartext = *text; //temporär
Geht auf jeden Fall nicht, wie willst du denn bitte einen const Pointer
verändern.
Und vor allem: text ist ein Pointer aber was machst du hier:
konstanten Char Pointer erzeugen: vartext.
nun machst du vartext = *text;
text ist aber hier nicht mehr der Pointer sondern der dereferenzierte
Wert von text...
allso wenn dann const char * vartext = text;
Warum
char *vartext = text;
Bei dir nicht gehen sollte weiß ich nicht... Da sehe ich nämlich kein
Problem.
MfG
string schrieb: > void lcd_text(const char *text,uint8_t xvar, uint8_t yvar) > { > const char *vartext = *text; //temporär > ... > } In diesem Fall brauchst du keine temporäre Variable. Die Variaböe text wird beim Funktionsaufruf kopiert und bleibt in der aufrufenden Funktion erhalten. Richtig wäre const char *vartext = text; Mit const char *vartext = *text; weisst du vartext den Wert zu, auf den text zeigt.
void lcd_text(const char *text,uint8_t xvar, uint8_t yvar) { const char *vartext = text; .. } so funktionierts, falls es Jemand auch mal das Problem hat. Vielen Dank.
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.