[C] Typecheck

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • HammerT
  • Registratie: April 2004
  • Laatst online: 22-08 08:59
Ik zou graag onderscheid willen maken tussen structures in een list. De list werkt ok, dat is verder niet zo'n probleem, ik heb bijvoorbeeld een functie:
C:
1
2
3
4
void *list_index(const List * list, int index) {
    assert(index < list->size);
    return list->data[index];
}


Hierin kunnen verschillende soorten structs staan:
C:
1
2
typedef struct structA { List *x; char *y; List *z; } structA;
typedef struct structB { List *u; char *w; } structB;


Nu wil ik dus weten wat voor type er op een bepaalde index staat, het is totaal willekeurig. Bijvoorbeel zo:
C:
1
2
3
4
structA *A;
structB *B;
A = list_index(list, j);
B = list_index(list, j);


Alleen hoe weet ik nu welke de juiste is? Ik heb gezocht op typeof (ik gebruik GCC die dat ondersteund iig) maar niet gevonden hoe zoiets zou moeten.

[ Voor 0% gewijzigd door HammerT op 22-11-2009 18:02 . Reden: typedef moest zijn typeof ]


Acties:
  • 0 Henk 'm!

  • muksie
  • Registratie: Mei 2005
  • Laatst online: 18:14
Ik ben niet zo'n C expert, maar ik denk dat het lastig wordt omdat je list_index een void* teruggeeft, en je zult zelf op een of andere manier dan moeten weten wat het precieze type is.

Je zou het misschien met een union en een hulpvariable voor het bijhouden van het type kunnen doen, ongeveer zoiets:
C:
1
2
3
4
5
6
7
8
9
union el_value {
  structA a;
  structB b;
};

typedef struct elem {
  el_value value;
  unsigned int type; // om bij te houden wat voor type value heeft, bijv. 0=structA, 1=structB
} elem;

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:53
In C heb je at runtime geen typeinformatie meer, dus als je dat onderscheid wil maken moet je de structs taggen (bijvoorbeeld zoals muksie voorstelt). typeof is geen standaardconstructie en helpt je hier ook niet: het geeft je de mogelijkheid om aan het type van een variabele te refereren zonder dat je weet wat voor type dat is. Dat is handig om bepaalde macro's te schrijven, maar het blijft een compile time constructie, en je hebt er niets meer aan om at runtime het type te bepalen.