Getter & Setter-Schnittstelle für verschiedene Structs
-
Hallo Leute,
zur Zeit sitze ich an einem kleinen Projekt, bei dem eine Speicherstruktur für Konfigurationsparameter angelegt werden soll. Diese soll unterschiedliche Arten von Elemente beinhalten. Z.b. besteht eine IP-Adresse aus vier byte-großen Feldern, eine Mac-Adresse aus 6 und für andere Parameter reicht ein einzelner int-Wert. Hier mal mein Ansatz:
struct { char name[20]; uint16 value; uint16 default_value; } Storage_default; typedef struct { char name[20]; uint8 ip[4]; uint8 default_ip[4]; } Storage_ip; struct { // -- storage items Storage_ip my_ip; Storage_default my_example; } StorageStructure;
Mein Ansatz ist nun der, dass in einem Container (StorageStructure) die einzelnen Elemente zusammengefasst werden und über den Namen oder eine Such-Funktion, die anhand des Wertes name[] das entsprechende Element raussucht, adressierbar sind.
Das Ziel ist eine einheitliche Schnittstelle für Getter- und Setter-Methoden der einzelnen Elemente. Kann ich das über type-casts lösen und wenn ja, wie sollte soetwas aussehen in ANSI-C? Überladen ist ja nicht möglich, aber irgendwie mit Pointern und casten sollte es möglich sein, dafür fehlt mir nur das Wissen.
Es ist eines meiner ersten Projekte und das auch noch im Embedded-Bereich. Sprich möglichst platzsparend und effizient.
Ich freue mich auf eure Ratschläge. Gerne auch komplett andere Ansätze.
Grüße
Max
-
Unions könntest zu z.B. statt deiner angedachten Casts verwenden,
die Typisierung solltest du jeweils im Element mit vermerken,
um dann später wieder entsprechend wieder zu können:enum {STRING,BYTE,BYTES,INT,INTS}; #define WERT(t) t.typ==BYTE?*(char*)&t.wert:t.typ==INT?*(int*)&t.wert:t.typ==INTS?(int*)&t.wert:(char*)&t.wert #define VORGABE(t) t.typ==BYTE?*(char*)&t.vorgabe:t.typ==INT?*(int*)&t.wert:t.typ==INTS?(int*)&t.vorgabe:(char*)&t.vorgabe #define WERTX(t,x) t.typ==INTS?((int*)&t.wert)[x]:((char*)&t.wert)[x] #define VORGABEX(t,x) t.typ==INTS?((int*)&t.vorgabe)[x]:((char*)&t.vorgabe)[x] typedef union { char str[100]; char byte,bytes[8]; int integer,ints[8]; } Wert; typedef struct { char *name,typ; Wert wert,vorgabe; } Konfig; Konfig k[10]; k[0].name="Parameter1"; k[0].typ=STRING; strcpy(k[0].wert.str,"wert01"); strcpy(k[0].vorgabe.str,"wertvorgabe"); k[1].name="Parameter2"; k[1].typ=BYTE; k[1].wert.byte=1; k[1].vorgabe.byte=0; k[2].name="Parameter3"; k[2].typ=INTS; k[2].wert.ints[0]=0x1111;k[2].wert.ints[1]=0x2222; k[2].vorgabe.ints[0]=0xaaaa;k[2].vorgabe.ints[1]=0xbbbb; printf("(%s):%s Default:%s",k[0].name,WERT(k[0]),VORGABE(k[0])); printf("(%s):%d Default:%d",k[1].name,WERT(k[1]),VORGABE(k[1])); printf("(%s):%x%x Default:%x%x",k[2].name,WERTX(k[2],0),WERTX(k[2],1),VORGABEX(k[2],0),VORGABEX(k[2],1));
Beispiel für die gängigen Typen wie String, Byte, Bytefolge, Int, Intfolge.
Fehler eigentlich bloß noch Datum, aber das geht wohl einfacher innerhalb eines Strings.
-
Wow, vielen Dank!
Das sieht schon sehr gut aus, ich werde es mal damit probieren.
Nochmals danke für deine Mühe!