Unterschiedliche structs als liste in c, aber wie?!
-
tach leute,
ich bräuchte da eine doppelt verkettete Liste mit structs die alle unterschiedlich sind, sprich sich in der Anzahl und der Art ihrer Paramater unterscheiden. Kann man sowas überhaupt mit C hinkriegen. Das ganze soll als LCD-Menuesteuerung verwurstet werden. Schreibe sonst in C++. In C ist sowas wie die STL für unseren ATMEL Kontroller nicht zu verwenden.
Wenn da einer was kennt -> bitte melden
-
struct member{ int membertype; // verschiedene Daten void *last; void *next; }
Wenn du so alle deine Strukturen aufsetzt sollte es gehen. Du kannst die Strukturen jeweils in ein int casten und dann auf membertype zugreifen und auslesen um welchen Strukturtyp es sich letzendlich handelt.
Evtl. (weiss nicht was du alles in den Strukturen haben willst) wären nested Unions aber eleganter?
-
struct member{ int membertype; void *pData; //und hier jeweils die unterchiedlichen Datentypen anhaengen void *last; void *next; }
-
Auch eine Möglichkeit, aber da wären die Strukturen ja immer gleich
-
TactX schrieb:
Auch eine Möglichkeit, aber da wären die Strukturen ja immer gleich
Aber nur so gehts denn sonst findet der compiler die last und next pointer nicht.
Mit etwas Aufwand und Tricks würde es auch so mit verschiedenen Strukturen funktionierenstruct member{ int membertype; void *last; void *next; // verschiedene Daten }
Kurt
Edit: gebe zu deine version würde auch funktionieren dann müsste man die adresse der last und next pointer aber jedesmal erst berechnen.
-
Danke erstmal für die schnellen Antworten,
das Projekt sieht bei mir wie folgt aus:
- ich möchte über ein LCD durch ein Menu scrollen.
- die einzelnen Unterpunkte sind sowas wie Tiefpass, Hochpass, Bandpass.....
- jeder dieser Filter hat jetzt unterschiedliche Parameter, die ich über ein
Drehrad verstellen möchte.Wenn ich mir nun eine Liste nach Deinem Vorgehen aufbaue, brauche ich doch irgendwie einen Zeiger, oder sowas, der mir die gerade zubearbeitende Struct angibt, oder.
Wie geht sowas denn dann,
-
Über membertype kann man ja gerade den Typ der Struktur identifizieren und weiss folglich auch in welchen Struktur* gecastet werden muss.
Edit: Bezieht sich auf ZuK
-
Hast recht. Hatte wohl einen knopf im gehirn
aber trotzdem mit MBCS-CITP's und meiner Version wäre das iterieren einfacher. Mit deiner Version müsstest du immer erst den typ bestimmen um an die pointer zu kommen.
-
Kann man das auch irgendwie über ein Array handhaben, etwa so:
typedef void (*pStruct); struct Tiefpass { int Knickfrequenz; } struct Hochpass { int Knickfrequenz; } struct TiefPass myTP; struct HochPass myHP; int Wert_aus_Struct; pStruct Arr[2]; Arr[0] = &myTP; Arr[1] = &myHP; Wert_aus_Struct = Arr[0].Knickfrequenz;
dann könnte man einfach das Feld durchgehen.
-
Beim zugriff auf das array weist du dann aber nicht mehr was da drin war. der tip mit dem membertyp war schon gut.
Kurt
-
Mache ich dann auch so, sieht ja doch sinnig aus. Besten Dank und bis denn!
-
Bei meiner Methode gibtes evntl. Probleme mit dem Zugriff. Ich denke hier ist - ausnahmsweisemal - eine UNION angemessen:
typdef { /* DataTypen 1 und Datatypen 2 und Datatypen 3 ... jeweils als sperate Strucs*/ } CommonData; struct { int iDataType; CommonData *pData; member *pNext, *pBefore; } member;
-
@MBCS-CITP. Denke das macht keinen keinen grossen Unterschied.
1.Versionswitch ( pMember->iDataType ) { case 0: ((DataTypen0*)pMember->pData)->feld_name = 0;
2.Version
switch ( pMember->iDataType ) { case 0: pMember->pData->type0.feld_name = 0;
Kann mich nicht entscheiden was schöner ist. Intuitiv ist beides nicht und ausserdem hat die 2.Version noch den Nachteil dass die union up-to-date gehalten werden muss.
Kurt
-
Hallo!
Bin arbeite mit FrankyBoy zusammen an diesem Problem.
Bin jetzt an folgender Stelle:typedef struct{ struct VCF myVCF; struct ParamEQ myParamEQ; struct CrossOver myCrossOver; struct Limiter myLimiter; struct Delay myDelay; } CommonData; struct Liste{ int menu_entry; CommonData *pData; struct Liste *next; struct Liste *previous; }; struct Liste *myListe;
Ich hätte also gerne 5 Einträge in myListe (myVCF, myParamEQ usw.), deren Strukturen wieder Parameter haben, die ich setzen möchte.
Wie lege ich nun die Daten an und vor allem: Wie verkette ich die Listen, so dass ich mittels myListe->menu_entry und switch-case die entsprechenden Parameter ausgeben kann?Habe schon sowas ähnliches wie
myListe->pData->myParamEQ.menutext = menuarray[1];
ausprobiert (weist einen String zu).
Nur bei der Verkettung habe ich jetzt gerade ein Brett vorm Kopf.Gruß
Markus
-
In diesem Falle wuerde ich, um Speicher zu sparen, eine UNION nehmen:
typedef union{ struct VCF myVCF; struct ParamEQ myParamEQ; struct CrossOver myCrossOver; struct Limiter myLimiter; struct Delay myDelay; } CommonData;