printf(%?, enum)
-
mit printf(%i, enum) geb ich die nummer meines enum-typs aus, wie lass ich ich den namen ausgeben?
Also, wenn ich
enum benutzerstatus{ ADMIN=1, USER };
habe, das ich nicht 1 oder 2 bekomme, sondern ADMIN oder USER.
Geht sowas mit ANSI C ich finde dazu leider nichts im Buch und auch nicht im inet
-
^^geht leider nicht. solche namen sind nur im quelltext vorhanden, im executable sind sie nicht mehr da. du müsstest "admin" und "user" irgendwo als strings unterbringen.
-
achso, alles klar, dann mach ich einfach ne switch-case abfrage, hab nämlich noch n paar typen mehr..
und das ganze in einem array in jedes element zu structen is n speicherfresser und in nem anderen thread wurde mir bei gebracht sowas zu meidenDanke für die schnelle Antwort
-
TTP schrieb:
achso, alles klar, dann mach ich einfach ne switch-case abfrage, hab nämlich noch n paar typen mehr..
und das ganze in einem array in jedes element zu structen is n speicherfresser und in nem anderen thread wurde mir bei gebracht sowas zu meidenDie Array-Lösung ist aber speicherschonender als mit einem switch.
-
Bashar schrieb:
TTP schrieb:
achso, alles klar, dann mach ich einfach ne switch-case abfrage, hab nämlich noch n paar typen mehr..
und das ganze in einem array in jedes element zu structen is n speicherfresser und in nem anderen thread wurde mir bei gebracht sowas zu meidenDie Array-Lösung ist aber speicherschonender als mit einem switch.
Nur, wenn die enums bei 0 beginnen und lückenlos aufsteigen.
-
TTP schrieb:
achso, alles klar, dann mach ich einfach ne switch-case abfrage, hab nämlich noch n paar typen mehr..
enums sind ja ganz praktisch. due könntest z.b. irgendwie sowas machen:
char *benutzerstatus_name (benutzerstatus b) { switch (b) { case ADMIN: return "admin"; case USER: return "user"; case ...: return ...; ... // usw. }
-
#define NAMELEN_MAX 64 typedef struct { int value; char name [NAMELEN_MAX]; }MyEnum; MyEnum me = { 88, "Hugo" };
-
Das mit dem Switch ist nicht so eine gute Idee, da es schlecht erweiterbar und bei vielen Usern unüberischtlich ist. Man baut sich einen "Mapping Table" und eine Funktion die mit hilfe der Id in diesem Table sucht und den NAmen zurückgibt. Also so:
enum { ADMIN = 1, USER, // implizit = 2 PETERLUSTIG, // implizit = 3 N_DEBUG = 22, TOBIAS = 54, TTP = 66, FRICKY = 98 }; typedef struct { int user_id; char user_name[128]; } user_t; static user_t usertable[] = { {ADMIN, "ADMIN"}, {USER, "USER"}, {PETERLUSTIG, "PETERLUSTIG"}, {N_DEBUG, "N_DEBUG"}, {TOBIAS, "TOBIAS"}, {TTP, "TTP"}, {FRICKY, "FRICKY"} }; #define MAX_USERS (sizeof(usertable)/sizeof(user_t)) char *name_for_id(int user_id) { int i; for(i = 0; i < MAX_USERS; i++) if(usertable[i].user_id == user_id) return usertable[i].user_name; return NULL; } int main(void) { printf("%s\n", name_for_id(N_DEBUG)); return 0; }
Willst du nun einen neuen User einfügen, so fügst du ihn im enum mit einer eindeutigen Nummer ein und anschließend noch im usertable mit der Symbolischen Id und dem richtigen Namen. Der Rest läuft von alleine.
-
Der Vorschlag ist aber auch nicht unbedingt optimal, da man lineare Suchzeit hat. Wenn das Ganze grösser wird, wäre vielleicht ein Suchbaum angebracht...
Und da man in C Makros so gerne hat:
#define ENTRY(NAME) {NAME, #NAME} // und die usertable wird zu: static user_t usertable[] = { ENTRY(ADMIN), ENTRY(USER), ENTRY(PETERLUSTIG), ENTRY(N_DEBUG), ... };
Oder man baut es noch mehr aus...
-
Du mußt den table ja nicht linear absuchen. Du kannst ihn auch binär absuchen, wenn die IDs in einer Reihenfolge isnd.
-
NDEBUG schrieb:
Das mit dem Switch ist nicht so eine gute Idee, da es schlecht erweiterbar und bei vielen Usern unüberischtlich ist.
mal ganz davon abgesehen, dass eine hardcodierte userliste sowieso keine tolle idee ist.
-
es soll ja nicht die userliste hardcodiert werden, sonder nur der status des benutzers, also Admin, Benutzer, Besucher... bla bla...
danke für eure tipps, ich guck gleich ma wie ich das umsetzten werde