PDA

Visualizza la versione completa : [c] tipo di una variabile dipendente da un parametro


bigmickey
07-04-2010, 16:17
Devo leggere e conteggiare dei record da file con diverse estensioni. L'estensione del file determina anche il tipo di record. Nello specifico ho queste due funzioni nel codice.



record_size=sizeof(record);
fread(&record, sizeof(record), 1, pf_bin);


A seconda di un parametro (l'estensione del file in ingresso al main), il record può essere ad esempio



typedef struct record1
{
uint32 packet_counter; // Contatore pacchetti
float prog;
float speed;
} RECORD1;

typedef struct record2
{
uint32 packet_counter; // Contatore pacchetti
uint16 rawd1;
uint16 rawd2;
} RECORD2;


Non so a priori come dichiarare record tra:



RECORD1 record;
RECORD2 record;


E' risolvibile questa situzione? O sono costretto a raddoppiare le dichiarazioni e le funzioni?



RECORD1 record1;
RECORD2 record2;

if (estensionefile==1)
{
record_size=sizeof(record1);
fread(&record1, sizeof(record1), 1, pf_bin);
}

if (estensionefile==2)
{
record_size=sizeof(record2);
fread(&record2, sizeof(record2), 1, pf_bin);
}

MItaly
07-04-2010, 16:21
Se record1 e record2 hanno le stesse dimensioni puoi usare una union.

bigmickey
07-04-2010, 16:24
No sono proprio diversi

MItaly
07-04-2010, 16:50
Se fosse C++ forse si potrebbero usare (con cautela, in questo caso) i template, ma in C non mi vengono in mente altre soluzioni... forse puoi cavartela con qualche trucco strano di macro, ma è facile che venga fuori una porcata.

linoma
07-04-2010, 16:54
I templates e le classi nn fanno altro che nascondere il grosso lavoraccio dei puntatori e nn solo a dati ma anche funzioni. Cmq se continui su questa strada la union e obbligatoria.

bigmickey
07-04-2010, 17:10
x Mitaly

La porcata delle marco l'ho già fatta deh.

era



#define RECORD RECORD1
//#define RECORD RECORD2

RECORD record;


e tutto il codice si riferiva a record.
Commentavo e decomentavo ogni volta.
Però devo ricompilare ogni volta..... è proprio questo che volevo evitare.


sarebbe stato troppo bello se avessse funzionato



if (estensione==1)
{
#define RECORD RECORD1
}


ma sono direttive del preprocessore.... non funge.


x linoma
Dei template ne ho solo sentito parlare.... volevo risolvere il tutto in C :(

linoma
07-04-2010, 17:12
Bhe se la tua applicazione è all'inizio e nn hai capito cs ho scritto prima, passa a c++. Cmq mi risulta strano dalla tua firma questa domande, ti devo inviare preventivo?

bigmickey
07-04-2010, 17:51
1) Ripeto che sto cercando di risolvere in C, se non hai capito quello che ho scritto
2) Il sistema binario e dei frammenti di C sono la stessa cosa?
3) Che centra il preventivo ?

4) Avevo letto male, pensavo fossi tu che mi suggerissi i template , invece hai suggerito le union ecco qui...



union RECORD {
RECORD1 record1;
RECORD2 record2;
};

union RECORD record;



poi ?
come le uso queste due funzioni?



record_size=sizeof(record);
fread(&record, sizeof(record), 1, pf_bin);


cosa mi darebbe sizeof(record) la dimensione del più grande dei due.... o sbaglio?

linoma
07-04-2010, 17:57
Io farei in qesuto modo per farti capire, fare due funzioni nella quale leggi il record, poi in base all'estensione cambierei il puntatore (o puntatori) alla funzione e poi la chiamere, la union rende + leggibile anche il codicei.
Grosso modo il C++ farebbe questo. Per il resto ti passerei la mia segretaria? Sai sta x andare via :D

oregon
07-04-2010, 18:31
Usi la union e determini la quantità di dati da leggere con uno switch (o con un vettore di appoggio) prima di usare la fread.

Loading