Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Apelul si revenirea dintr-o functie

c



+ Font mai mare | - Font mai mic



Apelul si revenirea dintr-o functie

1. Apelul unei functii



In limbajul C functiile sunt de doua tipuri:

functii care returneaza o valoare la revenirea din ele;

functii care nu returneaza nici o valoare la revenirea din ele.

O functie care nu returneaza nici o valoare la revenirea din ea se apeleaza printr-o instructiune de apel. Ea are urmatorul format:

nume (lista_parametrilor_efectivi); (*)

unde:

nume este numele functiei;

lista_parametrilor_efectivi este fie vida, fie se compune din una sau mai multe expresii separate prin virgula.

Instructiunea de apel este un caz particular al instructiunii expresie. Parametrii efectivi (de la apel) trebuie sa corespunda cu cei formali (de la definirea functiei) prin ordine, tip si numar.

In cazul in care o functie returneaza o valoare, ea poate fi apelata fie printr-o instructiune de apel, fie sub forma unui operand al unei expresii.

Observatii:

1o. Daca nu dorim sa utilizam valoarea returnata de functia respectiva, apelul se face printr-o instructiune de apel.

2o. Daca dorim sa utilizam valoarea returnata de functie, vom folosi apelul functiei drept operand intr-o expresie, operandul avand formatul (*).

Exemple de apeluri de functii folosite pana acum sunt apelurile functiilor standard printf, scanf, getchar si putchar. Functiile printf si putchar au fost apelate prin instructiuni de apel, valorile returnate de ele nefiind utilizate. In schimb functiile scanf si getchar au fost apelate in ambele moduri, atat prin instructiuni de apel, cat si ca operanzi in diferite expresii.

2. Prototipul unei functii

O functie poate fi apelata daca ea este definita in fisierul sursa inainte de a fi apelata. Dupa cum am prezentat in lectia 1 nu intotdeauna este posibil acest lucru si in astfel de cazuri apelul functiei trebuie sa fie precedat de prototipul ei.

Prototipul unei functii are ca scop sa informeze compilatorul despre:

tipul valorii returnate de functie;

tipurile parametrilor.

In felul acesta, la apelul unei functii, compilatorul poate face teste cu privire la tipul expresiilor care reprezinta parametrii efectivi, precum si unele conversii necesare asupra valorii returnate de functie.

Observatii:

1o. Tipurile parametrilor pot sa lipseasca. In acest caz, compilatorul nu controleaza tipurile parametrilor efectivi, singura informatie continuta de prototip fiind tipul valorii returnate de functia respectiva.

2o. Absenta atat a prototipului unei functii, cat si a definitiei functiei inainte de a fi apelata este posibila; in acest caz se presupune ca functia returneaza o valoare de tip int.

3o. In practica se recomanda utilizarea prototipurilor pentru toate functiile inainte de a fi apelate. In acest scop, ele vor fi scrise la inceputul fisierelor sursa.

Formatele posibile ale unui prototip sunt:

formatul 1:    tip nume (lista_declaratiilor_de_parametri);

formatul 2:    tip nume (lista_ tipurilor_parametrilor);

formatul 3:    tip nume (void);

formatul 4:    tip nume ();

Formatul 2 este cel mai utilizat. Formatul 3 se poate folosi pentru orice functie care nu are parametri. Formatul 4 se poate folosi pentru orice functie la al carei apel nu se doresc teste referitoare la tipul parametrilor efectivi.

Functiile din biblioteca standard a limbajului C au prototipurile definite in fisierele de tip .h.

3. Apel prin valoare si apel prin referinta

La apelul unei functii, fiecarui parametru formal i se atribuie valoarea parametrului efectiv care-i corespunde. Deci, la apelul unei functii se transfera valorile parametrilor efectivi. Din aceasta cauza se spune ca apelul este prin valoare (call by value). In anumite limbaje de programare, la apel nu se transfera valorile parametrilor efectivi ci adresele acestora. In acest caz se spune ca apelul este prin referinta (call by refference).

Intre cele doua tipuri de apeluri exista o diferenta esentiala si anume: in cazul apelului prin valoare functia apelata nu poate modifica parametrii efectivi din functia apelanta, neavand acces la ei. In cazul apelului prin referinta, functia apelata, dispunand de adresele parametrilor efectivi, ii poate modifica.

In limbajul C apelul se realizeaza implicit prin valoare. In cazul ca un parametru este numele unui tablou atunci transferul se realizeaza prin referinta deoarece numele unui tablou este un pointer si contine adresa primului element al tabloului. Transferul prin referinta se realizeaza cu ajutorul variabilelor de tip pointer si cu ajutorul operatorului de adresa (&).

4. Revenirea dintr-o functie

Revenirea dintr-o functie se poate face in doua moduri:

la intalnirea instructiunii return;

dupa executia ultimei sale instructiuni, adica a instructiunii care precede acolada inchisa ce termina corpul functiei respective.

Instructiunea return are doua formate:

return; sau return expresie;

Primul format se utilizeaza cand functia nu returneaza o valoare, iar cel de-al doilea cand functia returneaza o valoare. In acest ultim caz, functia returneaza valoarea expresiei specificate.

Observatie:

1o. Cand revenirea se face dupa executia ultimei instructiuni a functiei nu se returneaza o valoare; revenirea in acest caz, se face ca si cum acolada inchisa de la sfarsitul corpului functiei ar fi precedata de instructiunea return.

Exemplu: vom da un exemplu de apel al functiei care determina radacina patratica dintr-un numar nenegativ.

#include<stdio.h>

double radacina_2 (double); // prototipul functiei

void main (void)    // functia principala care citeste d

// si afiseaza radacina patrata din d

while (y >= EPS);

return x2;

Observatie:

1o. Limbajul C dispune de o biblioteca matematica in care sunt incluse o serie de functii pentru calculul valorilor functiilor elementare. Exista o functie numita sqrt (cu prototipul double sqrt (double);). Fisierul care contine biblioteca matematica se numeste math.h si trebuie inclus in fisierul sursa de lucru daca se doreste utilizarea functiilor definite in el.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 820
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved