Metode evoluate de programare Limbajele c şi C++



Yüklə 1,64 Mb.
səhifə5/44
tarix07.04.2018
ölçüsü1,64 Mb.
#46828
1   2   3   4   5   6   7   8   9   ...   44

2.2. Variabile locale



Variabilele locale nu sunt valabile în tot programul. Ele au o utilizare locală în două feluri:

  1. ca şi variabile automatice (alocate pe stivă) la nivelul unei funcţii;

  2. ca şi variabile statice (alocate în zona programului) la nivel de fişier (eventual şi la nivelul unei funcţii).

Variabilele declarate în interiorul unei funcţii şi care nu sunt declarate ca externe sunt variabile locale. Lor li se alocă memorie pe stivă la intrarea în funcţia în care sunt declarate. La ieşirea din funcţie, stiva se reface la conţinutul dinaintea apelului şi variabilele locale pierd alocarea. Deci ori de câte ori se apelează o funcţie, variabilele locale acesteia (denumite şi variabile automatice) se alocă (primesc memorie) pe stivă şi la ieşirea din funcţie variabilele locale sunt şterse din stivă.

Variabilele locale pot să nu fie alocate pe stivă, ci într-o zonă de memorie destinată acestui scop. O astfel de variabilă locală se numeşte variabilă statică. O variabilă locală statică se declară printr-o declaraţie obişnuită, precedată de cuvântul cheie static. O variabilă statică poate fi declarată atât în corpul unei funcţii cât şi în afara oricărei funcţii. În cazul unei variabile statice declarată în interiorul unei funcţii alocarea nu se face pe stivă ci într-o zonă de memorie destinată acestui scop, aceasta fiind deosebirea esenţială faţă de variabilele automatice. În cazul în care o variabilă statică este declarată în afara funcţiilor, ea este definită din punctul în care a fost declarată şi până la sfârşitul fişierului sursă care conţine declaraţia ei. Spre deosebire de variabilele globale, o variabilă statică nu poate fi declarată ca externă şi deci nu poate fi utilizată în funcţiile din alte fişiere sursă diferite de cel în care a fost declarată.

Se recomandă ca tablourile mari să fie declarate statice, deoarece dacă sunt automatice pot depăşi capacitatea stivei (care are implicit o valoare de câţiva Kocteţi).


Exemple:

  1. Fişierul fisier1.c este un fişier sursă care conţine 2 variabile globale i şi d , o variabilă statică x şi două funcţii f şi main. Funcţia main conţine variabila statică a iar funcţia f conţine variabila statică b.

int i; // definiţia variabilei globale i

double d; // definiţia variabilei globale d

static int x; // definiţia variabilei statice x, locala fisierului fisier1.c


void main (void)

{ static char a; // definiţia variabilei statice a, locala funcţiei main

float c; // definiţia variabilei automatice c, locala funcţiei main

/* in acest moment se pot folosi variabilele i,d,x,a si c */

. . .

}
{ int p; // definiia variabilei automatice p, locala funciei f



static float b; // definiia variabilei statice b, locala funciei f

/* in acest moment se pot folosi variabilele i,d,x, p si b */

. . .

}
Variabilele a şi c fiind locale funcţiei main nu pot fi utilizate în funcţia f. Analog, variabilele p şi b sunt locale în funcţia f, nu pot fi utilizate în funcţia main.




  1. Fişierul fisier2.c conţine funcţiile f1 şi f2 care intră în componenţa aceluiaşi program ca şi funcţiile main şi f din fişierul fisier1.c

static unsigned t; // definitia variabilei statice t, locala fisierului fisier2.c

void f1(...)

{ extern int i; // declaratie externa pentru i

extern double d; // declaratie externa pentru d

static int k; // definitia variabilei statice k, locala functiei f1

/* in acest moment se pot folosi varibilele i,d, k si t */

. . .


}
void f2(...)

{ extern int i; // declaratie externa pentru i

static double s; // definitia variabilei statice s, locala functiei f2

/* se pot folosi variabilele i, s si t */

. . .

}
Variabila statică x definită în fişierul fisier1.c nu poate fi utilizată în fişierul fisier2.c. De asemenea, variabila statică t nu poate fi utilizată în fişierul fisier1.c. Variabila globală d nu poate fi utilizată în funcţia f2, ea nefiind declarată ca şi externă.


Observaţii:

1o. Variabilele globale constituie un mijloc simplu de interfaţă între funcţiile unui program. Se recomandă a fi folosite când dorim transferuri de valori între două sau mai multe funcţii în aşa fel încât modificările realizate de o funcţie să fie accesibile pentru toate funcţiile programului. Nu trebuie să se facă abuz în utilizarea variabilelor globale deoarece constituie şi o sursă potenţială de erori, pentru că accesul unui mare număr de funcţii la anumite date globale conduce deseori la modificări nedorite şi greu evidenţiabile.

2o. Funcţiile sunt considerate cu atributul implicit extern. Dacă într-un program există mai multe fişiere sursă atunci o funcţie poate fi apelată oriunde, bine înţeles respectând convenţia definirii ei sau a prototipului ei înainte de a fi folosită. Putem să limităm definind funcţiile cu atributul static precedând antetul funcţiei prin cuvântul cheie static. Astfel funcţia respectivă devine locală şi deci apelabilă doar în fişierul în care este definită.

2.3. Variabile registru

Limbajul C oferă posibilitatea de a aloca anumite variabile în regiştri microprocesorului. Deoarece regiştri constituie un tip de memorie ultrarapidă în anumite cazuri se poate economisi atât timp de execuţie cât şi memorie. Se pot aloca în regiştri numai parametrii funcţiilor şi variabilele automatice de tip int, char şi de tip pointer. O variabilă registru se declară în mod obişnuit, precedând declaraţia ei prin cuvântul rezervat register.

Alocarea într-un registru a unei variabile se face numai dacă există un registru disponibil. În caz contrar, variabila registru se alocă pe stivă exact ca o variabilă automatică. Alocarea se face în ordinea declarării variabilelor registru.

Exemplu:


void f (register int i)

{ register char c;

register int j;

. . .


}

Mai întâi se alocă parametrul i într-un registru, apoi se alocă c şi j în alţi doi regiştri.

Se recomandă alocarea în regiştri a variabilelor care au o utilizare mare, de exemplu a indicilor de tablouri.


Yüklə 1,64 Mb.

Dostları ilə paylaş:
1   2   3   4   5   6   7   8   9   ...   44




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin