Dann hast du denn Sinn von switch-case nicht verstanden!
1 | unsigned char i = 0;
|
2 |
|
3 | if (i == 0)
|
4 | {
|
5 | // Rufe Funktion 1 auf
|
6 | }
|
7 | else
|
8 | if (i == 1)
|
9 | {
|
10 | // Rufe Funktion 2 auf
|
11 | }
|
12 | else
|
13 | {
|
14 | // Rufe Default Funktion auf
|
15 | }
|
das ganze analog als switch-case sieht so aus:
1 | switch(i)
|
2 | {
|
3 | case 0: // Rufe Funktion 1 auf
|
4 | break;
|
5 | case 1: // Rufe Funktion 2 auf
|
6 | break;
|
7 | default:
|
8 | // Rufe Deault Funktion auf
|
9 | break;
|
10 | }
|
Überleg dir mal wie dein Compiler etwas derartiges wie du es vorhat
vernünftig (effektiv) in Assembler umsetzen sollst.
Du willst ja so etwas wie:
1 | unsigned char i =0;
|
2 | unsigned char j =1;
|
3 | unsigned char k =2;
|
4 |
|
5 | if (i == j)
|
6 | {
|
7 |
|
8 | }
|
9 | if (i == k)
|
10 | {
|
11 |
|
12 | }
|
Bissl pervers, oder? Oder was passiert, wenn j == k ? Wie schon oben
geschrieben hast du dann Mehrdeutigkeiten und keine gescheite Logik
mehr.
Bei meinem Compiler ist es wirklich so, dass ein switch-case effektiver
(weniger Code) ist, als ein verschachteltes if-else.
Mein Compiler macht das mit Sprungtabellen (ähnlich wie das Beispiel
oben)
Wobei das für einen Anfänger, der den Sinn von switch-case noch nicht
begriffen hat, total over-sized ist.
Ein Beispiel für den Einsatz von switch-case sind State-Machines.
Oder ganz einfach wenn EINE Variable mehr als 2 Zustände einnehmen kann,
dann bietet sich ein switch-case an.
Aber Variablen mit Variablen vergleichen zu wollen ist mit switch-case,
wie schon erwähnt nicht möglich!
Übrigens ist die Berechnung eines Index in einem Array auch nicht
"umsonst" ;-)
Und wo bitte hast du damit dein Problem gelöst, dass du Variablen
effektiv mit Variablen vergleichen willst?
Und wenn ist das nicht mit einem 1-dimensionalen Array zu machen,
sondern man braucht ein 2-dimensionales!
1 | typedef void (*fcnptr_t)(void);
|
2 |
|
3 | #define MAX_Y 3
|
4 | #define MAX_X 3
|
5 |
|
6 | fcnptr_t tabelle[MAX_Y][MAX_X] = { {f00, f01, f02},
|
7 | {f10, f11, f12},
|
8 | {f20, f21, f22}
|
9 | }; // lauter Funktionen
|
10 |
|
11 | und dann aufrufen mit
|
12 | tabelle[i][j]();
|
Damit kannst du dann wirklich eine Funktion in Abhängigkeit von 2
Variablen aufrufen. Bei 3 usw. Variablen wird das ganz umso komplexer.
Aber allein durch die Berechnung des Indizes hast du so viel Overhead,
dass eine anderes Strategie sicher effektiver wäre.
cheers