Unterschiedliche structs als liste in c, aber wie?!
-
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;