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.
Torna all'indice