Forum: Mikrocontroller und Digitale Elektronik Frage zu LCD Tutorial


von Electronics'nStuff (Gast)


Lesenswert?

Hi Zusammen.
Habe soeben das LCD Tutorial durchgemacht und mich an einer kleinen Uhr 
versucht. Funktioniert auch alles ganz prima, nur eines verstehe ich 
nicht.

Im Beispiel im 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung 
findet sich folgende Passage:
1
     int Variable = 42;
2
3
     [....]
4
5
     char Buffer[20]; // in diesem {} lokal
6
     itoa( variable, Buffer, 10 ); 
7
     lcd_string( Buffer );
8
9
10
     [....]

Nun Frage ich mich, warum brauche ich ein Array mit 20(!) "Plätzen" für 
eine einfache "42"? Da ich mit der Uhr natürlich auch 2-stellige Zahlen 
habe, die bis höchstens 59 gehen (selbstredend), habe ich einfach mal 
das Array auf 2 "Plätze" (was ist eig. die richtige Bezeichnung?) 
reduziert und siehe da: es funktioniert.

Kann mir vielleicht jemand weiterhelfen?

Gruss & Dank im Voraus!

von Karl H. (kbuchegg)


Lesenswert?

Electronics'nStuff schrieb:

> Nun Frage ich mich, warum brauche ich ein Array mit 20(!) "Plätzen" für
> eine einfache "42"? Da ich mit der Uhr natürlich auch 2-stellige Zahlen
> habe, die bis höchstens 59 gehen (selbstredend), habe ich einfach mal
> das Array auf 2 "Plätze" (was ist eig. die richtige Bezeichnung?)
> reduziert und siehe da: es funktioniert.

Aber nur zufällig.
3 wären Minimum gewesen.

Da war das Original mit einer Arraygröße von 20 und ein wenig in Kauf 
genommener Platzverschwendung besser. Zumal diese 'Verschwendung' 
sowieso nur ganz kurze Zeit existiert, weil das Array mit dem Ende des 
einschliessenden {-} Blockes wieder aufgelöst wird.

von Electronics'nStuff (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Aber nur zufällig.
> 3 wären Minimum gewesen.
>
> Da war das Original mit einer Arraygröße von 20 und ein wenig in Kauf
> genommener Platzverschwendung besser.

Oke, danke für deine Antwort.
Kannst du mir vllt. erkären warum das so ist oder mir sagen wo ich diese 
Information beziehen kann?

Gruss

von Karl H. (kbuchegg)


Lesenswert?

Electronics'nStuff schrieb:
> Karl Heinz Buchegger schrieb:
>> Aber nur zufällig.
>> 3 wären Minimum gewesen.
>>
>> Da war das Original mit einer Arraygröße von 20 und ein wenig in Kauf
>> genommener Platzverschwendung besser.
>
> Oke, danke für deine Antwort.
> Kannst du mir vllt. erkären warum das so ist oder mir sagen wo ich diese
> Information beziehen kann?

Was?
Die 3 als Minimum?

In jedem C-Buch im Kapitel über Stringverarbeitung.
Bis dein Buch eintrifft, gibts hier auch die Kurzform
String-Verarbeitung in C

von Electronics'nStuff (Gast)


Lesenswert?

Ah, alles klar. Vielen Dank, das mit dem /0 habe ich nicht gewusst!
Trotzdem bleibt bei mir noch die Frage offen, weshalb der Autor des 
Artikels char [20] benutzt hat? Übervorsicht oder hat das vielleicht 
noch andere Gründe?

Gruss

von Stefan (Gast)


Lesenswert?

Diese Frage kann Dir wohl nur der Autor diese Code-Zeile beantworten. In 
meinen Augen hat er unnötig viel Speicherplatz reserviert.

von Electronics'nStuff (Gast)


Lesenswert?

Stefan schrieb:
> Diese Frage kann Dir wohl nur der Autor diese Code-Zeile beantworten. In
> meinen Augen hat er unnötig viel Speicherplatz reserviert.

Oke, das genügt mir vollkommen als Antwort.
Dachte schon ich habe hier irgendwas überhaupt nicht gerafft.

Vielen Dank für die Hilfe und noch einen schönen Tag euch beiden.

von Karl H. (kbuchegg)


Lesenswert?

Electronics'nStuff schrieb:
> Ah, alles klar. Vielen Dank, das mit dem /0 habe ich nicht gewusst!

Genau das ist es, was mir Angst macht :-)

> Trotzdem bleibt bei mir noch die Frage offen, weshalb der Autor des
> Artikels char [20] benutzt hat? Übervorsicht oder hat das vielleicht
> noch andere Gründe?

