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!
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.
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
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
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
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.
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
voidlcd_int(inti)
2
{
3
charbuffer[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.
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
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.