Differences

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

Link to this comparison view

cpl:labs:06 [2016/11/07 22:26]
bogdan.nitulescu [Inferența de tipuri]
cpl:labs:06 [2016/11/08 00:02] (current)
bogdan.nitulescu [Exerciții]
Line 77: Line 77:
   * "Tip *a" **NU** este echivalent cu "Tip a[ ]". Majoritatea cred că a[5] este echivalent cu *(a+5) și crede că a declara o variabilă ca "​pointer"​ este echivalent cu a o declara "​array"​. După cum s-a explicat mai sus - array-ul e un șir continuu de elemente de tipul "​Tip",​ pe când pointer-ul e o adresa la un element de tipul "​Tip"​. Rezultatul operatorului ''​sizeof''​ diferă.   * "Tip *a" **NU** este echivalent cu "Tip a[ ]". Majoritatea cred că a[5] este echivalent cu *(a+5) și crede că a declara o variabilă ca "​pointer"​ este echivalent cu a o declara "​array"​. După cum s-a explicat mai sus - array-ul e un șir continuu de elemente de tipul "​Tip",​ pe când pointer-ul e o adresa la un element de tipul "​Tip"​. Rezultatul operatorului ''​sizeof''​ diferă.
 În general translatoarele fac ''​cast''​ automat între pointer și array și de aceea diferența poate fi uneori greu de conştientizat. În general translatoarele fac ''​cast''​ automat între pointer și array și de aceea diferența poate fi uneori greu de conştientizat.
-Un exemplu care arata diferenta: 
-<code c> 
-// in f1.cpp: 
-extern int* v; 
-// in f2.cpp: 
-int v[10]; 
- 
-La compilare: 
-Error 1 error C2372: '​v'​ : redefinition;​ different types of indirection 
-</​code>​ 
- 
  
 Un exemplu și pentru reprezentarea și plasarea în memorie a array-urilor și pointerilor,​ inclusiv din punct de vedere al secțiunilor în care ajung aceste date este următorul: Un exemplu și pentru reprezentarea și plasarea în memorie a array-urilor și pointerilor,​ inclusiv din punct de vedere al secțiunilor în care ajung aceste date este următorul:
Line 266: Line 255:
  
 ====== Exerciții ====== ====== Exerciții ======
-{{:​cpl:​labs:​laborator-05-arhiva.zip|Arhiva}} laboratorului.+{{:​cpl:​labs:​lab06_skel.zip|Arhiva}} laboratorului.
   - De ce nu există diferențe pentru definițiile lui v între următoarele semnături de funcții? <code c> void f(int * v); </​code> ​ și <code c> void g(int v[]); </​code>​   - De ce nu există diferențe pentru definițiile lui v între următoarele semnături de funcții? <code c> void f(int * v); </​code> ​ și <code c> void g(int v[]); </​code>​
 +  - Intrati in directorul ''​diff_vec_ptr1''​. Rulati ''​make''​ apoi rulati programul. Care este problema? Incercati sa explicati apoi rezolvati bug-ul. Puteti vedea acelasi comportament si ruland codul din directorul ''​diff_vec_ptr2''​.
   - Determinați (inspectând codul asm) cum sunt implementați [[http://​gcc.gnu.org/​onlinedocs/​gcc/​Variable-Length.html | vectorii automatici de lungime variabilă]]. Pentru vectori automatici de lungime constantă ''​sizeof(v)''​ reprezintă toată memoria alocată (în bytes) pentru acel vector - o constantă cunoscută la momentul compilării. Cum este implementat operatorul ''​sizeof''​ pentru vectori de lungime variabilă? Folosiți codul din directorul ''​alloca''​ din arhiva laboratorului.   - Determinați (inspectând codul asm) cum sunt implementați [[http://​gcc.gnu.org/​onlinedocs/​gcc/​Variable-Length.html | vectorii automatici de lungime variabilă]]. Pentru vectori automatici de lungime constantă ''​sizeof(v)''​ reprezintă toată memoria alocată (în bytes) pentru acel vector - o constantă cunoscută la momentul compilării. Cum este implementat operatorul ''​sizeof''​ pentru vectori de lungime variabilă? Folosiți codul din directorul ''​alloca''​ din arhiva laboratorului.
   - Scrieți un program care să determine ordinea secțiunilor în memorie.   - Scrieți un program care să determine ordinea secțiunilor în memorie.
     * ''​Hint'':​ Declarați obiecte în fiecare secțiune și verificați adresa.     * ''​Hint'':​ Declarați obiecte în fiecare secțiune și verificați adresa.
 +  - Intrati in directorul ''​classes''​. Fara a modifica functia main, faceti schimbari in fisierul ''​classes.cpp''​ astfel incat sa apara "​different"​. Scoateti cast-urile catre void *. De ce afiseaza din nou "​same"?​
   - Modificați programul următor pentru a afișa **structurile sunt identice**:   - Modificați programul următor pentru a afișa **structurile sunt identice**:
 <file c ex8.c> <file c ex8.c>
Line 300: Line 291:
 </​file>​ </​file>​
  
 +===== BONUS =====
 +Intrati in directorul ''​bonus'',​ compilati si rulati programul. De ce primim ''​Segmentation fault''?​ In ce sectiuni se gasesc "Hello 1", "Hello 2", pc1, respectiv pc2?
  
cpl/labs/06.1478550410.txt.gz · Last modified: 2016/11/07 22:26 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