smalldragon ha scritto:
ma essendo una funzione generica posso non conoscere la composizione della struttura pippo.
In C ti abbiamo già detto che non esiste. Se devi utilizzare qualcosa devi sapere che cos'è.
anche se mettessi come presupposto un campo noto nella struttura che mi viene passata avrei comunque il problema di capire se effettivamente questo campo nella struttura esista o meno e quindi sarei comunque al punto di partenza!
Deve esserci un patto implicito tra chi programma la funzione e chi la utilizza. Non puoi passare qualcosa che non centra nulla.
Te lo dico ancora:
- se nel prototipo scrivi struct pippo, sai che è esattamente struct pippo e di struct pippo conosci tutto
- se invece scrivi void * allora puoi non sapere che tipo di struttura ti hanno passato, però delle 100 strutture che ti aspetti, utilizza un campo tipoStruct che ti dice che mi ha passato questa struttura.
Esempio:
struct pippo{ // tipo_struct 1
int a;
char b;
}
struct pippo1{ // tipo_struct 2
char a;
int b;
int c;
}
prototipo:
int leggi_file(handle hfile, int tipo_file, int record, int lrecord, char *buffer, int tipo_struct, struct *file);
Quando tipo_struct è 1 sai che è pippo se tipo_struct è 2 sai che è pippo2.
Oppure come ti è stato suggerito pure:
struct pippo{ // tipo_struct 1
int tipoStruct; // inizializzato con 1
int a;
char b;
}
struct pippo1{ // tipo_struct 2
int tipoStruct; // inizializzato con 2
char a;
int b;
int c;
}
prototipo:
int leggi_file(handle hfile, int tipo_file, int record, int lrecord, char *buffer, struct *file);
La prima cosa che deve fare la tua funzione è andare in file->tipoStruct è leggere il valore, quindi sai che struct ti hanno passato.
Spero che ti serva a convincerti che devi usare un artificio per risolvere il tuo problema.