PDA

Visualizza la versione completa : [C] Static e Global


goatboy
15-03-2012, 21:46
Salve,
ho una domanda non molto tecnica, non ho un codice da mostrarvi e con cui ho problemi. E' più una domanda teorica sul C. Oggi al corso di Algoritmi e Strutture Dati il Prof ha detto che "non ci dobbiamo azzardare" ad usare le parole chiave static e global.
Credo di aver capito che non bisogna usare le variabili static perchè si allocano in memoria permanentemente e non vengono deallocate al termine di una funzione. Così facendo al riutilizzo del programma la variabile static avrà ancora il valore dell'ultima esecuzione.
Per quanto riguarda le global, non bisogna usarle perchè si allocano in memoria permanentemente e inoltre sono visibili ovunque.
Ma allora non capisco, per quale motivo sono state create questo tipo di variabili? In quali casi è "normale" usare variabili statiche e in quali casi quelle globali?

ardito86
15-03-2012, 22:39
Un classico utilizzo (più che altro esempio) che si fa con le variabili static è il numero di volte che viene chiamata una funzione. Per esempio, se dentro la funzione viene creata una variabile static, verrà allocata in memoria e non rilasciata, ma soltanto la funzione che l'ha creata potrà utilizzarla. E' come una variabile globale ma soltanto la funzione che la dichiara può utilizzarla (sembra un po' un controsenso eheh).


void funzione(){
static int cont = 0;
cont++;
printf("Funzione chiamata %d volte",cont);
}


Le variabili globali servono quando si ha la necessità di avere una variabile che sia disponibile in ogni parte del programma. Non c'è altro da aggiungere...

Magari si, si dovrebbero evitare, per una programmazione "più pulita", ma che non siano proprio da utilizzare proprio non condivido. Poi sono punti di vista e "scuole" differenti.

Inoltre le variabili globali e static condividono la stessa zona di memoria, ovvero dopo il codice e prima dello stack (generalmente...ma non è detto che sia sempre così) e il programma le alloca prima di tutte le altre variabili.

ramy89
15-03-2012, 22:45
Originariamente inviato da goatboy
[...] il Prof ha detto che "non ci dobbiamo azzardare" ad usare le parole chiave static e global.


:malol: :malol: :malol:

Siccome pure io studio informatica, per me questo è pane quotidiano :D
Tradotto vanno usate con cautela, ma i professori amano semplificare le cose :zizi:



Ma allora non capisco, per quale motivo sono state create questo tipo di variabili? In quali casi è "normale" usare variabili statiche e in quali casi quelle globali?


Sono per chi vuole usare il linguaggio a piena potenza, toccando le cose con mano.
Ci sono casi in cui sono fastidiose, ma anche casi in cui tornano utili, e io ti consiglio vivamente di usarle e di sperimentarle.
Un caso in cui mi è tornata utile una variabile static è quando dovevo creare dei nodi che avevano un numero seriale univoco.Un esempio semplificato è questo:



int contatore()
{
static int num=0;
return num++;
}


Poi l' esame è un' altra cosa :D

goatboy
15-03-2012, 23:32
Davvero grazie per le risposte, mi è tutto chiaro. Avevo già avuto un'idea simile all'esempio proposto da ardito86. So che i Prof tendono ad esagerare un po', il fatto è che non mi era chiaro in quali contesti fosse adeguato utilizzare quel tipo di variabili. Grazie! :)

infinitejustice
16-03-2012, 00:07
Le variabili di tipo static e global hanno senso quando definisci un oggetto di tipo Dato Astratto (non un ADT).

Per capirci, la differenza tra DA ed ADT è che del secondo puoi crearne infinite istanze, mentre del primo ve n'è uno ed uno solo. Il Dato Astratto consente ai client di interfacciarsi con esso tramite apposite funzioni ed una o piu variabili globali, dette appunto variabili di interfaccia.

Il dato astratto di per se (e tutti i suoi attributi) è definito come static nel modulo, in modo da prevenirne l'accesso diretto ai client (l'accesso puo avvenire solo tramite le variabili di interfaccia e le funzioni di interfaccia).

In linea generale è cattiva norma avere variabili globali perchè non solo te le ritrovi dall'inizio alla fine, ma anche perche chiunque puo accedervi e modificarne il contenuto. Il primo problema, in realta, con la tecnologia moderna non è piu un problema, vista la RAM presente sulle macchine.

MItaly
16-03-2012, 02:13
Il problema delle variabili globali è appunto il fatto che possono essere modificate da dovunque, il che rende difficile seguirne i possibili stati e individuare come/dove possono cambiare. D'altra parte per certi oggetti (tipicamente dei singleton contenenti un qualche genere di stato globale dell'applicazione) possono essere utili, specie se l'alternativa sarebbe continuare a passarseli in giro in praticamente ogni chiamata a funzione.

Per le funzioni static, in genere non sono una buona idea, poiché associano un singolo stato ad una funzione che potrebbero chiamare più procedure; esempio stupido: la strtok. Se tra una chiamata alla strtok già "inizializzata" e l'altra si chiama un'altra procedura che al suo interno fa uso della funzione in questione ovviamente succederà un gran pasticcio, dato che una variabile static è uno stato condiviso per tutto il programma nascosto in una funzione. Non a caso di buona parte delle funzioni della libreria C che fanno uso di tali funzionalità sono state scritte delle versioni "rientranti" che non presentano questo problema, in genere esternalizzando lo stato in una qualche struttura fornita dal chiamante.
Per dirla in altre parole: spesso static è usato per avere una specie di "classe dei poveri" (per memorizzare membri privati, ...), ma dato che se ne può avere solo una singola copia è facile fare casino nel momento in cui più parti del codice usano la funzione in questione.

infinitejustice
16-03-2012, 13:35
Trovo senza senso i Prof che trattano variabili statiche e globali come fossero il demonio. Lavorare in C ti da un controllo sul flow dei dati e della macchina che pochi altri linguaggi ti danno. Proprio per evitare tutte le rogne che nascono dall'avere tale potere son nati altri linguaggi, costruiti sul C (tuttavia con essi non hai lo stesso potere di controllo).

Personalmente trovo molto piu pericoloso utilizzare il puntatore restituitomi da una funzione senza controllare se sia NULL che definire ed utilizzare una variabile global o static.

Un buon prof dovrebbe insegnarti tutto quello che c'è da sapere e soprattutto quando usare/non usare quello che ti ha insegnato.

p.s. potresti effettivamente chieder al tuo Prof come definire Dati Astratti senza utilizzare variabili statiche e globali.

ardito86
16-03-2012, 14:28
Originariamente inviato da infinitejustice
Personalmente trovo molto piu pericoloso utilizzare il puntatore restituitomi da una funzione senza controllare se sia NULL che definire ed utilizzare una variabile global o static.

beh questo in effetti non è molto pericoloso...potrebbe essere un errore facilmente individuabile

goatboy
16-03-2012, 14:58
Be il Prof era ironico, ha semplicemente detto che, non avendo una vasta conoscenza della materia e di tutti i meccanismi che ci sono dietro ogni istruzioni, dobbiamo evitare di usare quel tipo di variabile.

ramy89
16-03-2012, 17:42
Originariamente inviato da goatboy
Be il Prof era ironico, ha semplicemente detto che, non avendo una vasta conoscenza della materia e di tutti i meccanismi che ci sono dietro ogni istruzioni, dobbiamo evitare di usare quel tipo di variabile.

Se vuoi fare le cose per bene studiatele lo stesso.
Non è un bravo professore, ha un approccio sbagliato.

Loading