This shows you the differences between two versions of the page.
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? | ||