Go Down

Topic: risolto:Come resettare una struct (Read 212 times) previous topic - next topic

manolomao

Sep 24, 2020, 12:57 pm Last Edit: Sep 25, 2020, 04:53 pm by manolomao
Ciao a tutti, mi trovo con un dilemma; ho una struct con variabili di vario formato
Code: [Select]

struct memo{unsigned long evento_start[17];    
            unsigned long evento_stop[17];        
            unsigned long evento_durata[17];          
            unsigned long durata_programma;
            unsigned  int cadenza_incrementi[6];
             unsigned int lettura_pot[8];  
             unsigned long evento[5];  
             byte traccia[5];                            
};
struct memo memoria;

ad un certo punto del mio sketch decido di azzerare tutti i valori delle variabili.
esiste un modo rapido ed elegante di farlo o devo farlo variabile per variabile??
Io ho fatto così:
Code: [Select]

for (byte i=0;i<17;i++){
                                    memoria.evento_start[i]=0;
                                    memoria.evento_stop[i]=0;        
                                    memoria.evento_durata[i]=0;
                                   }                  
             memoria.durata_programma=0;  
           for (byte i=0;i<5;i++){
             memoria.evento[i]=0xffff;  
             memoria.traccia[i]=0;                        
           }

Grazie.

fabpolli

#1
Sep 24, 2020, 02:37 pm Last Edit: Sep 24, 2020, 02:37 pm by fabpolli
Da una breve ricerca "c reset struct" su google sembra che
Code: [Select]

static const struct memo EmptyStruct;
memoria = EmptyStruct;

Sia una strada percorribile o anche:
Code: [Select]

memset(&memoria, 0, sizeof memoria);

Ma non ho provato nessuna delle due  :)

gpb01

... mi piace più la seconda, che, per altro, ho usato varie volte anche io :D

Guglielmo
Search is Your friend ... or I am Your enemy !

maubarzi

Ma la seconda non fallisce su cose tipo questa che segue?

Code: [Select]

...
memoria.evento[i]=0xffff;
...


perchè mette tutto a zero mentre qui è inizializzata a tutti 1.

Se una struct non ha elemento con valori di default preimpostati, ok, altrimenti...

Maurizio
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

nid69ita

#4
Sep 24, 2020, 03:21 pm Last Edit: Sep 24, 2020, 03:21 pm by nid69ita
Ma la seconda non fallisce su cose tipo questa che segue?
perchè mette tutto a zero mentre qui è inizializzata a tutti 1.

Se una struct non ha elemento con valori di default preimpostati, ok, altrimenti...
Maurizio
Ma la prima, come fai ?   In C standard non conosco valori di default per una struct   (forse in C++ si ? )
my name is IGOR, not AIGOR

fabpolli

#5
Sep 24, 2020, 03:22 pm Last Edit: Sep 24, 2020, 03:22 pm by fabpolli
Se una struct non ha elemento con valori di default preimpostati, ok, altrimenti...

Maurizio
Già ;)

gpb01

Ma la prima, come fai ?   In C standard non conosco valori di default per una struct   (forse in C++ si ? )
... credo che la soluzione sia nella parolina "static" ... le variabili statiche vengono, di base, tutte inizializzate a zero dal compilatore.

Resta comunque vero il problema che entrambe le soluzioni inizializzano a 0x00, mente effettivamente sembrerebbe esserci un campo che va inizializzato a 0xFFFF ...

... va beh ... è cosa che potrà fare dopo il memset() con una normale assegnazione  :smiley-mr-green:  :smiley-mr-green:  :smiley-mr-green:

Guglielmo
Search is Your friend ... or I am Your enemy !

nid69ita

#7
Sep 24, 2020, 03:37 pm Last Edit: Sep 24, 2020, 04:43 pm by nid69ita
Ma @maubarzi, da come scrive, mi sembra far intendere che la prima funzioni anche con valori di inizializzazione diversi da 0, ma usando valori di default.   Che non ricordo ci siano in C standard, magari in C++ ci sono ?

Da breve ricerca al primo link trovato, si apre un mondo su valori default per una struct in C/C++    :D :D :D   
Almeno 6 diversi suggerimenti per val default, da macro a funzioni a cose specifiche del gcc    :smiley-mr-green:     
P.S. ma per il C sono "trucchi", nel C++ hanno introdotto valori default link dal C++11
 
