Forum: Mikrocontroller und Digitale Elektronik Switch / Case Anweisung mit Bedingung


von Guest (Gast)


Lesenswert?

Hallo,

würde folgende Anweisung so funktionieren:


signed char register;

register = (OCR0A - OCR0B);

switch(register)
    {

    case =0:
        Anweisung;
  break;

  case <0:
  Anweisung;
  break;

        case >0:
  Anweisung;
  break;

  default:
  break;
  }

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nein, die case labels müssen explizit benannte Zahlen sein.
Nimm if  else if  else stattdessen.

von Falk B. (falk)


Lesenswert?

@ Guest (Gast)

>würde folgende Anweisung so funktionieren:

Nein, geht nur mit Konstanten.

Aber dafür tut es ein verkettetes if allemal.

MFG
Falk

von Guest (Gast)


Lesenswert?

Danke!

Also ungefähr so:

if (register == 0)
{
Anweisung
}
else if (register >= 0)
{
Anweisung;
}
else if (register >= 0)
{
Anweisung
}

else
{
Anweisung;
}

von MicroMann (Gast)


Lesenswert?

if (register == 0)
{
Anweisung
}
else if (register > 0)
{
Anweisung;
}
else if (register < 0)
{
Anweisung
}

von Falk B. (falk)


Lesenswert?

@ Guest (Gast)

>Also ungefähr so:

nein, eher so

1
if (register == 0)
2
{
3
Anweisung
4
}
5
else if (register > 0)
6
{
7
Anweisung;
8
}
9
else 
10
{
11
Anweisung
12
}

MFG
Falk

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wobei ein guter Compiler aus beiden Formen dasselbe machen sollte, d.h.
er müsste merken, dass die letzte Bedingung nur noch wahr sein kann.

Witzigerweise schnallt es der GCC hier nicht:
1
extern void a(void);
2
extern void b(void);
3
extern void c(void);
4
5
#include <avr/io.h>
6
7
void
8
evaluate(void)
9
{
10
        int8_t diff;
11
12
        diff = OCR0A - OCR0B;
13
14
        if (diff < 0)
15
                a();
16
        else if (diff == 0)
17
                b();
18
        else if (diff > 0)
19
                c();
20
}

Stellt man den Code geringfügig um, dann klappt's:
1
extern void a(void);
2
extern void b(void);
3
extern void c(void);
4
5
#include <avr/io.h>
6
7
void
8
evaluate(void)
9
{
10
        int8_t diff;
11
12
        diff = OCR0A - OCR0B;
13
14
        if (diff < 0)
15
                a();
16
        else if (diff > 0)
17
                c();
18
        else if (diff == 0)
19
                b();
20
}

von Falk B. (falk)


Lesenswert?

@  Jörg Wunsch (dl8dtl)

>Wobei ein guter Compiler aus beiden Formen dasselbe machen sollte, d.h.
>er müsste merken, dass die letzte Bedingung nur noch wahr sein kann.

Sollte ein halbwegs zurechnungsfähiger Programmierer das nicht auch 
direkt so hinschreiben können? Soviel Kompetenz in Mengenlehre sollte er 
doch haben, oder?

MFG
Falk

von I_ H. (i_h)


Lesenswert?

Der Compiler sollte aber auch soviel Grips haben, Stichwort C++ 
Templates und Metaprogrammierung (sehr effizient, aber auch sehr viel 
Arbeit für den Compiler).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Falk Brunner wrote:

> Sollte ein halbwegs zurechnungsfähiger Programmierer das nicht auch
> direkt so hinschreiben können?

Der Punkt bei Compileroptimierungen ist ja, dass der Programmierer
den Code in gut lesbarer Form abliefern sollte, ohne dass er sich
darum kümmern muss, ob da etwas überspezifiziert ist.  Solange da
nur a(), b() und c() gerufen werden, ist die Sache ja auch so
übersichtlich, aber was, wenn da jeweils eine halbe Seite dazwischen
ist?

Die Bedingung in der letzten if-Anweisung ist dann gewissermaßen ein
Kommentar, der die Lesbarkeit verbessert.  Wenn die Compileroptimierung
das nicht schnallt, muss man sich mit dem Weglassen der Bedingung und
einem echten Kommentar behelfen, was a) erfordert, dass man sich den
generierten Code erst noch anguckt und b) ,,unsymmetrisch'' aussieht.

von Peter D. (peda)


Lesenswert?

Ich würds ja so schreiben:
1
extern void a(void);
2
extern void b(void);
3
extern void c(void);
4
5
#include <avr/io.h>
6
7
void
8
evaluate(void)
9
{
10
        int8_t diff;
11
12
        diff = OCR0A - OCR0B;
13
14
        if( diff ){
15
          if( diff & 1<<7 ){
16
            a();    // negativ
17
          }else{
18
            c();    // positiv
19
          }
20
        }else{
21
          b();      // 0
22
        }
23
}


Peter

von Falk B. (falk)


Lesenswert?

@ Peter Dannegger (peda)

>Ich würds ja so schreiben:

Ist das besser und schneller? Ich find ziemlich kryptisch.

MFG
Falk

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Falk Brunner wrote:

> Ist das besser und schneller?

Insbesondere ist es unportabel.  Peters typische Mikro,,optimierungen''
halt.  Genau das, was die Optimierung eines zeitgemäßen Compilers
von allein können soll, damit eben nicht so'n kryptisches Zeug da
steht.

von Gast (Gast)


Lesenswert?

Könnte mir irgendjemand den Aufbau besser erklären? Ich hab zwei 
Aufgaben dazu:
1. Über ein JS-Programm soll eine Notenziffer eingegeben und die 
entsprechende ausgeschriebene Note auf dem Bildschirm erscheinen.

2. Erstelle einen kleinen Taschenrechner über den man zwei Zahlen und 
ein Operatorzeichen (*, /, +, -, ^2) eingibt. Das zum Operator passende 
Ergebnis soll dann auf dem Bildschirm ausgegeben werden.

von Falk B. (falk)


Lesenswert?

@ Gast (Gast)

>Könnte mir irgendjemand den Aufbau besser erklären? Ich hab zwei
>Aufgaben dazu:

http://www.hausaufgaben.de

MfG
Falk

von Karl H. (kbuchegg)


Lesenswert?

Gast wrote:
> Könnte mir irgendjemand den Aufbau besser erklären? Ich hab zwei
> Aufgaben dazu:
> 1. Über ein JS-Programm soll eine Notenziffer eingegeben und die
> entsprechende ausgeschriebene Note auf dem Bildschirm erscheinen.
>
> 2. Erstelle einen kleinen Taschenrechner über den man zwei Zahlen und
> ein Operatorzeichen (*, /, +, -, ^2) eingibt. Das zum Operator passende
> Ergebnis soll dann auf dem Bildschirm ausgegeben werden.

Es gibt unzählige Möglichkeiten wie man die beiden Aufgabenstellungen
lösen kann. Nimm die die du hinkriegst und dein Lehrer wird das
akzeptieren.

von Peter D. (peda)


Lesenswert?

Na super, nen MC-Thread mit ner Java-Frage gehijackt.


Selbst ein Elefant im Porzellanladen benimmt sich besser.


Peter

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
Noch kein Account? Hier anmelden.