Go Down

Topic: [RISOLTO] dichiarare variabili al momento che servono oppure no (Read 1 time) previous topic - next topic

bitmanrc

Naturalmente, mi sono accorto che "dichiarando" le variabili all'inizio del programma, (prima della funzione SETUP), mi implica un "impegno di memoria". Se li dichiaro quando mi servono, quindi dentro i void  oppure in genere nel listato, la memoria utilizzata NON viene intaccata. Secondo VOI è la stessa cosa dichiararle prima o quando mi servono? oppure quando vengono dichiarate all'occorrenza la memoria si "occupa" e dopo si "libera"? Spero di essermi spiegato. Grazie

nid69ita

#1
Jan 12, 2019, 02:23 pm Last Edit: Jan 12, 2019, 02:37 pm by nid69ita
Le variabili locali (quelle dichiarate nelle funzioni) vengo allocate entri nella funzione e deallocate quando la funzione finisce.

Occhio però. Esempio hai 4 variabili int (2 byte l'una) e quindi 8 bytes:
1. Se dichiari globali occupano sempre 8 bytes.
2. Se la funzione in cui la dichiari è la loop() che è sempre eseguita...   non cambia molto come occupazione. In pratica essendo la loop() sempre eseguita, non c'e' quasi mai "praticamente" un momento in cui non occupi 8 bytes.
Inoltre uno sketch Arduino in realtà è circa (è nascosta la cosa):
Code: [Select]
void main()
{ setup();
   while(1) { loop(); }
}

Quindi se dichiari in loop, hai un continuo alloca/dealloca nello stack (anche se operazione che non porta via molto tempo, un calcolo per lo spazio da riservare in stack x var locali)

Ricorda poi che le variabili locali non sono inizializzate a zero.
my name is IGOR, not AIGOR

bitmanrc

quindi conviene allocarle/dichiararle dentro la funzione, cosi poi la memoria ritorna libera?

nid69ita

#3
Jan 12, 2019, 03:39 pm Last Edit: Jan 12, 2019, 03:41 pm by nid69ita
Normalmente si.

Occhio però che se occupi in memoria globale 100 byte e poi nella loop() altri 100 byte,
in compilazione ti viene detto che occupi 100 byte. Il compilatore non sa che occuperai altri 100 byte con allocazione di variabili locali. In fase di esecuzione quando sei nella loop() quindi occupi 200 byte e con solo 2Kb di SRAM è facile consumare tutta la memoria (arduino con atmega 328)

my name is IGOR, not AIGOR

bitmanrc


maubarzi

dipende dall'uso che ne devi fare, io non sceglierei il punto dove dichiararle in base a questi aspetti, ma all'uso  che ne devi fare.
A meno che le prestazioni rincorse in modo maniacale non siano fondamentali, cioè dove devi recuperare e ottimizzare ogni singolo ciclo macchina...
Se le dichiari dentro la funzione hanno vita locale, si dichiarano quando non devono mantenere il valore tra un ciclo e l'altro. Si dichiarano fuori se devi memorizzare valori che devono sopravvivere al singolo ciclo di loop.

Se poi decidi di dichiararle fuori perchè ti piace di più o per altri motivi legittimi, ma devono avere vita locale al loop, le devi re-inizializzare ad ogni loop, resettare alla fine o inizializzare prima del loro utilizzo, altrimenti rischi di avere valori sporchi che ti alterano l'esecuzione.
Nessuna buona azione resterà impunita!

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

Silente

No una variabile locale è una variabile globale Sono due cose distinte in quanto
1) nelle variabili globali può non essere dato un valore iniziale in quanto prendono come inizio Zero, Mentre se uso una variabile locale devo in sede di dichiarazione darle un valore se no il valore di quella variabile sarà sbagliato ( corrispondente al valore che quel pezzo di memoria ha avuto la volta precedente che venne usato).
2) Una variabile globale Può essere utilizzata senza problemi in ogni parte del programma Mentre una locale va Passata come parametro per ogni funzione che la utilizza
3) in sede di compilazione io conosco l'intero volume occupato dalle variabili globali ma non ho nessuna idea su quello che occuperanno le locali.
Dove va un numero va una variabile o una funzione. E dove va una boolean va un insieme di test.

Se vuoi ottenere devi saper spiegare

In pochi capiscono l'importanza di formattare, sii tra di essi

gpb01

Ove possibile, le variabili LOCALI sono da preferire alle variabili globali.

Vi consiglio un attento studio dell'allegato documento di Atmel relativo alla ottimizzazione del codice. ;)

Guglielmo

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

maubarzi

Il No è riferito a me?

