17.04.2013 Views

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Transmiterea argumentelor efective la apelul unei functii se face <strong>în</strong> C prin copierea<br />

valorilor argumentelor efective <strong>în</strong> argumentele formale (care sunt variabile locale ale<br />

functiei). In acest fel functia apelatã lucreazã cu duplicate ale variabilelor argumente<br />

efective si nu poate modifica accidental variabile din functia apelantã.<br />

Compilatorul C genereazã o secventã de atribuiri la argumentele formale <strong>în</strong>ainte de<br />

efectuarea saltului la prima instructiune din functia apelatã. Din acest motiv toate<br />

conversiile de tip efectuate automat la atribuire se aplicã si la transmiterea<br />

argumentelor.<br />

In functia urmãtoare se modificã aparent valoarea lui k dar de fapt se modificã o<br />

variabilã localã, fãrã sã fie afectatã variabila ce contine pe k <strong>în</strong> "main":<br />

long fact (int k) { // calcul factorial<br />

long kf=1L;<br />

while (k > 0 )<br />

kf = kf * k--; // k=k-1 dupa inmultire<br />

return kf; // rezultat functie<br />

}<br />

Un alt exemplu clasic este o functie care <strong>în</strong>cearcã sã schimbe <strong>în</strong>tre ele valorile a<br />

douã variabile, primite ca argumente:<br />

void swap (int a, int b) { // nu este corect !!!<br />

int aux;<br />

aux=a; a=b; b=aux;<br />

}<br />

void main () {<br />

int x=3, y=7;<br />

swap(x,y);<br />

printf ("%d,%d \n",x,y); // scrie 3,7 !<br />

}<br />

In general o functie C nu poate transmite rezultate si nu poate modifica argumente<br />

de un tip numeric. In C pentru transmiterea de rezultate prin argumente de cãtre o<br />

functie trebuie sã folosim argumente formale de tip pointer (adrese de memorie).<br />

Versiunea corectã pentru functia “swap” este urmãtoarea:<br />

void swap (int * pa, int * pb) { // pointeri la intregi<br />

int aux;<br />

aux=*pa; *pa=*pb; *pb=aux;<br />

}<br />

Apelul acestei functii foloseste argumente efective pointeri:<br />

int x, y ; . . .<br />

swap (&x, &y) ; // schimba valorile x si y intre ele

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!