Dentro e fuori voidsetup()

Scusate la domanda da assoluto nubbio... ma ce l'ho li da un po'... ache se non ho un vero problema, perchè gli sketch mi funzionano, ma avrei la curiosità di capire, dal punto di vista formale, cosa dovrebbe essere messo dentro a voidsetup() e cosa dovrebbe essere messo invece libero nelle prime righe, e anche se è solo una formalità oppure se cambia veramente qualche cosa durante l'esecuzione...

Grazie. Ciao.

Provo a risponderti e se sbaglio corregetemi.
Nel setup di solito si inseriscono le azioni che devono venir eseguite solo la prima volta (Serial.begin, pinMode...), infatti normalmente sono i setup delle varie funzioni,....
Prima di setup solitamente si dichiarano le variabili che saranno utilizzabili per tutta la durata dello sketch.

setup() e loop() sono delle funzioni a tutti gli effetti, solo che hanno nomi speciali.
Il programma principale di Arduino è una funzione main() "nascosta" che fa all'incirca questo:

void main()
{ setup(); // chiama 1 volta la setup
  while(1)         // ciclo infinito
  { loop();  // chiama la loop all'infinito
  }
}

Fuori dalle funzioni puoi solo dichiarare delle variabili che saranno "globali" ovvero nascono quando parte il programma. Hanno inoltre visibilità ovunque.
Dentro ad una funzione puoi altresì dichiarare variabili ma saranno "locali" quindi hanno vita solo quando la funzione viene chiamata e hanno visibilità solo in quella funzione.
Si chiama "scope" e visibilità delle variabili, cerca in un testo di programmazione C.

Credo di avere capito, quindi le dichiarazioni delle variabili che devono essere "globali" si mettono fuori dal voidsetup() nel "contenitore" principale, mentre dentro voidsetup() si possono mettere eventuali variabili ad uso esclusivo di voidsetup() ed i comandi che non dichiarano variabili, ma che devono essere eseguiti solo una volta.
:roll_eyes:
Ottimo chiarimento, Grazie! XD

certe cose devono essere fatte fuori da funzioni.

  • dichiarazioni di variabili globali
  • Definizione di funzioni, classi, strutture, unioni ecc.
  • include di librerie
    Normalente uno sketch ha anche una parte di commento descrittivo. Quello viene posto in cima.

Per questo non possono essere fatte all interno delle funzioni setup() loop() o altre .

Ciao Uwe

valisi:
Credo di avere capito, quindi le dichiarazioni delle variabili che devono essere "globali" si mettono fuori dal voidsetup() nel "contenitore" principale, mentre dentro voidsetup() si possono mettere eventuali variabili ad uso esclusivo di voidsetup() ed i comandi che non dichiarano variabili, ma che devono essere eseguiti solo una volta.
:roll_eyes:
Ottimo chiarimento, Grazie! XD

Prego. Ora ti interrogo: che valore stampa questa println() messa nella loop(), 9 o 6 ? e nella setup() ?

int var=9;       // variabile globale

void setup()
{ delay(1000);      // per facilitare manovra emergenza la seriale dovesse essere bloccata
  Serial.begin(9600);  // attiviamo la serial per la println()
  Serial.println(var);
}

void loop()
{ int var=6;    // variabile locale
  Serial.println(var);
}

Da ieri non si è fatto vivo.... lo hai messo in crisi :stuck_out_tongue_closed_eyes:

Rispondo io per completare l'informazione.
In setup viene stampato "9" perché var all'interno della funzione setup non c'è per cui il compilatore cerca nello scopo precedente, e trova la variabile globale var ed usa quella.

In loop invece, esiste una variabile locale che si chiama var che viene usata all'interno della funzione loop perché secondo la regola della visibilità delle variabili, che stabilisce diversi livelli di visibilità appunto, la variabile locale ha priorità di visibilità sulla variabile globale.

Io aggiungerei che, anche se possibile, bisognerebbe evitare di usare nomi di variabili già definite a livello globale all'interno di routine.

cyberhs:
Io aggiungerei che, anche se possibile, bisognerebbe evitare di usare nomi di variabili già definite a livello globale all'interno di routine.

E' una rottura, ma di solito le variabili globali io le faccio iniziare con g_ e quelle locali con l_ tipo g_varPin e l_varPippo
Le costanti con K_ , i parametri delle funzioni con p_

Su alcuni testi C suggeriscono di scrivere le variabili capitalizzare, esempio int VarPinDigital
però (siccome il C distingue tra maiuscolo da minuscolo, è case sensitive) le globali tutte capitalizzare, mentre le locali con la prima minuscola. Quindi VarPinDigital globale varPinDigital locale.

leo72:
Da ieri non si è fatto vivo.... lo hai messo in crisi :stuck_out_tongue_closed_eyes:

Ah ah ah... :stuck_out_tongue_closed_eyes: no, no, mi ero scollegato... XD avrei risposto parzialmente, nel senso che avrei avuto il dubbio che nel voidloop() potesse dare errore per la ridichiarazione della variable in locale, non sapevo ci fosse la regola della priorità delle variabili, ottima info anche questa!
Anche io, comunque, sono abituato (anche in altri linguaggi), a mettere sempre un underscore prima delle variabili per differenziarle e vederle meglio... ed amo scriverle capitalizzate! :smiley:
Gentilissimi. Grazie per tutte le info.

Personalmente adotto la tecnica di scrivere le costanti TUTTE_MAIUSCOLE così le identifico per bene all’interno del codice.

Per distinguere fra globali e non globali non uso nessuno stratagemma perché abitualmente tendo a non usare nomi già utilizzati.

valisi:
non sapevo ci fosse la regola della priorità delle variabili

Si chiama visibilità, in C/C++ ci sono 4 campi di visibilità o scopi:

  • blocco di codice
  • funzione
  • file
  • programma

Una variabile definita in un blocco di codice (es all’interno di un ciclo for o altro) è visibile solo in quel blocco. Una variabile definita a livello di funzione è vista in tutta la funzione, anche nei blocchi. Una variabile definita a livello di file è visibile globalmente all’interno di tutte le funzioni di quel file, mentre con extern puoi usare una variabile definita in un altro punto del programma (quindi anche in un altro file).