my name is IGOR, not AIGOR

maubarzi

#8
Sep 24, 2020, 04:04 pm Last Edit: Sep 24, 2020, 04:08 pm by maubarzi
Ho letto male io il post, pensavo che il pezzo che ho evidenziato fosse dentro alla definizione della struct.
Sorry.

Comunque, a parte la mia svista nel caso specifico, il concetto che volevo esprimere è corretto.
Che poi sul C non sia previsto inizializzare un valore nella struct, è un altro problema che taglierebbe eventualmente la testa al toro.
Ma dalla tua breve ricerca parrebbe si possa fare, quindi anche se il mio intervento parte da un post sbagliato, alla fine era comunque pertinente  :P  ;D

Io le struct ancora non le ho mai usate in modo serio, per cui certi dettagli ancora mi sfuggono.

Ho commentato solo la seconda, perchè mi aveva colpito il totale reset a zero.
Comunque, come dice Guglielmo, un modo semplice per approcciarsi è distinguere in definizione della struct e impostazione dei valori di default da richiamare subito dopo la creazione o il reset.

Maurizio
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

Etemenanki

...
Almeno 6 diversi suggerimenti per val default, da macro a funzioni a cose specifiche del gcc    :smiley-mr-green:
Quel che si dice ll'imbarazzo della scelta ... che vuoi di piu, un lucano ? (o magari una lucana ... :D)

(e comunque, dei tre quarti del contenuto di quel link, ancora non ci ho capito nulla ... troppo poco alcool in circolo, probabilmente ... rimediero' piu avanti :P :D)
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

Standardoil

E molto banalmente creare una variabile struttura 'vuota'  ovvero inizializzata come si deve


E usarla in assegnazione alla variabile da resettare?
Non presurrò più la buona fede di chi:
NON indenta, USA la classe String o NON esegue le ricerche
E di chi non risponde alle domande Tante volte è stato segnalato che è sbagliato, quindi NON sono in buona fede
Non bado a studenti, che copino altrove

maubarzi

Questo non crea frammentazione della memoria, oppure dici di creare la nuova struct locale e opportunamente inizializzata e poi copiarne il contenuto di memoria sulla memoria allocata da quella originaria?

Maurizio
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

gpb01

#12
Sep 24, 2020, 04:56 pm Last Edit: Sep 24, 2020, 04:56 pm by gpb01
E molto banalmente creare una variabile struttura 'vuota'  ovvero inizializzata come si deve ...
Beh, allora tanto vale inizializzare come si deve la struct creata ... sempre se è una sola ... se sono più strutture identiche, allora si, può essere una buona strada, una inizializzata che viene copiata nelle varie strutture ... ::)

Guglielmo
Search is Your friend ... or I am Your enemy !

docdoc

#13
Sep 24, 2020, 05:15 pm Last Edit: Sep 24, 2020, 05:17 pm by docdoc
Bah, se poi vogliamo fare le cose complicate, allora basta trasformare la struct in class e definire quindi il costruttore, per cui si crea ex novo quando serve. ;)

Ma, battute a parte, io voto sicuramente per la soluzione più pratica:

Code: [Select]
memset(&memoria, 0, sizeof memoria);

Una sola istruzione, che fa tutto.
Se poi ci sono solo ALCUNI valori di default diversi da zero, basta aggiungerli dopo la memset().

Se TUTTI o MOLTI dei campi vanno inizializzati con qualcosa di diverso, allora o si fa una funzione resetstruct() che fa questo (soluzione "banale"), oppure si definisce una costante come byte array (es. "const byte memoria0[] = { ...tutti i byte...}") con la sequenza di byte che rappresenta tutti i valori iniziali quindi con una semplice

Code: [Select]
memcpy(memoria, memoria0, sizeof memoria0);

si rimette tutto a posto.
L'unica accortezza durante lo sviluppo, è di mantenere sempre allineate le dimensioni di memoria0 con la struttura.
Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

manolomao

Grazie a tutti per i suggerimenti; credo che userò la
Code: [Select]
memset(&memoria, 0, sizeof memoria);
e poi inizializzo la variabile
Code: [Select]
memoria.evento[i]=0xffff;
Un'istruzione e mi risolve davvero il problema.
Grazie delle spiegazioni.

Go Up