program6
programmazione: variabili globali e locali e l'istruzione return
Donato Taddei su uictech, 05\03\2013, h. 10.25.

* I primi 5 articoli-spunti per la programmazione sono apparsi sul numero di marzo 2013 di pcCiechi.

(omissis)
riporto qui di seguito i due messaggi inerenti nell'ordine giusto.
Vale a dire prima la parlata confidenziale con Gabri a proposito dell'oggetto, appena recuperata, e 
di seguito l'esempio concreto con una ipotetica funzione area quadrato.

Cosa ritorna una funzione?
Dipende da come l'hai dichiarata:
se hai scritto
void funzione(ecc.)
puoi metterci tutti ireturn che vuoi, ti restituir void, cio niente;
Analogamente se l'hai dichiarata bool o boolean il return potr al massimo
ritornare vero o falso, se l'haidichiarata intera,
ritorner un intero, se l'hai dichiarata puntatore ti restituir un indirizzo.

Tu scope?
Ne hai mai sentito parlare?
Beh il linguaggio c ti lascia modificare dall'interno delle funzioni le variabili globali,
cio quelle che atrai definito al di fuori delle
funzioni, solitamente prima manon necessariamente.
Altri linguaggi come php o python non te lo lasciano fare, a meno che tu non
dichiari globali delle variabili create all'interno di
una funzione.
Perch sono cos perfidi?
Te lo dico in inglese che tu capisci meglio:
gli arggomenti, o parametri, o variabili che tu passi alle funzioni sono passati
"by value", e solo se espressamente richiesto "by
reference".
per i non anglofoni come me, significa che normalmente quando tu in una funzione
metti traparentesi tonde nomi di variabili, in
realt non viene passata alla funzione la variabile ma una sua copia, appunto il
suo valore che ha in quel momento, e quando tu
all'interno della funzione usi quei nomi di variabili ti stai sempre riferendo
alla copia, copia che viene distrutta appena la
funzione termina.
Questo vale per le variabili che hai passato come argomenti e nonvale per le
altre variabili globali.
Se vuoi che la funzione tratti anche le variabili passate come parametri o
argomenti delle funzioni come le altre variabili globali
devi passarle tramite indirizzo.
E pu bastarti, non c' bisogno discomodare i registri, il CS E IL DS, lo stack
ecc.
Pertanto se in c si scrive, ma questo in via filosofica vale per tutti i molti linguaggi, sia pure 
con delle differenze:
// definisco e dichiaro una variabile globale
int lato = 10;
// definizione di una funzione areaquadrato
void areaquadrato( int lato) { return lato*lato; }
//come avrete immaginato la funzione moltiplica lato per lato
ma non restituisce un kaiser perch  dichiarata void.
Allora correggiamo void con int (intero) e la funzione ritorna 100
per cui se scriviamo
int a = areaquadrato(lato)
a conterr 100
Se ora scriviamo
lato = 20;
e definiamo una variabile globale
int cubo;
 all'interno della funzione aggiungiamo, prima del return una istruzione:
cubo = lato*lato*lato;
all'uscita della funzione a conterr 400 e cubo 6000.
e se nella funzione scriviamo pure prima del return:
lato = lato*2; //moltiplichiamo il lato per 2
siamo dei coyote che urlano di rabbia se immaginiamo che all'uscita della funzione lato conterr 
40, perch continuer a contenere beffardamente 20.
Questo  il motivo per cui in c e in tutti quei linguaggi dove le funzioni e il tipo di parametro 
sidichiarano, se proprio alcompilatore non basta il tipo (int, char, ecc.) si adottano nome 
simbolici generci tipo s per stringa i per intero ecc.
se infatti la funzione areaquadrato fosse stata dichiarata
int areaquadrato(int l)
ora lato conterrebbe 40 come desiderato.
