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.
@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.
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:
1
mouse_piano+=(~GP0DAT&(1<<1))>>1;
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.
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