Hi,
wie die Überschrift vermuten lässt erwarte ich keine Wunder.
Aber vielleicht fällt dem ein oder anderem etwas dazu ein?
(Falls nicht bitte einfach weiter gehen :P)
...wieso der folgende Code beim einmaligen und zweimaligen Aufruf
passiert werden kann, jedoch bei 3-maligem Aufruf den Atmega16 zum
hängen bringt.
(Meine Annahme, dass er hängen bleibt beruht auf der Ausgabe auf einem
2x16 Zeilen-Display bzw. der NICHT Ausgabe der sofort folgendem
Zeilenausgabe auf demselbigen.)
D a v i d K. schrieb:> char str[c];
also in c bytes kannst du schon mal nicht c Zeichen plus 1 Nullbyte für
die Terminierung unterbringen. Vielleicht liegt es daran?
"Zeilenausgabe" - Hat das Ding Scrolling eingebaut oder sowas? Auf einem
2-Zeilen display verschwindet die 3. sonst vermutlich im Nirvana.
Ansonsten: Die Timings für das Ding alle penibel beachtet? Sonst kann
schon mal irgendetwas verschluckt werden - irgendwann...
Wenn der Code echt irgendwo hängen bleibt würde ich tippen, er wartet
auf ein Zeichen vom LCD, das niemals kommt.
Jim M. schrieb:> Deine lcd_printInt hat einen Buffer Overflow bei>>
1
charstr[c];
>> Der muss das ganze Ergebnis von utoa inklusive nachfolgender Null> enthalten können.
Nicht zu vergessen der Irrsinn, einen solchen Puffer überhaupt mit
dynamischer(!) Länge anzulegen. Ein uint16_t hat maximal 5
Dezimalstellen, dazu noch das terminierende \0, macht einen Buffer Länge
6. Den alloziert man einmal, vorzugsweise als
1
staticcharstr[6];
und nicht bei jedem Aufruf der Funktion wieder.
Mal wieder ein Traumbeispiel für den immer "korrekten Code" des TE.
Felix U. schrieb:> D a v i d K. schrieb:>> char str[c];>> also in c bytes kannst du schon mal nicht c Zeichen plus 1 Nullbyte für> die Terminierung unterbringen. Vielleicht liegt es daran?
Wenn man das so betrachtet klingt das plausibel. Allerdings - was sollte
da denn auf dem Stack kaputt gehen, was 2 mal aber nicht 3 mal gut geht?
Schreibt doch immer eine 0 also müsste alles deterministisch ablaufen...
Stefan E. schrieb:> zer0 schrieb:>> Allerdings - was sollte>> da denn auf dem Stack kaputt gehen, was 2 mal aber nicht 3 mal gut geht?>> Die Return-Adresse.
Und deshalb erscheint nichts auf dem Display?
zer0 schrieb:> Stefan E. schrieb:>> zer0 schrieb:>>> Allerdings - was sollte>>> da denn auf dem Stack kaputt gehen, was 2 mal aber nicht 3 mal gut geht?>>>> Die Return-Adresse.>> Und deshalb erscheint nichts auf dem Display?
Ach so, nach dem 2. ist er im Nirvana... Das könnte durchaus sein.
Axel S. schrieb:> Mal wieder ein Traumbeispiel für den immer "korrekten Code" des TE.
Diese Aussage kreidest du mir wohl jetzt noch eine Weile an? :)
Ich bin nicht perfekt aber ebenso wenig nun eingeschnappt, daher gerne
mehr davon, solange ich gleichzeitig viele hilfreiche Infos bekomme.
Nur SO lerne ich etwas. Danke.
Vom Überlauf abgesehen wird der Code effizienter, wenn du den Puffer
nicht dynamisch, sonder statisch auf dem Stack alloziierst. Als Größe
einfach die Anzahl der Ziffern der größten Zahl, die utoa ausgeben kann,
plus eins für NUL.
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang