Struct "globale"?

Pubblicità

crafted

Utente Attivo
Messaggi
19
Reazioni
2
Punteggio
25
Salve a tutti.
Da qualche anno mi diletto nella programmazione con Arduino e ultimamente utilizzo le struct per organizzare meglio i dati.
Domanda: i tipi di dati all'interno della struct, dichiarati al di fuori del main() (nel caso di Arduino, loop e setup), sono variabili globali?
Vorrei capire se questi tipi di dati soffrono delle stesse problematiche delle variabili globali.

Grazie
 
Parliamo di definizione di 'struct' globalmente, come nuovo tipo di dato, o di dichiarazione di una variabile globale (ad un nuovo tipo di dato) 'struct' ?

Una "struct" definisce un nuovo tipo di dato (definito dall'utente), e tale nuovo tipo di dato puo' essere definito sia globalmente che localmente. (a vari livelli: di file, di class o struct, di funzione, etc... anche se e' una valutazione prettamente formale e concerne se limitare o meno l'utilizzo di quel nuovo tipo di dato solo a una parte del codice)

Poi questo nuovo tipo di dato puo' essere usato alla stregua di uno dei tipi predefiniti (int, float, etc) per la dichiarazione delle variabili... ed esse possono essere a loro volta sia locali che globali.

C++:
struct myGlobalStruct {
    int a;
    float b;
}; // nuovo tipo di dato... globale

myGlobalStruct global_global; //dichiarazione di variabile globale

int main()
{
struct myLocalStruct {
    int c;
    float d;
};  // nuovo tipo di dato... locale, non accessibile fuori dal main

myGlobalStruct global_local; //dichiarazione di variabile locale
myLocalStruct local_local; //dichiarazione di variabile locale
}

Definire una 'struct' globalmente ( myGlobalStruct ) o localmente ( myLocalStruct ) ha solo come obiettivo di rendere disponibile (al programmatoire) il nuovo tipo di dato, ristretto esclusivamente al campo di visibilita' che viene deciso.
Nel senso che la dichiarazione delle variabili myGlobalStruct global_local e myLocalStruct local_local e' sostanzialmente identica: entrambe vengono allocate sullo stack, come le variabili locali, indipendentemente che la definizione del nuovo tipo di dato 'struct' sia globale o locale.

Per cio' che riguarda la dichiarazione della variabile "globale" myGlobalStruct global_global segue le stesse "regole" di un qualsiasi altro tipo di dati (char, int, float, etc.), dichiarato globalmente.

Se ci fosse ancora qualche dubbio: ovviamente le variabili membro, all'interno della struttura, seguono l'andamento di dove (locale o globale) e' dichiarata la variabile del nuovo tipo di dato 'struct''... non di dove viene definita la 'struct'

P.S.
Il codice precedente e' in C++.
Se usassimo il C bisogna esplicitare struct prima della dichiarazione della variabile:
C:
struct myGlobalStruct global_local; //dichiarazione di variabile locale
struct myLocalStruct local_local; //dichiarazione di variabile locale
 
Ultima modifica:
Se ci fosse ancora qualche dubbio: ovviamente le variabili membro, all'interno della struttura, seguono l'andamento di dove (locale o globale) e' dichiarata la variabile del nuovo tipo di dato 'struct''... non di dove viene definita la 'struct'

Ciao BrutPitt... chiarissimo.

Grazie
 
Io preferisco le 2 definizioni "definizione" della struttura e "allocazione" della variabile, che fa capire meglio riguardo la sua allocazione in memoria.

In un arduino allocarla globale o nello "scope" del main o altra funzione, a livello di performance non cambia molto, non ci sono cache L1 L2 e altro, lo stack e' ram interna, a livello di performance non cambia nulla. Eccetto che, ovviamente, se allochi la variablie nello stack, vive solo fino alla fine dello "scope".

Codice:
void trallallero_func()
{
int a;
a = 1;

{
        struct pippo p;
  
        p.a = 2;
}

// qui p (tipo pippo) e' gia morta, lo scope in cui e' stata allocata e' terminato

a += 2;
}

Poi c'e' lo "static" che ha significati molto diversi se usato globale o locale (stack), nel primo caso fissa una variabile che anche se globale resta disponibile solo per il modulo corrente compilato, nel secondo caso invece significa che viene mantenuto il suo valore anche uscendo e rientrando nella funzione, proprio come una variabile globale.

Codice:
void macchina_stati(int stato)
{
  static int voglio_vaolre_ricordato = 0;

   voglio_vaolre_ricordato = stato;
}
Come sopra, vaolre assegnato sara mantenuto a prossima chiamata della funzione macchina_stati()
 
Ultima modifica da un moderatore:
Pubblicità
Pubblicità
Indietro
Top