mikrocontroller.net

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


Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
  }

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Also ungefähr so:

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

else
{
Anweisung;
}

Autor: MicroMann (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Guest (Gast)

>Also ungefähr so:

nein, eher so

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

MFG
Falk

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
extern void a(void);
extern void b(void);
extern void c(void);

#include <avr/io.h>

void
evaluate(void)
{
        int8_t diff;

        diff = OCR0A - OCR0B;

        if (diff < 0)
                a();
        else if (diff == 0)
                b();
        else if (diff > 0)
                c();
}

Stellt man den Code geringfügig um, dann klappt's:
extern void a(void);
extern void b(void);
extern void c(void);

#include <avr/io.h>

void
evaluate(void)
{
        int8_t diff;

        diff = OCR0A - OCR0B;

        if (diff < 0)
                a();
        else if (diff > 0)
                c();
        else if (diff == 0)
                b();
}

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würds ja so schreiben:
extern void a(void);
extern void b(void);
extern void c(void);

#include <avr/io.h>

void
evaluate(void)
{
        int8_t diff;

        diff = OCR0A - OCR0B;

        if( diff ){
          if( diff & 1<<7 ){
            a();    // negativ
          }else{
            c();    // positiv
          }
        }else{
          b();      // 0
        }
}


Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Dannegger (peda)

>Ich würds ja so schreiben:

Ist das besser und schneller? Ich find ziemlich kryptisch.

MFG
Falk

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Gast (Gast)

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

http://www.hausaufgaben.de

MfG
Falk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na super, nen MC-Thread mit ner Java-Frage gehijackt.


Selbst ein Elefant im Porzellanladen benimmt sich besser.


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.