FUNCTII IN LIMBAJUL C Apelul unei funcţii

În limbajul C funcţiile sunt de două tipuri: funcţii care returnează o valoare la revenirea din ele; funcţii care nu returnează nici o valoare la revenirea din ele. O funcţie care nu returnează nici o valoare la revenirea din ea se apelează printr-o instrucţiune de apel. Ea are următorul format: nume (lista_parametrilor_efectivi); unde: nume este numele funcţiei; lista_parametrilor_efectivi este fie vidă, fie se compune din una sau mai multe expresii separate prin virgulă. Instrucţiunea de apel este un caz particular al instrucţiunii expresie. Parametrii efectivi (de la apel) trebuie să corespundă cu cei formali (de la definirea funcţiei) prin ordine, tip şi număr. În cazul în care o funcţie returnează o valoare, ea poate fi apelată fie printr-o instrucţiune de apel, fie sub forma unui operand al unei expresii. Observaţii: 1) Dacă nu dorim să utilizăm valoarea returnată de funcţia respectivă, apelul se face printr-o instrucţiune de apel. 2) Dacă dorim să utilizăm valoarea returnată de funcţie, vom folosi apelul funcţiei drept operand într-o expresie, operandul având formatul (*). Exemple de apeluri de funcţii folosite până acum sunt apelurile funcţiilor standard printf, scanf, getchar şi putchar. Funcţiile printf şi putchar au fost apelate prin instrucţiuni de apel, valorile returnate de ele nefiind utilizate. În schimb funcţiile scanf şi getchar au fost apelate în ambele moduri, atât prin instrucţiuni de apel, cât şi ca operanzi în diferite expresii (*)

Prototipul unei funcţii
O funcţie poate fi apelată dacă ea este definită în fişierul sursă înainte de a fi apelată; nu întotdeauna este posibil acest lucru şi în astfel de cazuri apelul funcţiei trebuie să fie precedat de prototipul ei.

Prototipul unei funcţii are ca scop să informeze compilatorul despre: tipul valorii returnate de funcţie; tipurile parametrilor. În felul acesta, la apelul unei funcţii, compilatorul poate face teste cu privire la tipul expresiilor care reprezintă parametrii efectivi, precum şi unele conversii necesare asupra valorii returnate de funcţie. Observaţii: 1o. Tipurile parametrilor pot să lipsească. În acest caz, compilatorul nu controlează tipurile parametrilor efectivi, singura informaţie conţinută de prototip fiind tipul valorii returnate de funcţia respectivă. 2o. Absenţa atât a prototipului unei funcţii, cât şi a definiţiei funcţiei înainte de a fi apelată este posibilă; în acest caz se presupune că funcţia returnează o valoare de tip int. 3o. În practică se recomandă utilizarea prototipurilor pentru toate funcţiile înainte de a fi apelate. În acest scop, ele vor fi scrise la începutul fişierelor sursă. 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 funcţie care nu are parametri. Formatul 4 se poate folosi pentru orice funcţie la al cărei apel nu se doresc teste referitoare la tipul parametrilor efectivi. Funcţiile din biblioteca standard a limbajului C au prototipurile definite în fişierele de tip .h.

Apel prin valoare şi apel prin referinţă
La apelul unei funcţii, fiecărui parametru formal i se atribuie valoarea parametrului efectiv care-i corespunde. Deci, la apelul unei funcţii se transferă valorile parametrilor efectivi. Din această cauză se spune că apelul este prin valoare (call by value). În anumite limbaje de programare, la apel nu se transferă valorile parametrilor efectivi ci adresele acestora. În acest caz se spune că apelul este prin referinţă (call by refference).

Între cele două tipuri de apeluri există o diferenţă esenţială şi anume: în cazul apelului prin valoare funcţia apelată nu poate modifica parametrii efectivi din funcţia apelantă, neavând acces la ei. În cazul apelului prin referinţă, funcţia apelată, dispunând de adresele parametrilor efectivi, îi poate modifica. În limbajul C apelul se realizează implicit prin valoare. În cazul că un parametru este numele unui tablou atunci transferul se realizează prin referinţă deoarece numele unui tablou este un pointer şi conţine adresa primului element al tabloului. Transferul prin referinţă se realizează cu ajutorul variabilelor de tip pointer şi cu ajutorul operatorului de adresă (&).

Revenirea dintr-o funcţie
Revenirea dintr-o funcţie se poate face în două moduri: la întâlnirea instrucţiunii return; după execuţia ultimei sale instrucţiuni, adică a instrucţiunii care precede acolada închisă ce termină corpul funcţiei respective. Instrucţiunea return are două formate: return; sau return expresie;

Primul format se utilizează când funcţia nu returnează o valoare, iar cel de-al doilea când funcţia returnează o valoare. În acest ultim caz, funcţia returnează valoarea expresiei specificate. Observaţie: 1o. Când revenirea se face după execuţia ultimei instrucţiuni a funcţiei nu se returnează o valoare; revenirea în acest caz, se face ca şi cum acolada închisă de la sfârşitul corpului funcţiei ar fi precedată de instrucţiunea return. Exemplu: vom da un exemplu de apel al funcţiei care determină rădacina pătratică dintr-un număr nenegativ. #include<stdio.h> double radacina_2 (double) // prototipul functiei

void main (void) // si afiseaza radacina patrata din d { double d; clrscr();

// functia principala care citeste d

// sterge ecranul

if (scanf (“%lf”,&d) != || d<0) printf (“numarul dat este eronat\n”); else printf (“d=%f, radacina patrata = %.10g\n”, d, radacina_2(d)); #define EPS 1e-10 double radacina_2 (double x) { double x1,x2,y; x2 = 1.0; do { x1 = x2; x2 = 0.5 *(x1+x/x1); // formula de iteratie

if ((y=x2-x1) < 0) y = -y; } while (y >= EPS); return x2; } Observaţie: Limbajul C dispune de o bibliotecă matematică în care sunt incluse o serie de funcţii pentru calculul valorilor funcţiilor elementare. Există o funcţie numită sqrt (cu prototipul double sqrt (double);). Fişierul care conţine biblioteca matematică se numeşte math.h şi trebuie inclus în fişierul sursă de lucru dacă se doreşte utilizarea funcţiilor definite în el.

Sign up to vote on this title
UsefulNot useful