[C] Compatibilità tipi [risolto]
Inviato: dom 3 ago 2008, 4:31
In un programma ho definito un tipo struct con diversi membri al suo interno, eterogenei, alcuni propri del C mentre altri definiti altrove, sempre nello stesso programma.
Secondariamente ho una funzione che riceve l'indirizzo di una variabile del tipo struct incriminato. Questa funzione ha il compito di analizzare una stringa e "compilare" i membri della struttura.
Ora il problema è avere un puntatore generico, che riesca a puntare a un membro qualsiasi della struttura e che riesca a modificarlo attraverso un assegnamento.
Ad esempio, ho la struttura:
In una funzione devo dichiarare un puntatore ptr "compatibile" con tutti i membri e assegnargli l'indirizzo di uno di essi.
A questo punto devo assegnare a ptr il valore di ritorno di una seconda funzione:
quest'assegnamento deve andare a finire nel membro puntato da ptr, s in questo caso, esattamente come se avessi usato:
Ora come ora sto usando un int*:
il programma funziona correttamente, ma durante le compilazione ho:
Ci sono alternative al puntatore int e posso evitare in qualche modo quel warning senza togliere dal makefile -O2 -Wall e senza aggiungere -fno-strict-aliasing ?
Diciamo che la mia è soprattuto una curiosità, come ho già detto il programma funziona, ma non sono sicuro di agire nel modo corretto.
Secondariamente ho una funzione che riceve l'indirizzo di una variabile del tipo struct incriminato. Questa funzione ha il compito di analizzare una stringa e "compilare" i membri della struttura.
Ora il problema è avere un puntatore generico, che riesca a puntare a un membro qualsiasi della struttura e che riesca a modificarlo attraverso un assegnamento.
Ad esempio, ho la struttura:
Codice: Seleziona tutto
struct x {
char *a;
xyz_t *b;
}
Codice: Seleziona tutto
ptr = &x->s;
Codice: Seleziona tutto
*ptr = f()
Codice: Seleziona tutto
x->s = f();
Codice: Seleziona tutto
int *ptr;
ptr = (int *) &x->s;
*ptr = (int) f();
Codice: Seleziona tutto
warning: dereferencing type-punned pointer will break strict-aliasing rules
Diciamo che la mia è soprattuto una curiosità, come ho già detto il programma funziona, ma non sono sicuro di agire nel modo corretto.