Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Domeniu; variabile externe

c


Domeniu; variabile externe

Variabile din main (line, save, etc) sint private sau locale lui
main; deoarece ele sint declarate in main, nici o alta functie
nu poate avea acces direct la ele. La fel se intimpla si cu
variabilele din alte functii de exemplu variabila i din getline nu
are nici o legatura cu varibila i din copy. Fiecare variabila
locala dintr-o rutina se naste numai atunci cind functia este
apelata si"dispare" cind functia isi termina activitatea. Aceasta
este ratiunea pentru care astfel de variabile sint cunoscute uzual
sint numele de variabile automate, urmind terminologia din alte
limbaje. Vom folosi 838h710i termenul de "automat" de aici inainte pentru a
ne referi la aceste variabile dinamice locale. (Capitolul 4 discu-
ta clasa de memorie "statica" in care variabilele locale isi
pastreaza valoarea intre apelurile la functii).
Deoarece variabilele automate vin si pleaca odata cu apeluri-
le de functii, ele nu-si pastreaza valoarea de la un apel
la altul si trebuie initializate explicit inainte de fiecare
intrare. Daca nu sint setate, rezultatele vor fi imprevizibile.
Ca o alternativa la variabilele automate, este posibil sa
definim variabile care sa fie "externe" tuturor functiilor,
adica, variabilele globale care sa fie accesate prin nume de orice
functie care doreste sa o faca. (Acest mecanism este foarte
asemanator cu COMMON din FORTRAN sau EXTERNAL din PL/1). Deoarece
variabilele externe sint accesibile global, ele pot fi folosite in
locul listelor de argumente pentru a comunica date intre functii.
Mai mult, deoarece variabilele externe exista permanent, si nu
apar si dispar dupa cum functia este apelata sau s-a terminat,
ele isi pastreaza valorile chiar si dupa ce s-a terminat functia
care le-a setat.

O variabila externa trebuie sa fie definita in afara
oricarei functii; acest lucru face sa se aloce memorie reala
pentru ea. Variabila trebuie deasemenea sa fie declarata in
fiecare functie care vrea sa o foloseasca; aceasta se poate face
fie printr-o declaratie explicita "extern", fie implicit prin
context. Pentru a face discutia corecta, vom rescrie programul
precedent, in care line, save, max vor fi declarate variabile
externe. Aceasta va cere modificari in apeluri, in declaratii si
in corpurile celor trei functii.

#define MAXLINE 1000 /* marimea maxima a liniei de intrare */
char line[MAXLINE]; /* linia de intrare */
char save[MAXLINE]; /* cea mai lunga linie este salvata aici*/
int max; /* lungimea liniei celei mai mari */
main() /* gaseste linia cea mai lunga ;versiune specializata*/

if (max > 0) /* a fost cel putin o linie */
printf("%s", save);
}

getline() /* versiune specializata */

line[i] = '\0';
return(i);
}

copy() /* versiune specializata */


Variabilele externe din main, getline si copy sint defi-
nite de primele linii din exemplul de mai sus care declara tipul
lor si provoaca o alocare de memorie pentru ele. Din punct de
vedere sintactic, definitiile externe sint asemanatoare cu decla-
ratiile pe care le-am folosit anterior dar deoarece ele apar in
afara functiilor, variabilele sint externe. Inainte ca o functie
sa poata folosi o variabila externa, numele variabilei trebuie sa
fie facut cunoscut functiei O modalitate pentru a face aceasta
este scriind o declaratie "extern"; declaratia este identica cu
cea de dinainte, avind insa in plus cuvintul cheie extern.
In anumite circumstante, declaratia "extern" poate fi omisa:
daca definitia externa a variabilei apare in fisierul sursa
inainte de folosirea ei intr-o functie particulara, atunci nu este
necesara o declaratie "extern" in functie. Deci, declaratiile
"extern" din main, getline si cpoy sint redundante. De fapt prac-
tica uzuala consta in plasarea definitiilor tuturor variabilelor
externe la inceputul fisierului sursa si apoi omiterea tuturor
declaratiilor "extern".
Daca programul consta din mai multe fisiere sursa si o
variabila este definita in fisierul 1 si folosita in fisie-
rul 2 atunci e nevoie de o declaratie "extern" in fisierul 2
pentru a conecta cele 2 aparitii ale variabilei. Acest subiect
este discutat pe larg in capitolul 4.

Puteti nota ca am folosit cu grija cuvintele "declaratie" si
"definitie" cind ne-am referit la variabile externe in aceasta
sectiune. "Definitiile" se refera la locul in care variabila
este efectiv creata si i se asigneaza memorie; "declaratie" se
refera la locul unde natura variabilei este declarata dar nu i se
aloca memorie.

Fiindca veni vorba, exista o tendinta de a face totul cu ajutorul
variabilelor externe deoarece ele par a simplifica toate
comunicatiile - listele de argumente sint scurte si variabilele
sint intodeauna acolo cind aveti nevoie de ele. Dar variabilele
externe sint intodeauna acolo chiar si cind nu aveti nevoie de
ele. Acest stil de a codifica este plin de pericole deoarece
el conduce la programe ale caror conexiuni de date nu sint
evidente clar - variabilele pot fi modificate in moduri neastep-
tate si chiar inadvertente iar programul devine greu de modi-
ficat daca acest lucru este necesar. A doua versiune a progra-
mului care cauta linia cea mai luunga este inferioara primei,
partial din aceste motive, si partial deoarece ea distruge genera-
litatea a doua functii atit de utile introducind in ele numele
unor variabile pe care le vor folosi.

Exercitiul 1.18 Testul din instructiunea for din functia
getline de mai sus este aproape de neinteles. Rescrieti
programul pentru a-l face mai clar dar pastrati acelasi com-
portament la sfirsitul fisierului sau la depasire de
buffer. Este acest comportament cel mai adecvat ?




Document Info


Accesari: 1096
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )