Inizializzazione vettori

salve
mi succede questa cosa "strana" che mi fatto un pò ammattire:
in un mio progetto uso dei vettori globali, li definisco ma non li inizializzo (erroneamente!).
Mando in run il progetto (alcuni di questi vettori vengono valorizzati).
Faccio delle modifiche al progetto.
Lo mando nuovamente in run (il contenuto dei vettori non viene valorizzato).
Nei vettori mi ritrovo i vecchi valori.
Sembrerebbe che Arduino, al momento del run non li inizializzi a 0.
Credo che succeda la stessa cosa anche per puntatori, variabili generiche, ...
Se così è bisogna stare molto attenti!
Ho preso un abbaglio oppure è così? :roll_eyes:
grazie

MAI fidarsi dell'inizializzazione di variabili, vettori e quant'altro dato che la cosa dipende da molti fattori (... anche dal compilatore), per cui ... se il valore iniziale può essere problematico, per sicurezza, inizializzare SEMPRE tutto quello che va inizializzato.

Guglielmo

Ma è meglio che posti il codice per evitare di fare confusione.
C'è chi usa il termine definire "li definisco" in modo improprio, io questo termine in programmazione proprio non lo mai usato, posso tollerarlo in merito alle classi C++.

In C/C++ esistono le dichiarazioni e le dichiarazioni e inizializzazione esplicita. Le variabili globali sono sempre inizializzate al loro valore di default, C'è da vedere il tipo di dato usato nella dichiarazioni dei vettori.

Ciao.

Vuoi dire che li dichiari ma non assegni un valore?

@Datman: Esatto ... ora, ad esempio, gcc su AVR, inizializza a 0 le variabili statiche ed a NUL i pointer statici, mentre NON inizializza tutto ciò che è locale ... ma non è detto che tutti i compilatori e su tutte le piattaforme si riscontri lo stesso comportamento, per cui, quando si ha bisogno di essere SICURI che una variabile all'inizio abbia un certo valore ...
... inizializzarla SEMPRE :wink:

Guglielmo

Sì, io considero sempre che contengano valori casuali. Se è importante che una variabile stia a zero, la imposto io.

Oh no....

Invece è detto

Da K&R
Fa parte dello standard

Grazie Datman, normalmente cerco di farlo.
Questa volta me ne ero scordato e ....
Quello che è strano è che le stesse variabili (in questo caso un vettore di interi) è stato allocato esattamente dove prima e quindi mi ritrovavo dei valori non casuali ma bensì quelli precedenti.
È questo che mi ha fregato.
Murphy non perdona.
Grazie a tutti

... vero ... :grin:

4.9 Initialization

External and static variables are initialized to 0, while automatic and register variables are initialized to garbage values.

External and static variables can only be initialized with a constant expression. Initialization is only performed once, upon the first execution of their block/function.

Arrays can be initialized with a given number of empty slots, or with actual values.

Ho corretto il post #5 :slight_smile:

Guglielmo

Quello che dici non è possibile

Dice il saggio: vedere programma trovare bug

Non so se riuscirò a replicarlo.
Domani ci provo.
Grazie

Penso che potrebbe dipendere da come è dove sono allocati l'area dati e quella del codice.
Se i dati sono prima del codice (e non li modifico aggiungendo o eliminandone qualcuno) ed il sistema non li inizializza mi sembrerebbe possibile.
Io non toglievo l'alimentazione, ma solo ricompila e run.
Dico questo da ignorante, non conosco com'è organizzata la memoria (e poco anche il resto😏)

ciao Standardoil.
Ho riprodotto il "problema".
Si presenta, almeno apparentemente, solo con vettori dichiarati all'interno di una funzione (ed immagino quindi allocati nello stack).
Ho estratto un codice minimale, il problema ovviamente si presenta solo riavviando lo sketch e non dopo un OFF/ON:


char  glob[10];

void setup() 
{
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);

// questo funziona correttamente ---------------
  Serial.println(glob);           // dopo OFF/ON stampa porcherie, giustamente
                                               // dopo un RIAVVIO invece non stampa nulla, qualcuno ne inizializza il contenuto
  delay(1000);
  strcpy(glob, "ABCDEF");
  Serial.println(glob);
  delay(1000);

  pippo();
}



void loop() 
{
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  delay(200);
}


void  pippo(void)
{
char  sGxx[10];
int   nInt;
// questo NON funziona correttamente ---------------
  Serial.println(sGxx);
  delay(1000);
  strcpy(sGxx, "98765");
  Serial.println(sGxx);

// questo funziona correttamente ---------------
  Serial.println(nInt);
  delay(1000);
  nInt = 1234;
  Serial.println(nInt);
}

Sicuramente sbaglio io, comunque è un comportamento un pò "singolare" ...

come vedi...

regola del C (quindi anche C++), tutto quello che è nello stack non viene inizializzato, quindi variabili (o vettori) dichiarati nelle funzioni (variabili locali) non sono inizializzati. Nessuna "stranezza"

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.