Zahl verdoppeln und anzeigen

Gast #1662161
Lesenswert?

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
Gast #1662167
Lesenswert?

//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
#1662174
Lesenswert?

@  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
#1662212
Lesenswert?

@  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
Gast #1662328
Lesenswert?

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);
  }

}
#1662331
Lesenswert?

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?)
#1662337
Lesenswert?

@  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
#1662345
Lesenswert?

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
#1662346
Lesenswert?

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.
#1662352
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren