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; }
Nein, die case labels müssen explizit benannte Zahlen sein. Nimm if else if else stattdessen.
@ Guest (Gast)
>würde folgende Anweisung so funktionieren:
Nein, geht nur mit Konstanten.
Aber dafür tut es ein verkettetes if allemal.
MFG
Falk
Danke! Also ungefähr so: if (register == 0) { Anweisung } else if (register >= 0) { Anweisung; } else if (register >= 0) { Anweisung } else { Anweisung; }
if (register == 0) { Anweisung } else if (register > 0) { Anweisung; } else if (register < 0) { Anweisung }
@ 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
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 | }
|
@ 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
Der Compiler sollte aber auch soviel Grips haben, Stichwort C++ Templates und Metaprogrammierung (sehr effizient, aber auch sehr viel Arbeit für den Compiler).
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.
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
@ Peter Dannegger (peda)
>Ich würds ja so schreiben:
Ist das besser und schneller? Ich find ziemlich kryptisch.
MFG
Falk
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.
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.
@ Gast (Gast) >Könnte mir irgendjemand den Aufbau besser erklären? Ich hab zwei >Aufgaben dazu: http://www.hausaufgaben.de MfG Falk
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.