Weil es ziemlich egal ist.
In
1
void lcd_int( int i )
2
{
3
  char buffer[10];
4
5
  itoa( i, buffer, 10 );
6
  lcd_string( buffer );
7
}
existiert diese Stack-Belastung nur während die Funktion läuft. Sie ist 
vorher nicht vorhanden und sie ist danach nicht vorhanden.
Gut, hier könnte man argumentieren, ein 16 Bit int kann nie mehr Zeichen 
als -32767, also 6 Zeichen beanspruchen, daher ist eine Arraygröße von 7 
auf jeden Fall immer ausreichend, egal was da kommt.

Aber in vielen Fällen ist man da ganz einfach ein wenig großzügig. Auch 
wenn du weißt, dass deine Minuten immer nur 2 stellig sein werden, kann 
es auch mal vorkommen, dass du zu Debugzwecken kurzerhand mal etwas 
anderes ausgibst

Original:
   itoa( minuten, buffer, 10 );
   lcd_string( buffer );
   itoa( sekunden, buffer, 10 );
   lcd_string( buffer );

zu debugzwecken
   itoa( minuten, buffer, 10 );
   lcd_string( buffer );
   itoa( sekunden, buffer, 10 );
   lcd_string( buffer );

   itoa( minuten*60 + sekunden, buffer, 10 );

ooops. minuten*60 + sekunden
das passt nicht mehr in einen String der Länge 3!

Solche Dinge passieren unabsichtlich und hat man sich ein wenig Platz im 
Array gelassen, dann wirken sie sich nicht gleich fatal aus, weil der 
zusätzliche Platz das auffängt.
Zumal dieser Buffer, wenn er eine globale Variable ist, nur ein einziges 
mal gebraucht wird. Und wenn man genug SRAM hat, dann ist es nicht so 
schlimm, ein bischen zu investieren um sich damit blödsinnige Fehler zu 
ersparen.
Ist man am Speicherlimit, kann man sich immer noch daran erinnern, dass 
man hier großzügig war und quer durchs Programm nachsehen, welches das 
unterste Limit ist.

Ist ein bischen so wie man eine Garage auch ein wenig größer baut als 
unbedingt notwendig, wenn man es sich leisten kann.

von Electronics'nStuff (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Genau das ist es, was mir Angst macht :-)

Habe heute das erste Mal mit µC "Strings" und LCD's gearbeitet von daher 
fühle ich mich entschuldigt!

Karl Heinz Buchegger schrieb:
> Weil es ziemlich egal ist.

Da hast du allerdings recht. Ging mir mehr um die Überlegung die wohl 
dahinter gesteckt hat.

Karl Heinz Buchegger schrieb:
> itoa( minuten*60 + sekunden, buffer, 10 );

Warum sollte ich ausgerechnet sowas ausgeben :D? Aber gut, ich verstehe 
natürlich deine Argumentation:

Karl Heinz Buchegger schrieb:
> Und wenn man genug SRAM hat, dann ist es nicht so
> schlimm, ein bischen zu investieren um sich damit blödsinnige Fehler zu
> ersparen.

Werde daher wohl in zukünftigen Programmen auch ein bisschen mehr Platz 
übrig lassen.

Gruss

von Karl H. (kbuchegg)


Lesenswert?

Electronics'nStuff schrieb:

>> itoa( minuten*60 + sekunden, buffer, 10 );
>
> Warum sollte ich ausgerechnet sowas ausgeben :D?

Weil du heute noch nicht weißt, was du morgen oder nächste Woche alles 
unternehmen wirst um einen Programmfehler zu finden.

> Werde daher wohl in zukünftigen Programmen auch ein bisschen mehr Platz
> übrig lassen.

Na ja.
Man muss auch nicht übertreiben.
Bei einem itoa ist die Sache wohl klar.

Bei der Ausgabe einer Uhrzeit wohl auch
   sprintf( buffer, "%02d:%02d:%02d", Stunden, Minuten, Sekunden );
wohl auch. Wenn das alles korrekt ist, dann benötigt die Ausgabe nie 
mehr als 8 Zeichen, ein Array der Größe 9 ist also ausreichend.

Schlimmer wirds, wenn durch einen Programmfehler die Sekunden zb auf 120 
hochlaufen können. Dann braucht man plötzlich zur Ausgabe ein Array der 
Länge 10.

Oder, anderes Beispiel

  char Buffer[16];

...

  sprintf( Buffer, "Spannung %04d V", volt );

Die 16 sind ausreichend.
Aber irgendwann kommt jemand auf die Idee, anstelle von 'V' hätte er 
gerne dort 'Volt' stehen. Gesagt getan

  sprintf( Buffer, "Spannung %04d Volt", volt );

und das er das Array anpassen muss, darauf vergisst er.
Alles schon gehabt. Solche Dinge passieren. Und sie sind schwer zu 
finden.

von Electronics'nStuff (Gast)


Lesenswert?

Wie gesagt, ich verstehe deine Argumentation vollkommen. Sind wirklich 
die Fehler, die man nicht gerne sucht.

Danke für den Tipp.

Gruss

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.