Gast
#3008996
Hallo, ich habe hier ein Programmfragment in C Ist es nicht besser das als Tabelle zu machen, anstelle von switch/case?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
Wie am besten?
|
Anzeige
|
switch case vs. Tabelle
Gast
#3008996
Hallo, ich habe hier ein Programmfragment in C Ist es nicht besser das als Tabelle zu machen, anstelle von switch/case?
Wie am besten? Bei wie hier sequentiellen Werten ist eine Tabelle vorzuziehen. Kapitän Nuss schrieb: > Hallo, > ich habe hier ein Programmfragment in C > Ist es nicht besser das als Tabelle zu machen, anstelle von switch/case? Mit ein bischen Glück macht der Compiler sowieso daraus eine Tabelle. Ich würds allerdings trotzdem händisch in Tabellenform überführen. Schon alleine deswegen, weil das den Code nicht so in die Länge zieht. Kapitän Nuss schrieb: > Ist es nicht besser das als Tabelle zu machen, anstelle von switch/case?
Der GCC 4.7.2 scheint da deiner Meinung zu sein. :-)
Gast
#3009059
ich hab es mal als Tabelle geschrieben:
So besser?
Gast
#3009086
@Autor: Jörg Wunsch (dl8dtl) Wow, der GCC 4.7.2 ist ja voll schlau. Besten Dank dafür! Aber Sorry, ich hätte erwähnen müssen, das mein µC ein ADuC7126 und der Compiler der Keil Realview??? ist. Mein Fehler. Ich denke, ich lasse das jetzt so als Tabelle. Kann man (nur so interessenhalber) das noch anders programmieren? Diese Tabelle wird ja nur einmal lokal benötigt.
Gast
#3009091
Da du mouse_piano aus Zweierpotenzen abfragst, kannst du die Werte für mouse_piano auch direkt aus den abgefragten Bits bestimmen. z.b. ist (GP0DAT & (1<<1)) enweder 2 oder 0. Bei 2 addierst du aber 1 zu mouse_piano, also:
Wenn man alle vier Fälle zusammenfasst ergibt sich:
Kapitän Nuss schrieb: > Aber Sorry, ich hätte erwähnen müssen, das mein µC ein ADuC7126 und der > Compiler der Keil Realview??? ist. Tja, du schreibst aber gerade im GCC-Forum ... Kapitän Nuss schrieb: > Kann man (nur so interessenhalber) das noch anders programmieren? Natürlich. Schau dir die case Werte an. Die sind schön regelmässig aufsteigend. Schau dir die zugewiesenen Werte an. Auch dort ist so etwas wie ein regelmässiges Muster zu erkennen. Das legt es nahe, dass es eine Formel geben muss, die das eine in das andere überführt. Sieht man sich die Zahlen mal genauer an, dann entdeckt man schnell eine Art 3-er Gruppierung. Zugewiesen werden im Grunde immer nur die 3 Zahlen 1, 2 und 5 mit jeweils einem anderen Faktor einer Zehnerpotenz. nimmt man also den Rest von parameter1 bei der Division durch 3, dann sagt einem dieser Rest, ob man jetzt mit 1, 2, oder 5 zu hantieren hat. Und das Divisionsergebnis selber sagt einem, wieviele 0-en noch an diese 1, 2 oder 5 anzuhängen sind. Aus dieser Beobachtung jetzt eine Idee für ein algorithmisches Verfahren (zb auch unter Zuhilfenahme 1 oder 2 Tabellen) herzuleiten, ist dann nicht mehr weiter schwer. Nur lohnt sich das in diesem Fall bei 15 Zahlen nicht. Anders sieht es aus, wenn man eine wirklich große Tabelle hätte, die auch regelmässig gewartet werden muss. Dann wird eine einzige Tabelle mit vielen Einträgen schnell unübersichtlich.
Gast
#3009111
Jörg Wunsch schrieb: > Tja, du schreibst aber gerade im GCC-Forum ... sorry stimmt, war aber keine böse Absicht, nur Gedankenlosigkeit. Schade das wir hier kein Keil-Realview-Forum haben! Kapitän Nuss schrieb: > Jörg Wunsch schrieb: >> Tja, du schreibst aber gerade im GCC-Forum ... > > sorry stimmt, war aber keine böse Absicht, nur Gedankenlosigkeit. > > Schade das wir hier kein Keil-Realview-Forum haben! Schreib einfach dazu, dass du den Keil Compiler benutzt. Abgesehen davon wird das gcc Forum sowieso immer mehr zu einem "C Fragen, die auf einem µC auftreten" Forum. (Im Gegensatz zu all dem PC-spezifischen Dingen, die gehören ins PC-Forum). Die Moderatoren hatten das mal untereinander diskutiert und ich glaube mich zu erinnern, dass wir darüber soweit Konsensus hatten, das gcc Forum mehr als "C Forum für den AVR" anzusehen. In diesem Sinne hat Jörg schon recht: gcc ist die Default-Annahme. Wenn die nicht stimmt, sollte man das erwähnen. Kapitän Nuss schrieb: > Ist es nicht besser das als Tabelle zu machen, anstelle von switch/case? Es gibt Fälle, in welchem switch/case besser abschneiden kann: - Im Falle von switch/case mit einem const Parameter optimiert der Compiler den Rest u. U. weg (evtl. auch nur bei C++). - Ebenso im Falle von templates, in welchem das switch/case vom Template-Parameter abhängt. A. K. schrieb: > Bei wie hier sequentiellen Werten ist eine Tabelle vorzuziehen. Das kann GCC selba mit -ftree-switch-conversion, automatisch aktiviert ab -O<guckst-du-in-doku>. Johann L. schrieb: > Das kann GCC selba mit -ftree-switch-conversion, automatisch aktiviert > ab -O<guckst-du-in-doku>. Yep, siehe oben. Tabelle ist jedenfalls nicht schlechter, bei sicherlich vielen Compilern aber besser. Wie hält sein Keil das? A. K. schrieb: > Johann L. schrieb: >> Das kann GCC selba mit -ftree-switch-conversion, automatisch aktiviert >> ab -O<guckst-du-in-doku>. > > Yep, siehe oben. Ja, lesen hilft ;-) > Tabelle ist jedenfalls nicht schlechter, bei sicherlich > vielen Compilern aber besser. Bei avr-gcc liegt die Tabelle jedenfalls im RAM (.rodata), siehe auch PR49857: http://gcc.gnu.org/PR49857 Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|