APELUL UNEI FUNCŢII. TRANSMITEREA PARAMETRILOR
O functie se poate apela din alta functie sau chiar din interiorul ei (recursivitatea este permisa ) si apelul consta în numele functiei urmata, între paranteze rotunde, de lista parametrilor (la apelare numiti parametri actuali) separati prin virgula. Daca functia nu are parametri , între paranteze nu se pune nimic.
Apelul unei functii apare în expresii si tine locul unui operand al expresiei, caz în care valoarea întoarsa de functie participa la calculul valorii finale a expresiei, dupa cum apelul poate apare si singur, caz în care eventuala valoare întoarsa este ignorata.
Din legatura dintre functia apelanta si functia apelata se face prin parametri pentru legatura : apelant -> apelat si prin valoarea întoarsa (sau numai efectele acesteia) pentru legatura: apelat -> apelant.
În exemplul din paragraful precedent, apelul din expresia:
d=cmmdc(a,b);
realizeaza ramificarea catre functia cmmdc careia îi transmite valorile a si b, urmând ca functia sa returneze cel mai mare divizor comun al numerelor a si b. Acest tip de transmitere parametri se numeste prin valoare.
Precizam ca functia apelanta transmite parametri actuali functiei apelate într-o stiva de valori care de fapt sunt o copie în niste variabile temporare a parametrilor actuali. În concluzie, la transmiterea parametrilor prin valoare, variabilele din functia apelanta care semnifica parametri actuali nu pot fi modificate de catre functia apelata, iar aceasta din urma transmite apelantei doar o singura valoare, cea din instructiunea return. Deci, functia apelata comunica cu cea apelanta printr-o singura valoare, fapt ce ar constitui o limitare destul de serioasa pentru ca sunt mai frecvente situatiile când functia apelata ar trebui sa returneze doua sau mai multe valori.
Aceasta se poate realiza prin transmiterea parametrilor prin adresa, situatie în care functia apelata, având adresele unor variabile din functia apelanta, astfel le poate modifica.
Transmiterea parametrilor prin adresa se mai numeste prin pointeri si vom spune mai mult despre ea la capitolul "Pointeri".
Daca o functie mai poate comunica cu functia apelanta si prin variabile de tip extern, variabile care odata declarate înaintea tuturor functiilor sunt vizibile în toate functiile de dupa ele.
Astfel, exemplul 4.1. cu variabile extern este:
Exemplu 4.2.
# include "stdio. h"
/ * Prototipuri de functii si declaratii de variabile extern */
Void cmmdc ( void ) ;
void cmmmc (void ) ;
unsigned long a, b, d, m;
Definiri de functii
main ( )
while ( a < = 0 | | b < = 0 ) ;
cmmdc ( ) ;
cmmmc ( ) ;
printf ( " c . m. m. d. c. ( % l u , % lu ) = % lu \ n" , a , b , d ) ;
printf ( " c. m. m. m. c. ( % lu , % lu ) = % lu \ n " , a , b , m ) ;
}
/ * Definirea functiei cmmdc * /
void cmmdc ( void )
d = v ;
}
/ &* Definirea functiei cmmc * /
void cmmmc ( void )
De fapt , in practica se utilizeaza combinatii din cele trei tipuri de transmitere parametri . O functie comunica cu apelantul si prin valoare si prin adresa ( pointeri ) si prin variabile extern .
La general parametri unei functii pot fi :
-scalari
- structuri ;
- uniuni ;
_ pointeri ; catre scalari ;
_ pointeri catre structuri ;
_ pointeri catre uniuni .
La capitolele " Pointeri " , " Structuri " , " Uniuni " vom prezenta si citeva exemple comentate despre aceste tipuri de parametri .
|