Differences

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

Link to this comparison view

cpl:labs:06 [2016/11/07 22:02]
bogdan.nitulescu [Tipuri de secțiuni]
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 203: Line 192:
 În limbajul C, inferența de tipuri este necesară în momentul în care într-o expresie, operanzii au tipuri diferite, iar operațiile asociate expresiei sunt valide pentru mai multe din tipurile implicate în expresie. În astfel de cazuri, se aplică intern conversii între tipurile operanzilor la alte tipuri care să permită corectitudinea operațiilor,​ pe operanzi omogeni (din punct de vedere al tipurilor). Astfel de conversii se numesc conversii implicite, iar omogenitatea tipurilor operanzilor este dictată de standardele limbajului de programare (de exemplu pentru C, standardul ANSI). În limbajul C, inferența de tipuri este necesară în momentul în care într-o expresie, operanzii au tipuri diferite, iar operațiile asociate expresiei sunt valide pentru mai multe din tipurile implicate în expresie. În astfel de cazuri, se aplică intern conversii între tipurile operanzilor la alte tipuri care să permită corectitudinea operațiilor,​ pe operanzi omogeni (din punct de vedere al tipurilor). Astfel de conversii se numesc conversii implicite, iar omogenitatea tipurilor operanzilor este dictată de standardele limbajului de programare (de exemplu pentru C, standardul ANSI).
  
-Un caz foarte interesant de inferență de tip este cel din COOL, și în limbajele funcționale,​ în care o expresie returnează mereu o valoare, chiar și in cazul instrucțiunilor de bază – if, while, case. În mod evident, o astfel de expresie, cu mai multe ramuri, va returna tipul de date din care sunt derivate toate tipurile rezultatelor ramurilor. În COOL, de exemplu, a fost introdus SELF_TYPE, care este mereu evaluat la tipul clasei în care se află. Dacă o metodă virtuală a clasei de bază întoarce SELF_TYPE, ea va intoarce: 
-* când este apelată printr-o instanță a clasei de bază -> tipul clasei de bază 
-* când este apelată printr-o instanță a unei clase derivate -> tipul clasei derivate. 
  
 ===== Conversiile de tipuri ===== ===== Conversiile de tipuri =====
Line 267: Line 253:
 q = (int *) p; q = (int *) p;
 </​code>​ </​code>​
 +
 +====== Exerciții ======
 +{{:​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>​
 +  - 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.
 +  - Scrieți un program care să determine ordinea secțiunilor în memorie.
 +    * ''​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**:
 +<file c ex8.c>
 +#include <​string.h>​ //memcmp
 +#include <​stdio.h>​
 +
 +struct comp_ex {
 +    char c;
 +    int i;
 +    short s;
 +};
 +
 +int main()
 +{
 +     ​struct comp_ex sa, sb;
 +
 +     // toate câmpurile din a și b sunt inițializate ​
 +     sa.c = sb.c = 1;
 +     sa.i = sb.i = 2;
 +     sa.s = sb.s = 3;
 +
 +     if (0 == memcmp(&​sa,​ &sb, sizeof(struct comp_ex)))
 +         ​printf("​structurile sunt identice\n"​);​
 +     else
 +         ​printf("​structurile sunt diferite\n"​);​
 +
 +     ​return 0;
 +}
 +</​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.1478548921.txt.gz · Last modified: 2016/11/07 22:02 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