Discussione:
variabili locali e globali
(troppo vecchio per rispondere)
Govny
2005-02-18 16:57:25 UTC
Permalink
Se io dichiaro una variabile nel programma principale questa viene
riconosciuta sia all'interno del programma principale che all'interno delle
procedure e funzioni (si tratta di una variabile globale), se dichiaro
invece una variabile all'interno di una procedura, questa viene vista solo
da quella procedura e basta (variabile globale).
Quello che non capisco è perchè fare questa distinzione; se le variabili
globali vengono viste sempre, perchè non dichiarare tutte le variabili usate
come globali. In altre parole perchè non si dichiarano tutte le variabili
all'inizio e si taglia la testa al toro e si preferisce invece usare sia
variabili locali che globali?
C'è sicuramente un motivo, ma io non so quale; qualcuno me lo potrebbe
spiegare?
Grazie
Marco Breveglieri
2005-02-18 18:08:08 UTC
Permalink
Post by Govny
C'è sicuramente un motivo, ma io non so quale; qualcuno me lo potrebbe
spiegare?
Ci sono motivi pratici e logici; innanzitutto, considerando che una
variabile è identificata da un nome (identificatore), non sarebbe
possibile dichiarare più variabili con lo stesso nome sebbene queste
abbiano una valenza puramente "locale", cioè nel blocco di istruzioni
che ne fanno uso.

In secondo luogo, le variabili locali sono sfruttate nel processo di
incapsulamento che nasconde l'implementazione di una procedura (o
funzione) dall'esterno, in modo che venga vista come una scatola chiusa;
siccome la variabile locale viene vista solo dalla routine in cui è
dichiarata, nessuna routine o elemento esterno può modificarne il valore
"rompendone" la consistenza e influenzandone il comportamento (vi sono
già molti rischi quando si utilizzano variabili globali all'interno di
procedure e funzioni).

Viene allocata memoria per le variabili locali solo quando la procedura
o funzione in cui sono dichiarate viene richiamata; le variabili globali
sono allocate al momento del caricamento della unit di cui fanno parte e
persistono in memoria fino alla chiusura dell'applicazione.

Credo vi siano tante altre motivazioni...queste sono le prime, banali
che mi sono venute in mente, forse nemmeno spiegate nel migliore dei
modi. Magari qualcun altro potrà aggiungere informazioni, dettagli e
correzioni...

Ciao! :-)
--
Marco «Alka» Breveglieri
(marco [@] abls [.] it)

ABLS Team S.n.c. - Software & Web
42019 Scandiano (Reggio Emilia)
http://www.abls.it
Govny
2005-02-18 19:06:19 UTC
Permalink
Post by Marco Breveglieri
Ci sono motivi pratici e logici; innanzitutto, considerando che una
variabile è identificata da un nome (identificatore), non sarebbe
possibile dichiarare più variabili con lo stesso nome sebbene queste
abbiano una valenza puramente "locale", cioè nel blocco di istruzioni
che ne fanno uso.
In secondo luogo, le variabili locali sono sfruttate nel processo di
incapsulamento che nasconde l'implementazione di una procedura (o
funzione) dall'esterno, in modo che venga vista come una scatola chiusa;
siccome la variabile locale viene vista solo dalla routine in cui è
dichiarata, nessuna routine o elemento esterno può modificarne il valore
"rompendone" la consistenza e influenzandone il comportamento (vi sono
già molti rischi quando si utilizzano variabili globali all'interno di
procedure e funzioni).
Viene allocata memoria per le variabili locali solo quando la procedura
o funzione in cui sono dichiarate viene richiamata; le variabili globali
sono allocate al momento del caricamento della unit di cui fanno parte e
persistono in memoria fino alla chiusura dell'applicazione.
Credo vi siano tante altre motivazioni...queste sono le prime, banali
che mi sono venute in mente, forse nemmeno spiegate nel migliore dei
modi. Magari qualcun altro potrà aggiungere informazioni, dettagli e
correzioni...
Ciao! :-)
Grazie
Andrea Laforgia
2005-02-19 21:38:40 UTC
Permalink
Marco Breveglieri ha scritto:

<...>
Concordo con Marco che vi siano moltissime ragioni, la cui spiegazione
[...]la variabile locale viene vista solo dalla routine in cui è
dichiarata, nessuna routine o elemento esterno può modificarne il valore
"rompendone" la consistenza e influenzandone il comportamento
Aggiungo che è assodato che sia bene dichiarare le variabili nel punto più
vicino al loro utilizzo. Purtroppo Delphi non lascia molta libertà,
mentre altri linguaggi come il C o ancora meglio il C++ consentono di
implementare comportamenti più sicuri. Ad esempio, il C non vieta di
dichiarare una variabili all'interno di un compound-statement, quindi io
potrei scrivere:

int i, j;

for (i=0; i<9; i++)
{
for (j=0; j<9; j++)
{
...
}
}

sia i che j sono visibili sia all'interno, che all'esterno dei due cicli,
ma potrei anche scrivere:

int i;

for (i=0; i<9; i++)
{
int j;
for (j=0; j<19; j++)
{
...
}
}

In questo modo j è visibile solo all'interno del primo ciclo, e così via.

Il nuovo standard sia del C che del C++ consente di dichiarare variabili
ovunque nel codice e addirittura (ma solo il C++) di scrivere qualcosa del
tipo:

for (int i=0; i<9; i++)
{
for (int j=0; j<9; j++)
{
}
}

in questo modo si restringe al massimo la possibilità di usare le stesse
variabili per scopi diversi.
--
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
Loading...