Forum: Compiler & IDEs Laufschrift läuft nicht


von Thomas (Gast)


Lesenswert?

Hallo, habe mir den folgenden Code für eine Laufschrift ausgedacht:

1
unsigned char zeile=16, marke=0, i=0;
2
char ausgabe[zeile];
3
char eingabe[] = "Keine Ahnung ";
4
5
long eingabe_laenge = strlen(eingabe);
6
7
    lcd_init();
8
9
while (1) {
10
11
  for (i=0;i<zeile;i++) {
12
13
    if (marke+i < eingabe_laenge) ausgabe[i] = eingabe[marke+i];
14
    else ausgabe[i] = eingabe[marke+i-eingabe_laenge];
15
16
  } // Ende for
17
18
  ausgabe[zeile]='\0';  // terminieren der Ausgabe !
19
  lcd_string(ausgabe);
20
21
  i=0;
22
  marke++;
23
  if (marke == eingabe_laenge) marke = 0;
24
25
  _delay_ms(1000);
26
  lcd_clear();
27
28
} // Ende while

Leider wird nur beim ersten Durchlauf der for-Schleife der Text 
hintendrangehängt. Das verstehe ich einfach nicht :-(
Wenn ich die Inkrementierung von 'marke' testweise weglasse zeigt mein 
Display nur beim ersten Durchlauf etwas an.
Kann mir vielleicht jemand auf die Sprünge helfen?

Danke schon mal,
Gruß
Thomas

von Stefan E. (sternst)


Lesenswert?

1
unsigned char zeile=16, marke=0, i=0;
2
char ausgabe[zeile];
3
...
4
ausgabe[zeile]='\0';  // terminieren der Ausgabe !
Du schreibst über das Ende des Arrays ausgabe hinaus.
Das Array geht nur bis zeile-1.

von Thomas (Gast)


Lesenswert?

Herzlichen Dank Stefan, das hat mir den Sonntag gerettet!

Thomas

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

lcd_clear() ist eine ganz schlechte Idee... das mal nur so als gut 
gemeinten Hinweis.

von Skua C. (skua)


Lesenswert?

Erspart Verenkungen
char eingabe[] = "Keine Ahnung Keine Ahnung ";

braucht man nur einmal vor den schleifen
ausgabe[zeile]='\0';  // terminieren der Ausgabe !

von Thomas (Gast)


Lesenswert?

Michael G. wrote:
>lcd_clear() ist eine ganz schlechte Idee... das mal nur so als gut
>gemeinten Hinweis.
Wie kann ich das besser machen?

Skua C:\> wrote:
>Erspart Verenkungen
>char eingabe[] = "Keine Ahnung Keine Ahnung ";
... wollte halt bei der Eingabe flexibel bleiben ...

>braucht man nur einmal vor den schleifen
>ausgabe[zeile]='\0';  // terminieren der Ausgabe !
Gut, danke!

Gruß Thomas

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Thomas wrote:
> Michael G. wrote:
>>lcd_clear() ist eine ganz schlechte Idee... das mal nur so als gut
>>gemeinten Hinweis.
> Wie kann ich das besser machen?

Kein Clear sondern die betroffenen Zeichen einfach ueberschreiben (wenn 
Du loeschen willst mit einem Leerzeichen). Das ist sehr viel schneller 
und fuehrt dann zu keinen Artefakten, da die clear-Operation einfach zu 
langsam ist bei diesen Controllern.

von Thomas (Gast)


Lesenswert?

Überschreiben des Textes reicht tatsächlich, lcd_clear() braucht man 
nicht, aber dafür ein set_cursor(0,1); Naja, ist sicher schneller.
Die Eingabezeile länger als das Display zu machen erspart wohl auch 
einigen Ärger.
Terminieren von
ausgabe[zeile-1]='\0';
muß ich aber in jeder Schleife machen, sonst kommt wieder nur Unsinn 
raus.

Thomas

von Stefan E. (sternst)


Lesenswert?

Thomas wrote:

> ausgabe[zeile-1]='\0';
> muß ich aber in jeder Schleife machen, sonst kommt wieder nur Unsinn
> raus.

Du überschreibst in der Schleife die Null ja auch wieder.

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.