Forum: Mikrocontroller und Digitale Elektronik GrafikLCD - String zurücksetzen?


von string (Gast)


Lesenswert?

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)

von Christian (Gast)


Lesenswert?

Wieso wird die Schleife nur zweimal aufgerufen? Sie müsste 11 mal 
augerufen werden und beim 12. Durchlauf dann *text != '\0' false sein.

von string (Gast)


Lesenswert?

habe mich falsch ausgedrückt. die while Schleife läuft 11 mal durch aber 
dann wird sie ein 2tes mal aufgerufen.

von Christian (Gast)


Lesenswert?

Achso dann kopier dir die Pointeradresse doch einfach in einen 
temporären Pointer.

von holger (Gast)


Lesenswert?

>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?

von Christian (Gast)


Lesenswert?

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
}

von string (Gast)


Lesenswert?

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^^

von Thomas M. (thomaswm)


Lesenswert?

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.

von Christian (Gast)


Lesenswert?

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

von string (Gast)


Lesenswert?

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.

von Fer T. (fer_t)


Lesenswert?

>>> 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

von Marcel (Gast)


Lesenswert?

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.

von string (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.