Differences

This shows you the differences between two versions of the page.

Link to this comparison view

cpl:labs:07 [2016/11/15 02:29]
bogdan.nitulescu [Cadre de stiva (stack frames)]
cpl:labs:07 [2016/11/15 02:35] (current)
bogdan.nitulescu [Prototipuri de funcții]
Line 390: Line 390:
  
 ===== Prototipuri de funcții ===== ===== Prototipuri de funcții =====
-Un prototip de funcție reprezintă o declarare a funcției care omite corpul funcției, dar specifică numele, tipul parametrilor și tipul întors. În timp ce definiția unei funcții specifică ​ce face o funcție, prototipul ​funcției ​poate fi descris ca fiind interfața funcției. Acest lucru este pus în evidență în IDE-urile care au opțiuni diferite “Go to declaration” și “Go to definition”.+Un prototip de funcție reprezintă o declarare a funcției care omite corpul funcției, dar specifică numele, tipul parametrilor și tipul întors. În timp ce definiția unei funcții specifică ​implementarea unei funcții, prototipul poate fi descris ca fiind interfața funcției. Acest lucru este pus în evidență în IDE-urile care au opțiuni diferite “Go to declaration” și “Go to definition”.
  
-Prototipurile ​sunt foarte importante, pentru că ele sunt folosite de compilator pentru a determina caracteristicile unei funcții ce urmează a fi apelata pentru a i se putea transmite parametrii ​sau a se putea primi valoarea întoarsă ​de funcție. De asemeneaprototipul funcției este folosit și în funcția apelată pentru primirea parametrilor de la funcția apelantă, precum și pentru transmiterea valorii întoarse de funcție.+Prototipurile sunt folosite de compilator pentru a determina caracteristicile unei funcții ce urmează a fi apelatapentru a i se transmite parametrii ​și a se primi valoarea întoarsă, ​fără a avea acces la codul sursă al funcției.
  
-Dacă prototipul funcției vizibil în locul sau locurile ​în care funcția este apelata diferă de prototipul functiei din locul în care funcția este definita, atunci se pot ajunge la apeluri de funcție eronate, datorate incompatibilității între numărul și tipul parametrilor din locul apelării funcției și din funcția propriu-zisă.+Dacă prototipul funcției vizibil în locul în care funcția este apelata diferă de prototipul functiei din locul în care funcția este definita, atunci se pot ajunge la apeluri de funcție eronate, datorate incompatibilității între numărul și tipul parametrilor din locul apelării funcției și din funcția propriu-zisă.
  
-Din punct de vedere al compilatorului, dacă o funcție nu este declarată, ea va avea automat atribuit prototipul implicit al funcțiilor:​+În limbajul C, dacă o funcție nu este declarată, ea va avea automat atribuit prototipul implicit al funcțiilor:​
  
 <code c> <code c>
Line 411: Line 411:
 int func(typeof_x,​ typeof_y, typeof_z); int func(typeof_x,​ typeof_y, typeof_z);
 </​code>​ </​code>​
-**ATENȚIE**:​ dacă tipurile argumentelor sunt mai mici decât un ''​int'',​ compilatorul de C va face upcast parametrului la int și apoi va chema funcția. Dacă implementarea funcției se aștepta să îi fi fost trimiși mai puțini bytes se poate corupe memoria. Exemplu: 
-<code c> 
-char c = '​a';​ 
-short s = 1; 
-f(c, s); 
- 
-// semnătură implicită generată: ​ 
-int f(int, int); 
-</​code>​ 
-Presupunând că parametrii sunt trimiși pe o stivă adresabilă la nivel de octet și că ''​sizeof(char) = 1'',​ ''​sizeof(short) = 2''​ și ''​sizeof(int) = 4''​ avem următoarea diferență între ce așteptă funcția ''​f''​ să primească ca parametri și ce argumente au fost pasate pe stivă. 
-| parametri trimiși la apel | c0 | c1 | c2 | c3 | s0 | s1 | s2 | s3 | 
-| parametri așteptați de implementare | c1 | s0 | s1 | 
- 
- 
- 
-în general compilatoarele fac verificări de compatibilitate între prototipurile unei aceleiași funcții, dar există cazuri cand aceste verificări nu sunt posibile (de exemplu când se folosesc funcții din biblioteci). 
  
 Un exemplu de functionare eronată a unui apel de funcție din motive de incompatibilitate între prototipurile unei funcții: Un exemplu de functionare eronată a unui apel de funcție din motive de incompatibilitate între prototipurile unei funcții:
Line 451: Line 435:
   * în locul de unde se face apelul, nu se transmite niciun parametru, și se aşteaptă să se întoarcă o valoare de tip int,   * în locul de unde se face apelul, nu se transmite niciun parametru, și se aşteaptă să se întoarcă o valoare de tip int,
   * în funcția apelată, se așteapta 2 parametri care vor fi citiți eronat din locațiile corespunzătoare,​ iar valoarea întoarsă va fi un long long.    * în funcția apelată, se așteapta 2 parametri care vor fi citiți eronat din locațiile corespunzătoare,​ iar valoarea întoarsă va fi un long long. 
- 
-Cea mai frecventă eroare din punct de vedere al incompatibilității între prototipuri este aceea a nedeclarării prototipurilor în cazul unor funcții de bibliotecă,​ fapt ce duce la folosirea prototipului implicit și la imposibilitatea verificării compatibilității între prototipuri. 
  
 Este important de observat, totuși, ca majoritatea limbajelor moderne (inclusiv C++, versus C) nu acceptă tipuri si prototipuri implicite. Este important de observat, totuși, ca majoritatea limbajelor moderne (inclusiv C++, versus C) nu acceptă tipuri si prototipuri implicite.
cpl/labs/07.1479169783.txt.gz · Last modified: 2016/11/15 02:29 by bogdan.nitulescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0