1.11. Apelul si prototipul functiilor

2018/12/24 in Programare in C

Intr-un program o functie poate avea o definitie si unul sau mai multe apeluri.

Definitia unei functii

Am vazut ca o functie se defineste printr-un antet urmat de corpul ei. De obicei, antetul are formatul:

tip nume(lista_declaratiilor_parametrilor_formali)

Lista declaratiilor parametrilor formali este fie vida, fie contine o declaratie de parametru formal sau mai multe, separate prin virgula. Declaratiile parametrilor formali aflate intr-o lista de felul celei de mai sus nu se termina prin punct si virgula ca cele pentru variabila simpla sau tablouri.

Exemple:

1. int f(int x, double y)

Functia f are doi parametri:

Functia returneaza o valoare de tip int.

2. double df(long a, int b, unsigned c)

Functia df are trei parametri:

Functia returneaza o valoare de tip double.

Apelul unei functii

O functie poate fi apelata folosind o constructie de forma:

nume(lista_declaratiilor_parametrilor_efectivi)

unde:

nume Este numele functiei care se apeleaza
lista parametrilor efectivi Este fie vida daca functia nu are parametri, fie se compune din unul sau mai multi parametri efectivi separati prin virgule.
Un parametru efectiv este o expresie.
Parametrii efectivi se corespund cu cei formali prin ordine si tip.

La apel se atribuie parametrilor formali valorile parametrilor efectivi si apoi executia se continua cu prima instructiune din corpul functiei apelate. La revenirea din functie se ajunge in functia din care s-a facut apelul si executia continua cu constructia urmatoare apelului.

Pentru a apela o functie putem utiliza constructia de mai sus urmata de caracterul punct si virgula.

O alta posibilitate este aceea de a folosi constructia de mai sus ca operand al unei expresii. Un astfel de apel este posibil numai pentru functiile care returneaza o valoare la revenirea din ele. In acest caz valoarea returnata de functie se foloseste la evaluarea expresiei din care s-a facut apelul.

Un parametru efectiv de la apelul unei functii poate fi numele unui tablou. In acest caz, in antetul functiei respective parametrul corespunzator il vom declara ca fiind tablou.

De exemplu, daca tab este un tablou unidimensional declarat astfel:

int tab[100];

si tab se foloseste la apelul functiei f:

f(tab);

atunci functia f are antetul:

void f(int x[100]);

Limita superioara 100 poate fi omisa la declararea parametrului formal x, dar nu si parantezele patrate. Deci aceeasi functie poate avea urmatorul antet:

void f(int x[]);

In cazul parametrilor formali care sunt tablouri cu mai multe dimensiuni, numai limita superioara a primului indice poate fi omisa.

Exemplu:

Fie declatia

double mat[4][10];

si apelul

fct(mat);

Antetul functiei fct poate fi urmatorul:

void fct(double mat[][10]);

O functie poate fi apelata intr-un punct al unui fisier sursa numai daca in prealabil a fost definita in acelasi fisier sursa.

Exemplu:

void f1(void) // definitia functiei f1
{
...
}
void f2(void) // definitia functiei f2
{
...
/*se apeleaza functia f1; ea este in prealabil definita*/
f1();
...
}

Prototipul unei functii

Apelurile unei functii nu pot fi intotdeauna precedate de definitia ei. In astfel de cazuri definitia functiei apelate este inlocuita printr-un asa numit prototip al ei.

Prototipul unei functii are un format asemanator cu antetul ei. Acesta reprezinta o informatie pentru compilator cu privire la:

Aceste informatii sunt prezente in antetele functiilor. De aceea, un prototip al unei functii poate fi scris ca si antetul functiei respective, dupa care se pune punct si virgula. Exista si o forma prescurtata pentru prototip si anume aceea in care sunt omise numele parametrilor:

tip nume(lista tipurilor parametrilor formali);

Exemple:

1. void f(void);

Prototipul de fata indica faptul ca f este o functie fara parametri si care nu returneaza nicio valoare.

2. double a(void);

Functia a nu are parametri. Ea returneaza o valoare flotanta in dubla precizie.

3. void c(int x, long y[], double z);

Functia c nu returneaza nicio valoare. Ea are trei parametri:

4. void c(int, long[], double);

Acest prototip exprima acelasi lucru cu cel precedent.

Compilatorul utilizeaza datele din prototip pentru a verifica tipurile datelor de la apel (parametrii efectivi). In cazul in care un parametru efectiv are un tip diferit de tipul corespunzator din prototip, compilatorul C converteste automat valoarea parametrului efectiv spre tipul indicat in prototip.

Utilizatorii limbajelor C si C++ pot folosi o serie de functii aflate in bibliotecile standard ale acestor limabaje. Apelul unei functii de biblioteca implica si el prezenta prealabila a prototipului functiei respective in textul sursa. Pentru a simplifica inserarea in textul sursa a prototipurilor functiilor de biblioteca, au fost construite fisiere cu asfel de prototipuri. Ele au extensia .h (header). Un astfel de fisier contine prototipuri pentru functii de biblioteca "inrudite". De exemplu, fisierul stdio.h contine prototipuri pentru functiile de biblioteca utilizate frecvent in operatii de intrare / iesire, fisierul string.h contine prototipurile pentru functiile utilizate la prelucrarea sirurilor de caractere etc.


NOTA

In cazul mediului de dezvoltare Turbo C si C++ prototipurile functiilor de biblioteca si fisierele .h de care apartin si alte informatii utile pentru apelul lor pot fi gasite astfel:

1.12. Preprocesare