Funktion für unterschiedliche enums
-
Hallo,
ich stehe gerade etwas auf der Leitung:
Ich möchte eine Funktion schreiben der ich als Parameter eine Referenz auf verschiedene enums übergeben kann:
typedef enum {a, b, c} e1; typedef enum {x, y, z} e2; fun(&e1); fun(&e2); void fun(int *p){ }
Der Code funktioniert zwar aber der Compiler (HI-TECH C Compiler für PIC Microcontroller) meckert:
illegal conversion between pointer types
pointer to enum -> pointer to intWie löse ich das Problem?
Danke und LG Wolfgang
-
statt enum int benutzen, void* mit typinformationen and funktion übergeben.
-
Da stimmt eventuell mit dem Design etwas nicht. Wenn man eine Funktion mit unterschiedlichen enums nutzen kann, dann ist das so als ob man eine Haarfarbe mit "Birne" angibt, weil Haarfarben und Obstsorten im gleichen Kontext verwendbar sind.
Wenn du als Programmierer darüber stehst und einfach genau weißt, dass das trotzdem richtig ist, dann spricht da natürlich auch nichts gegen, das einfach brutal per Pointercast zu konvertieren. Trickreich ist jedoch, welche Größe das enum überhaupt hat: Wenn das enum wirklich nur drei Werte hat, kann es leicht sein, dass der dahinterstehende Typ kleiner ist als int, daher meckert der Compiler. Zurecht. Da würde ein brutaler Cast oder ein Umweg über void* zwar den Compilerfehler beseitigen, jedoch würde es dann zur Laufzeit undefiniertes Verhalten auslösen. Ein besserer Weg wäre dann zum Beispiel, den Typen von einem der enums als Funktionsparameter zu nutzen und das andere (gleichgroße!) enum umzuwandeln. Oder mittels eines Makros eine generische Funktion schreiben und diese für beide enum-Typen instanzieren.
Kurz: Was soll das überhaupt genau werden und wieso brauchst du das? wEnn du das sagst, kann dir viel besser geholfen werden.
-
Die Funktion ist Teil einer Zustands-Übergangs-Maschine, der übergebene Parameter ist der aktuelle Zustand. Es gibt allerdings mehrere Sub-Zustände und die Funktion soll für alle verwendbar sein.
Ich denke in dem Fall ist das Design in Ordnung.Wie würde das mit dem Void-Pointer funktionieren? Hab da schon rumprobiert aber das klappt nicht...
-
wolfi_b schrieb:
Die Funktion ist Teil einer Zustands-Übergangs-Maschine, der übergebene Parameter ist der aktuelle Zustand. Es gibt allerdings mehrere Sub-Zustände und die Funktion soll für alle verwendbar sein. Ich denke in dem Fall ist das Design in Ordnung.
Auch wenn die Informationen sehr dürftig sind, sieht mir das nicht nach gutem Design aus. Woher weiß zB.
fun()
Welcher Substate zu welchem State gehört?Warum nicht
typedef enum { a, b, c } state_t; typedef enum { x, y, z } substate_t; void fun( state_t &state, substate_t &substate ) { /* ... */ }
-
warum nimmste nicht int?
int state1[] = {0,1,2}; int state2[] = {3,4,5,6,7,8,9}; int state3[] = {10,11,12,13}; ... int* states[] = {state1,state2,state2, ...};
-
Swordfish schrieb:
wolfi_b schrieb:
Die Funktion ist Teil einer Zustands-Übergangs-Maschine, der übergebene Parameter ist der aktuelle Zustand. Es gibt allerdings mehrere Sub-Zustände und die Funktion soll für alle verwendbar sein. Ich denke in dem Fall ist das Design in Ordnung.
Auch wenn die Informationen sehr dürftig sind, sieht mir das nicht nach gutem Design aus. Woher weiß zB.
fun()
Welcher Substate zu welchem State gehört?Die Funktion hat die Aufgabe alle möglichen Übergänge der Zustandsmaschine zu durchlaufen, wenn ein gültiges Event (function pointer) erkannt wird dann wird ein Zustandswechsel durchgeführt. Die Funktion bekommt den Zustand, die Übergänge, die Events und die Actions (auch function pointer) per Parameter übergeben. Aus diesem Grund ist die Funktion unabhängig vom Subzustand.
Ich habe es jetzt mit void-pointern gelöst. In der Funktion caste ich auf (unsigned char *), mehr als 256 Elemente werden die enums niemals haben, somit sollte ich auf der sicheren Seite sein.
Danke, LG