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
@ 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
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.
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