No una variabile locale è una variabile globale Sono due cose distinte in quanto
Ovvio, io non volevo dire che una variabile dichiarata fuori era locale o cose di questo tipo ma, essendo un po' più precisi per non fraintendersi: usare una variabile globale al posto di una locale quando nel programma ne basta una locale.

1) nelle variabili globali può non essere dato un valore iniziale in quanto prendono come inizio Zero, Mentre se uso una variabile locale devo in sede di dichiarazione darle un valore se no il valore di quella variabile sarà sbagliato ( corrispondente al valore che quel pezzo di memoria ha avuto la volta precedente che venne usato).
In genere il compilatore in questi casi da errore, quindi è implicito tutto questo discorso.
Mi fai venire il dubbio su Arduino, visto che lo hai accennato e io inizializzo sempre di prassi, non penso di averlo mai verificato nella pratica, ma in altri linguaggi c'è errore in compilazione.

2) Una variabile globale Può essere utilizzata senza problemi in ogni parte del programma Mentre una locale va Passata come parametro per ogni funzione che la utilizza
Questo dovrebbe far parte della progettazione, ovvio che se ti serve globale non la dichiari locale, ma se ti serve locale la puoi sempre dichiarare globale, ma ti tiri dietro le eventuali conseguenze... cioè devi sapere quello che fai e i problemi in cui puoi incappare...

3) in sede di compilazione io conosco l'intero volume occupato dalle variabili globali ma non ho nessuna idea su quello che occuperanno le locali.
Si, però questo non dovrebbe essere una discriminante per farti dichiarare tutto globale.
Anche perchè per sapere l'ammontare all'inizio hai un enorme spreco sul codice. Puoi dichiarare variabili locali ovunque, non solo dentro il loop ma anche dentro tutte le tue procedure/funzioni/metodi o come le vogliamo chiamare. Dichiari tutto globale per sapere quanto occupano? direi proprio di no o sbaglio?

Se il NO non era riferito a me... pecà, ho solo chiarito meglio il mio pensiero... inutilmente ...

EDIT (causa concomitanza):
@gpb01 sei un mito, mi esci sempre con il doc giusto al momento giusto.
me lo leggo mooolto volentieri ;)
Nessuna buona azione resterà impunita!

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

gpb01

@gpb01 sei un mito, mi esci sempre con il doc giusto al momento giusto.
:D :D :D ... ho un ampia biblioteca ;)

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

maubarzi

Nessuna buona azione resterà impunita!

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

Standardoil

Vi consiglio un attento studio dell'allegato documento di Atmel relativo alla ottimizzazione del codice. ;)

meraviglia
grande Guglielmo, grazie Guglielmo, gagliardo Guglielmo e vai pure avanti tu.....https://www.dizy.com/it/aggettivi/g
ho piacevolmente scoperto che anche Atmel va piu' veloce coi de-contatori, piuttosto che coi contatori
mi ricorda tanto la mia vecchia Texas.........
però mi viene un dubbio, se per usare variabili locali invece che globali sono costretto a passare più parametri piuttosto che restituire strutture?
Prima legge di Nelson (che sono io): A parità di risultato maggiore è il pensiero, minore il lavoro. Quindi prima di fare pensa!
Non si da retta a studenti: andate a copiare da un'altra parte...
Lo hai visto su Youtube? -> lo chiedi su Youtube

gpb01

... se per usare variabili locali invece che globali sono costretto a passare più parametri piuttosto che restituire strutture?
... beh ... "Est modus in rebus" ;)

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

speedyant

Ove possibile, le variabili LOCALI sono da preferire alle variabili globali.

Vi consiglio un attento studio dell'allegato documento di Atmel relativo alla ottimizzazione del codice. ;)

Guglielmo


Veramente interessante!
Chi si "prende la briga" di verificare come riportare i trucchi anche nella programmazione tipica di arduino?

maubarzi

però mi viene un dubbio, se per usare variabili locali invece che globali sono costretto a passare più parametri piuttosto che restituire strutture?
Mah... anche questo approccio mi convince poco.
O meglio, il numero di parametri di una funzione non dovrebbe influenzare la scelta di usare variabili globali o locali.
Poi concordo sul fatto che sia difficile stabilire dove sia la linea di confine...

Però tendenzialmente si dovrebbe praticamente sempre poter stabilire un contesto di validità delle variabili e quindi si potrebbe passare quello e da li accedere alle variabili che servono, senza doverle dichiarare per forza globali.
Riformulo ribaltando l'ottica, ci sono sempre ambiti dove certe variabili non servono proprio e permetterne l'accessibilità (quindi anche la modificabilità) potrebbe causare solo problemi.
Nessuna buona azione resterà impunita!

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

Go Up