Hallo, kann mir jemand einen Tipp geben, warum wenn ich die Variable zahl verdoppel sie dann nicht mehr richtig auf dem LCD angezeigt wird? Er macht 2 4 6 u.s.w. sprünge. Kommentiere ich die Zeile: zahl = (zahl*2); raus, zählt er richtig hoch. Ich will die Variable zahl in der Funktion verdoppeln. In der main wird die Variable ganz normal mit data++; hochgezählt und die Funktion dann so aufgerufen: zaehlen(data); //Globale Var. volatile uint8_t data; volatile uint8_t einer = 0; volatile uint8_t zehner = 0; void zaehlen (uint8_t zahl) { for(;;) { zahl = (zahl*2); //hier scheint was schief zu gehen zehner = (zahl / 10) | 0x30; einer = (zahl % 10) | 0x30; lcd_move_cur(LCD_LINE_2,3); lcd_putc(zehner); lcd_move_cur(LCD_LINE_2,4); lcd_putc(einer); } Gruss
//Globale Var. volatile uint8_t data; volatile uint8_t einer = 0; die for(;;) schleife gehört da nicht mehr rein. Hatte vergessen sie zu entfernen. volatile uint8_t zehner = 0; void zaehlen (uint8_t zahl) { zahl = (zahl*2); //hier scheint was schief zu gehen zehner = (zahl / 10) | 0x30; einer = (zahl % 10) | 0x30; lcd_move_cur(LCD_LINE_2,3); lcd_putc(zehner); lcd_move_cur(LCD_LINE_2,4); lcd_putc(einer); } Gruss
Ist doch klar. Du verdoppelst die Zahl. Da können nur noch gerade Zahlen rauskommen. "int" kann ja keine Kommastellen speichern.
@ Anfänger Gast (Gast) >kann mir jemand einen Tipp geben, warum wenn ich die Variable zahl >verdoppel sie dann nicht mehr richtig auf dem LCD angezeigt wird? Er >macht 2 4 6 u.s.w. sprünge. Nimmst du Drogen? Was soll den sonst rauskommen, wenn du die Zahl vor der Anzeige verdoppelst? MFG Falk
Du verdoppelst eine lokale Kopie von zahl, die ursprüngliche zahl-Variable aus der main-Methode bleibt unangetastet. Übergib einfach mal nur den Zeiger, dann kannst du sie auch ändern.
@Falk Brunner ne Drogen nehme ich nicht. Ich dachte nur, dass wenn ich z.b. eine 25 übergebe, dass dann mit der zahl = (zahl*2); daraus eine 50 wird. Nur das vedoppeln will ich erreichen. Gruss
@ Olli (Gast) >ne Drogen nehme ich nicht. Ich dachte nur, dass wenn ich z.b. eine 25 >übergebe, dass dann mit der zahl = (zahl*2); daraus eine 50 wird. Das wird es auch. Aber nur bei der Kopie IN der Funktion, nicht der Zahl, welche beim Funktionsaufruf dort eingesetzt wird. Stichwort Call by reference, Call by value. > Nur das vedoppeln will ich erreichen. Und warum machst du das nicht einfach VOR dem Funktionsaufruf? MFG Falk
ich habe jetzt die main folgendermassen abgeändert. Und trotzdem ist das Ergebnis falsch. Was mache ich falsch? void main (void) { for(;;) { zahl++; zahl = (zahl*2); //hier scheint was schief zu gehen zehner = (zahl / 10) | 0x30; einer = (zahl % 10) | 0x30; lcd_move_cur(LCD_LINE_2,3); lcd_putc(zehner); lcd_move_cur(LCD_LINE_2,4); lcd_putc(einer); } }
Anfänger Gast schrieb: > ich habe jetzt die main folgendermassen abgeändert. Und trotzdem ist das > Ergebnis falsch. Nämlich wie? Erwarten würde ich von deinem Programm 2 6 14 30 .... > Was mache ich falsch? Du machst Hauruckprogrammierung (Welche Ausgabe ist eigentlich richtig?)
@ Anfänger Gast (Gast) >ich habe jetzt die main folgendermassen abgeändert. Und trotzdem ist das >Ergebnis falsch. Welches Ergebnis erwartest du denn? > Was mache ich falsch? Du weisst nicht was du willst ;-) >void main (void) >{ > for(;;) > { > zahl++; Wie ist zahl initialisiert? Wahrscheinlich mit 0. Also ist Zahl hier 1. > zahl = (zahl*2); //hier scheint was schief zu gehen Nöö, hier wird aus 1 eine 2. Im nächsten Schleifendurchgang wird aus zahl eine 3, dann 6, dann 7 dann 14. Ach ja, und da das alles sehr fix geht, sieht man wahrscheinlich nur wirres Zeug ;-) MFG Falk
das er mir das doppelte von zahl, auf mein lcd ausgibt. Mir geht es darum die Variable Zahl zu verdoppeln, bevor er sie zerlegt und auf dem LCD ausgibt. gruss
@Anfänger Gast (Gast) >das er mir das doppelte von zahl, auf mein lcd ausgibt. Mir geht es >darum die Variable Zahl zu verdoppeln, bevor er sie zerlegt und auf dem >LCD ausgibt. Dann wäre es sinnvoll, eine zweite Variable zu nutzen . . . MFG Falk
. Aber wie könnte ich das lösen, dass er mir genau das Dopelte von ausgibt. Also z.b.: zahl 3, Ausgabe 6 , zahl ist 4 Ausgabe 8 u.s.w.?
Du musst aufpassen, in welcher Funktion du was wie änderst. Hinter "Zahl" steckt zunächst eine Speicherzelle. Den Inhalt änderst du dauernd... mit z=z*2 wird die zahl verdoppelt, mit z++ um eins erhöht. deshalb ist logisch, dass das ergebnis herauskommt, das KH Buchegger beschrieben hat. Wenn du mit 2 Variablen arbeitest wird das klarer: z=0; s=0; for (;;) { z++; s=z*2; ausgeben(z); ausgeben(s); } für z kommt dann:1,2,3,4,5 für s demnach:2,4,6,8,10
Anfänger Gast schrieb: > das er mir das doppelte von zahl, auf mein lcd ausgibt. Mir geht es > darum die Variable Zahl zu verdoppeln, bevor er sie zerlegt und auf dem > LCD ausgibt. Warum zählst du dann 1 zu Zahl dazu? Du möchtest also das hier? 1, 2, 4, 8, 16, 32, 64, 128 (Wenn du den Überblick verlierst, dann spiel einfach selber Computer! Du beginnst (jetziges Programm miti Zahl == 0 zahl zahl++ zahl = 2*zahl 0 1 2 zahl ist also nach dem ersten Durchlauf 2. weiter gehts 2 3 6 im nächsten Durchgang kommt dann 6 raus 6 7 14 14 -> 15 -> 30 30 -> 31 -> 62 62 -> ... Auch wenn man einen Computer hat, ist es nicht verboten im Kopf mitzurechnen.
Du willst nur bei der ausgabe verdoppeln? Dann: ausgeben(btoa(z*2)); Aber vorsicht beim Überlauf! Ein Byte geht nur bis 255!
Mir geht es darum, das die Variable zahl, die z.b. 15 gerade ist, verdoppelt wird, so das auf meinem LCD immer das doppelte von der zahl anzeigt.
Anfänger Gast schrieb: > . Aber wie könnte ich das lösen, dass er mir genau das Dopelte von > ausgibt. Also z.b.: zahl 3, Ausgabe 6 , zahl ist 4 Ausgabe 8 u.s.w.? Indem du zb 2 Variablen benutzt. In der einen wird gezählt: 1, 2, 3, 4, 5 Die anderen erhält ihren Wert als das Doppelte der Ersten Und die Zweite gibst du aus zahl doppel = 2 * zahl 1 -> 2 2 -> 4 3 -> 6 4 -> 8 ... du könntest aber auch ganz einfach zu Zahl immer 2 dazu zählen, anstelle von 1 :-) Viele Wege führen nach Rom
Oder ganz trivial: for(;;) { zahl++; zehner = ((zahl *2) / 10) | 0x30; einer = ((zahl *2) % 10) | 0x30; lcd_move_cur(LCD_LINE_2,3); lcd_putc(zehner); lcd_move_cur(LCD_LINE_2,4); lcd_putc(einer); }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.