...ja, es geht wie so häufig um die Darstellung einer Uhrzeit im Format
xx:xx, aber leider konvertiert itoa (natürlich) die Einerstellen von zB
5 Min nicht ins Format "05" - wie macht man das geschickt, gibts da
vll direkt eine Verwandte von itoa?
Danke, Marius.
...ne, zu krass. itoa macht mir schon fast zuviel selbst :)
-> Gibts ne lean-e Lsg? Sonst kopiere ich in dem array per hand um
"if(einstellig)" und adde eine führende 0...aber das ist
irgendwie...so...hemdsärmelig :)
Marius.
Marius MWH schrieb:> gibts da> vll direkt eine Verwandte von itoa?
Mach ne Copy in deinem Projektordner, benenn und Strick sie um!?
(Viel is da ja eh nich dran)
foobar schrieb:>> Soll das ein Aprilscherz sein?> Was passt dir denn daran nicht?
Printf kann bereits Zahlen zweistellig formatieren. Die alternative
Methode macht nur Sinn, wenn man zugleich auf printf verzichtet.
foobar schrieb:>> for (c1 = '0'; c1 <= '9'; c1++)>> AI warning: condition c1 <= '9' is always true ;-)
Vielleicht so?
1
c1='0';
2
while(value>=10)
3
{
4
c1++;
5
value-=10;
6
}
Stefan ⛄ F. schrieb:> Printf kann bereits Zahlen zweistellig formatieren. Die alternative> Methode macht nur Sinn, wenn man zugleich auf printf verzichtet.
Das printf ist hier ganz offensichtlich nur Teil des Beispielcodes,
damit man ein vollständiges Programm hat, das man mal laufen lassen
kann. Es dient nur dazu, die Funktion ito02a mal in Aktion sehen zu
können. Der TE hat ja ausdrücklich geschrieben, dass er kein *printf()
nutzen will.
foobar schrieb:> höchstwahrscheinlich benutzt er eh irgendwo> Divisionen, dann wäre buf[0] = '0' + value / 10;> buf[1] = '0' + value % 10;> zwar nicht schneller aber eleganter und kürzer.
Eleganz liegt im Auge des Betrachters. In dieser speziellen Anwendung
wäre eine Division Overkill, weil nämlich:
Marius MWH schrieb:> ...ne, zu krass. itoa macht mir schon fast zuviel selbst :)
Außerdem: sind das nicht sogar zwei Divisionen? Oder schafft es der
Compiler tatsächlich, den Rest aus der ersten Division zu nutzen?
Bauform B. schrieb:> Außerdem: sind das nicht sogar zwei Divisionen? Oder schafft es der> Compiler tatsächlich, den Rest aus der ersten Division zu nutzen?
Falls der Compiler es nicht schaffen sollte, könnte man schauen, ob er
die Standard-Funktion div() unterstützt. Die gibt Ergebnis und Rest
zurück.
Bauform B. schrieb:> Außerdem: sind das nicht sogar zwei Divisionen? Oder schafft es der> Compiler tatsächlich, den Rest aus der ersten Division zu nutzen?
Das ist eine gute Frage auf die ich auch schon einmal gestossen bin. Wie
kann ich ohne großartige Klimzüge das Ergebnis einer Division und den
Rest in einem Abwasch bekommen? Das scheint zumindest im C Quelltext
nicht möglich zu sein.
foobar schrieb:>> sind das nicht sogar zwei Divisionen? Oder schafft es der>> Compiler tatsächlich, den Rest aus der ersten Division zu nutzen?>> Aus> buf[0] = '0' + value / 10;> buf[1] = '0' + value % 10;> wird> ldi r22,lo8(10)> call __udivmodqi4> subi r24,lo8(-(48))> st Z,r24> subi r25,lo8(-(48))> std Z+1,r25
Sehr interessant. Ich hätte nicht gedacht, dass der Compiler so "schlau"
ist.
> Wie kann ich ohne großartige Klimzüge das Ergebnis einer Division und> den Rest in einem Abwasch bekommen?
Wie oben gezeigt, einfach ausschreiben. Das kommt so häufig vor, dass
der GCC das schon in der 1er-Version optimieren konnte ;-)
Marius MWH schrieb:> ...ne, zu krass. itoa macht mir schon fast zuviel selbst :)>> -> Gibts ne lean-e Lsg? Sonst kopiere ich in dem array per hand um> "if(einstellig)" und adde eine führende 0...aber das ist> irgendwie...so...hemdsärmelig :)
Tja, immer wieder stolpern die Leute über Kleinigkeiten, die bereits
seit Jahren gelöst sind und als fertige benutzbare Lösungen vorliegen.
Aber man ist ja über die einfachen und kleinen Lösungen erhaben...
Das ist ne Universalroutine, die man auch ganz leicht auf int64
erweitern kann (falls das gebraucht wird) - aber für den vorliegenden
Fall kann man sie auch drastisch zusammenkürzen, weil die Uhrzeit ja
wohl nicht als long vorliegen muß und auch nicht negativ werden kann...
Hallo zusammen,
@Bauform: Klappt wunderbar - Danke!
Was mich wurm - ich schreibe die Zeit - und momentan testweise NUR diese
- auf das LCD. Aber da fehlen manchmal ganze Werte (buffer) oder diese
sind leer...iwie willkürlich.
Ist es böse, z.B. folgendes * zu tun (nein, das ist kein code sondern
nur der relevante ablauf)?
W.S. schrieb:> fertige benutzbare Lösungen
Für eine 2-stellige Zahl ?
Derselbe Irrsinn, der heute zu megabytegrossen Programmen führt die nur
Kinderkacke ausrechnen (Und dann kann es nichtmal int64).
MaWin schrieb:> Für eine 2-stellige Zahl ?
Habe ich nicht ausdrücklich geschrieben, daß man sie für den
vorliegenden Fall DRASTISCH zusammenkürzen kann?
Ja, natürlich habe ich das. Du konntest das offenbar nicht lesen.
Abgesehen davon erwarte ich von einem C-Programmierer, daß er div und
ldiv kennt und anzuwenden weiß. Warum wird dann in diesem Thread von
itoa und Puffer-Akrobatik gefaselt?
Abgesehen davon ist die gezeigte Routine in übersetzter Form
ausgesprochen klein im Vergleich zu sowas wie printf und Konsorten.
Genau DAS führt nämlich zu schlanken Programmen - im Gegensatz zu
deiner Annahme.
W.S.
MaWin schrieb:> W.S. schrieb:>> fertige benutzbare Lösungen>> Für eine 2-stellige Zahl ?>> Derselbe Irrsinn, der heute zu megabytegrossen Programmen führt die nur> Kinderkacke ausrechnen (Und dann kann es nichtmal int64).
Und dann noch Spaghetticode mit goto hingerotzt.
Der Herr programmiert wie ne eins!
W.S. schrieb:> Abgesehen davon ist die gezeigte Routine in übersetzter Form> ausgesprochen klein im Vergleich zu sowas wie printf und Konsorten.> Genau DAS führt nämlich zu schlanken Programmen - im Gegensatz zu> deiner Annahme.
Willst du dir schonwieder ne blutge Nase holen?
Es wurde dir schon zig mal erklärt wie man printf klein bekommt.
...ehm, könnt ihr mir vll kurz bei meinem Buffer->Buffer Problem helfen?
:)
Testweise LCD_print(1,2, "12"); schreibt sauber in Zeile 1, Pos 2 eine
"12". Das geht aber halt nicht mit dem Buffer...
Marius.
> könnt ihr mir vll kurz bei meinem Buffer->Buffer Problem helfen?> char char clock_min=55, LCD_clock_min[2];
"char char" gibts nicht, ein "char" reicht. Weiter: LCD_clock_min muß 3
Elemente fassen können, die 2 Ziffern und das terminierende \0.
> void LCD_print (char LCD_row, char LCD_column, char LCD_txt[12])
Zwar nicht falsch, aber verbesserungswürdig: Bei row und column wäre ein
(definiter) unsigned Typ angemessener, z.B. uint8_t. LCD_txt wird
üblicherweise als "char *LCD_txt" definiert (dazu degeneriert das
nämlich) - alles andere führt nur in die Irre.
W.S. schrieb:> Abgesehen davon erwarte ich von einem C-Programmierer, daß er div und> ldiv kennt und anzuwenden weiß. Warum wird dann in diesem Thread von> itoa und Puffer-Akrobatik gefaselt
Eigentlich nicht mehr, seit
foobar schrieb:> dann wäre> buf[0] = '0' + value / 10;> buf[1] = '0' + value % 10;>
sollte das Problem durch sein.
foobar schrieb:>> könnt ihr mir vll kurz bei meinem Buffer->Buffer Problem helfen?>>> char char clock_min=55, LCD_clock_min[2];>> "char char" gibts nicht, ein "char" reicht.
-> Sry, Tippefehler - ist natürlich nur ein char :)
>Weiter: LCD_clock_min muß 3> Elemente fassen können, die 2 Ziffern und das terminierende \0.
-> OK, die Darstellung wir auch besser wenn ich buf[2]="\0"
auskommentiere...aber es fehlen immer noch Inhalte *
>>> void LCD_print (char LCD_row, char LCD_column, char LCD_txt[12])>> Zwar nicht falsch, aber verbesserungswürdig: Bei row und column wäre ein> (definiter) unsigned Typ angemessener, z.B. uint8_t. LCD_txt wird> üblicherweise als "char *LCD_txt" definiert (dazu degeneriert das> nämlich) - alles andere führt nur in die Irre.
-> Hm, da hört mein Verständnis leider auf...
* -> Ich poste gleich mal ein Bild des LCDs, damit man versteht, was ich
meine...
Marius.
...ich flipp aus - wenn ich ALLE buf von [2] auf [3] ändere, gehts,
einwandfreie Darstellung! Ich hatte gestern immer nur minute ODER std
von [2] auf [3] geändert, aber dann wird itoclk das "\0" einfach über
den nächsten geschrieben haben und dann war dort "blanko"...oder sowas.
Also kein sauberes buf-Mgmt :)
Danke vielmals für den Wink, foobar!!!
Marius.
foobar schrieb:> Deshalb macht man das einmal richtig und kann es danach vergessen:
printf und seine Brüder sind in diesem Thread explizit unerwünscht!
MaWin schrieb:> Eigentlich nicht mehr, seit..
Man müßte das bloß den übrigen Disputanden mal klarmachen.
Eigentlich ist das sowas von trivial, daß mich dieser gesamte Thread im
Grunde graust.
Trotz der inzwischen wirklich sinnreichsten Lösung (ein paarmal div()
und der String ist final fertig) wird hier immer noch mit obskuren
Puffer-Basteleien gearbeitet - mit eigentümlichem Ergebnis wie man
sieht:
Marius MWH schrieb:> ...ich flipp aus
nana, lieber nicht. Stattdessen einfach den String selber aufsetzen. Wie
wurde dir ja schon gezeigt.
W.S.