Sunteți pe pagina 1din 18

Laborator 3 - Referat

Tipuri de date utilizate în limbajul de programare C.


Programe care folosesc inițializarea datelor prin atribuire.

În laboratorul precedent s-a prezentat:


- modul de lucru Eclipse IDE (creare, editare cod sursă, compilare, rulare
proiect)

În acest laborator se va prezenta:


- tipuri de date predefinite,
- iniţializarea variabilelor prin operaţia de atribuire,
Pentru a putea experimenta în cadrul IDE-ului cele prezentate, în prima parte a
referatului se prezintă modul Debug al Eclipse, care permite vizualizarea valorilor
păstrate în memorie fără a utiliza funcţii specifice limbajului C pentru afişare-citire date.

1. Parte teoretică
Pentru partea practică a acestei lucrări de laborator se va utiliza Debugger-ul
IDE-ului Eclipse. Acesta va fi folosit pentru afișarea valorilor instantanee a variabilelor
declarate în cadrul unui program C.

1.1. Utilizarea Debugger-ului Eclipse


IDE-ul Eclipse, ca majoritatea IDE-urilor utilizate în programare, permite rularea
programelor în modul DEBUG. Acest mod de rulare a programelor este util atunci când
programele nu au erori de compilare dar nu îndeplinesc exact ceea ce a intenționat

1
programatorul. Pentru noi la acest pas Debugger-ul va fi util pentru monitorizarea
variabilelor fără a le afișa în consolă.

1.1.1. Crearea și compilarea unui proiect care permite rularea în modul Debug
După cum a fost prezentat în Laboratorul 2, la crearea unui proiect nou se poate
opta pentru variantele Release și Debug. Vom crea un proiect nou, denumit L4_1, care va
avea selectată și varianta Debug (vezi Fig. 8, pag. 8 din L2_referat).
Se va adăuga un nou fișier sursă C denumit ”testDebug.c”. Editați fișierul sursă
pentru a conține codul prezentat în fig.1.

Fig.1.
Salvați fișierul sursă și apoi alegeți comanda ”Build” – ”Debug” prin apăsarea pe

săgeata neagră din dreapta pictogramei ”Build” . Programul pentru depanare se va


crea chiar dacă vor fi afișate avertismente în consolă. Existența programului pentru
Debug poate fi verificată prin existența directorului ”Debug” în fereastra din stânga
(Project Explorer), așa cum este prezentat în fig.2.
În cazul în care scurtătura de realizare a variantei DEBUG prezentată mai sus nu
funcționează se va alege din meniul rapid al proiectului (click dreapta pe numele
proiectului) Build Project.

2
Fig.2.
Avertismentele atenționează asupra faptului că în programul compilat sunt declarate
variabile (care vor utiliza spațiu în MO) fără a fi utilizate pentru calcule sau pentru afișare
ceea ce pentru compilator înseamnă risipă de memorie. Pentru această etapă vom ignora
avertismentele respective.

1.1.2. Lansarea programului în modul DEBUG


După compilarea (BUILD) corespunzătoare modului Debug, lansarea în execuție
care va permite depanarea programului se poate face în mai multe moduri:
- (recomandat) click dreapta pe numele proiectului - Debug As - Local C/C++
Application
- apăsând F11
- selectând din bara de meniuri Run – Debug

3
- apăsând butonul
În cazul în care lansarea în modul Debug nu este posibilă și este semnalată o
eroare legată despre gdb.exe, se va executa instalarea acestuia conform pașilor din
secțiunea 1.x. Instalare Debugger Eclipse.
La prima rulare a proiectului în acest mod Eclipse va afișa o fereastră de dialog care
va cere programatorului să specifice în ce mod va rula procesul de depanare. Se
recomandă selecția opțiunii ”Local C/C++ Application”, așa cum este prezentat în fig.3.

Fig.3.

1.1.3. Lansarea programului în modul DEBUG


Dacă lansarea modului Debug este posibilă, interfața (Perspectiva) programului
Eclipse se modifică pentru a permite accesarea dinamică a datelor programului (fig.4.). În
figură se identifică următoarele zone:

4
1 – zona codului sursă unde va fi marcată instrucțiunea ce urmează a fi efectuată
2 – zona în care vor fi afișate valorile tuturor variabilelor programului.
3 – zona de control care permite executarea instrucțiunilor pas cu pas sau oprirea
modului Debug
4 – zona de butoane care pot fi folosite pentru schimbarea Perspectivei (modului de
afișare: inițial era C/C++)

Fig.4.

1.1.4. Parcurgerea programului în modul DEBUG


Din acest moment programatorul are acces la variabilele programului și poate
derula execuția instrucțiune cu instrucțiune. În cazul de față se poate observa că cele trei

5
variabile (variabila c de tip char, variabila i de tip int și variabila f de tip float) au deja
valori inițiale (c = 0, i = 2699264 și f = 0), chiar dacă programul este oprit înainte de a
executa instrucțiunea char c = ‘A’;. Trebuie specificat că în acest moment valorile afișate
pentru variabile sunt valorile existente în memorie chiar dacă liniile de alocare variabile
nu au fost executate, acest lucru fiind posibil în modul Debug.
Pentru a executa instrucțiunea curentă (de ex. instrucțiunea marcată în zona 1din
fig. 4), programatorul trebuie să efectueze una din următoarele operații:
- să selecteze din bara de meniuri ”Run” – opțiunea ”Step Over”, sau
- să apese tasta F6, sau

- să apese pe pictograma .
După executarea instrucțiunii curente (char c = ‘A’;) se poate observa modificarea
valorii variabilei c (zona 1 – fig.5) și marcarea următoarei instrucțiuni pentru execuție
(zona 2 – fig. 5). Pentru variabilele de tip char, Eclipse va afișa atât codul zecimal al
octetului cât și codul ASCII corespunzător.

Fig.5
Obs. Afișarea valorilor se face implicit în baza 10, dar prin click dreapta pe numele
variabilei din zona 1, se poate selecta ”Number Format” și apoi se poate opta pentru una
din bazele numerice relevante (Decimal, Octal, Hex, Binary).

6
În continuare se va selecta din nou ”Step Over” (F6) și se va observa modificarea
valorii variabilei i (zona 1 – fig.6) și marcarea următoarei instrucțiuni (zona 2 – fig.6).

Fig.6
Se execută și ultima instrucțiune, iar în Eclipse se poate observa modificarea
variabilei f (zona 1 – fig.7) și trecerea la ultima instrucțiune (zona 2 – fig.7).

Fig.7
Bonus. În zona 1 – fig.7 variabila f primește valoarea 1.34000003, chiar dacă în
sursă scrie f = 1.34. Puteți explica de ce se întâmplă acest lucru?
Prin alegerea operației ”Step Over” se va încheia programul curent dar Perspectiva
Eclipse va rămâne cea de Debug. Pentru a trece la Perspectiva C/C++ se va alege din bara

7
de meniuri Window – Perspective – Open Perspectice – C/C++ sau se va apăsa pe
pictograma C/C++ din zona 4 – fig.4.

În cazul în care la revenirea în Perspectiva C/C++ programul va afișa un fișier cu


eroare (ca în fig.8) se recomandă închiderea fișierului respectiv prin apăsarea pe iconița X
marcată în figura 8 sau prin apăsarea combinației de taste Ctrl+W după ce vă asigurați că
fișierul respectiv este activat.

Fig. 8
Obs. Închiderea fișierului ”_register….” se poate face și în perspectiva Debug,
urmând ca ulterior să se schimbe Perspectiva în C/C++.
Concluzie. Etapele prezentate sunt prezentate ca exemplu de utilizare a
Debugger-ului, ulterior acestea vor trebui adaptate programului care se va dori analizat.

1.x. Instalare Debugger Eclipse


Modul debug se bazează pe utilizarea unui alt utilitar decât cel pentru compilare.
Pentru compilarea codurilor sursă (.c) se utilizează aplicația/compilatorul gcc.exe, situat
în mod firesc în directorul: C:\TDM-GCC-64\bin. Pentru DEBUG se va utiliza
aplicația/utilitarul gdb.exe. Acesta se regăsește instalat în mod implicit odată cu
compilatorul în folderul de mai sus. În cazul în care gdb.exe nu a fost instalat odată cu
compilatorul (gcc) va trebui instalat ulterior.

8
Verificare instalare gdb
Pentru a verifica dacă gdb este instalat se poate căuta în directorul /bin al
TDM-GCC. Acolo, ar trebui să se regăsească fișierele gdb.exe, gdb64.exe,
gdbserver.exe și gprof.exe. În cazul în care gdb nu a fost instalat, acesta se instalează
urmând pașii de mai jos.

Instalare gdb
Se lansează arhiva executabilă utilizată pentru instalarea compilatorului
(tdm64-gcc-5.1.0-2 sau asemănător).
1. La fereastra TDM-GCC Setup se va deselecta "Check for updates ..." și se va
apăsa pe butonul Manage.

2. La pasul "Existing Installation … " se va da dublu click pe instalarea găsită deja,


astfel încât aceasta să fie adăugată în caseta "Installation Directory".

9
3. La pasul de selecție a componentelor … se va selecta componenta gdb, ca în figura
de mai jos:

4. Install.
5. Dacă tot nu funcționează debugger-ul, în Eclipse, în fereastra Window -
Preferences - C/C++ - Debug - GDB se adaugă la GDB debugger calea către
fișierul gdb.exe.

10
6. Apply and Close.

11
1.2. Tipuri de date predefinite
În Tabelul 1 sunt prezentate dimensiunile în octeți pentru diferitele tipuri de date
predefinite.
Tabelul 1

Nr. octeți Limita Limită


Tip variabilă C Utilizare
(bytes) inferioară superioară

char 1 -128 127 Caractere sau numere


unsigned char 1 0 255 Numere mici pozitive
short int 2 -32768 +32767 Numere întregi
unsigned short int 2 0 65536 Numere întregi pozitive
(long) int 4 -2^31 +2^31-1 Numere întregi mari
Numere întregi pozitive
unsigned (long) int 4 0 +2^32-1
mari
long long (int) 8 -2^64 +2^64-1 Numere întregi foarte mari
float 4 -3.2*10^38 3.2*10^38 Numere reale
double 8 -1.7*10^308 1.7*10^308 Numere reale mari
long double 16 Numere reale foarte mari
void 0 - - Nici un tip

Ex.1. Programul următor permite vizualizarea numărului de octeți ocupat de fiecare


tip de variabilă folosind mediul Eclipse. Se utilizează funcția sizeof(), funcție care va
returna numărul de octeți ocupat de variabila dată ca argument între paranteze.

12
int main(){
int signedChar;
int signedShortInt;
int signedInt;
int signedFloat;

signedChar = sizeof(char);
signedShortInt = sizeof(short int);
signedInt = sizeof(int);
signedFloat = sizeof(float);

return 0;
}

a. Creați un proiect C în Eclipse, adăugați codul sursă de mai sus, rulați programul în
modul Debug și vizualizați valorile pe care le vor primi cele patru variabile și verificați
corespondența cu Tabelul 1.
b. Completați programul pentru a afișa și dimensiunile (în octeți) pentru variabilele de tip:
unsigned char, unsigned short, long int, long long int, double și long double. Notați valorile pe
caietul de laborator.

Ex.2. Realizați programul care permite crearea variabilei float v și atribuiți acestei
variabile valoarea 2.30. Notați pe caietul de lucru valoarea atribuită. Rulați din nou
programul dar de această dată declarați încă o variabilă de tip double și atribuiți-i aceeași
valoare (2.3). Ce observați? Cum explicați?
float v = 2.3;
double dv = 2.3;

Ex.3. Constantele caracter, adică alfabetul limbajului C/C++ (cifre, litere, semne
speciale: ‘A’; ’c’; ’9’; ’>’ș.a.) se reprezintă prin codul ASCII. Declarația char
specifică faptul că o mărime/variabilă va reține numai un cod ASCII respectiv un
singur caracter.

13
char n= ’a’;
char c = ’Ax’;

Ce valori vor fi salvate în memorie pentru variabilele n și c?

2. Întrebări de autocontrol
1. Care este diferența dintre versiunile Release și Debug în IDE-ul Eclipse?
2. Care sunt pașii care trebuie urmați pentru a obține varianta Debug a unui
program și cum se lansează în execuție acest mod de rulare?
3. În ce bază numerică sunt afișate variabilele în modul Debug?
4. Cum putem afla numărul de octeți alocat unui anumit tip de variabilă?
5. Care este diferența dintre variabilele de tip char și unsigned char?
6. Care este diferența dintre variabilele de tip int și long int?
7. Este posibilă salvarea vârstei unei persoane (în ani) într-o variabilă de tip
char? Dar într-o variabilă de tip unsigned char?
8. Considerând variabila char c1, pentru a scrie în octetul corespunzător acestei
variabile numărul 67, una dintre posibilități ar fi: c1 = 67; Enumerați alte
două posibilități pentru a scrie aceeași valoare în octetul respectiv!

Pentru exercițiile de mai jos este indicată rezolvarea pe hârtie și verificarea rezultatului
prin rularea variantei Debug a programelor corespunzătoare.

3. Exerciții pentru fixarea cunoștințelor


1. Ce valoare va avea variabila a după executarea instrucțiunii char a = 200?
2. Ce valoare se va aloca variabile b după executarea instrucțiunii:
unsigned char b = 300;

14
3. Știind că valoarea maximă care poate fi memorată într-o variabilă de tip
unsigned short int este 216-1 (65535) ce valoare va avea variabila c după
executarea următoarelor linii de cod?
unsigned short int c = 33000;
c = c + c;
4. Ce valoare va avea variabila e după execuția următoarei linii de program?
unsigned char e = 7 / 2 - 5;

5. Ce valoare va avea variabila f după execuția următoarei linii de program?


char f = 25 / 2.0;

6. Ce valoare va avea variabila g după execuția următoarei linii de program?


int g = 25 / 2 - 30;

7. Ce valoare va avea variabila h după execuția următoarei linii de program?


float h = 25 / 2;

8. Ce valoare vor avea variabilele de mai jos după execuția următoarelor linii
de program?
int i1, i2, i3, i4, i5, i6;
i1 = 1 > 4;
i2 = 6 == 8;
i3 = i4 = 7;
i5 = i1 && i2;
i6 = i2 || i3;

9. Ce valoare vor avea variabilele de mai jos după execuția următoarelor linii
de program?
unsigned char u1, u2, u3, u4;
u1 = 1 << 4;
u2 = 6 | 8;
u3 = ~7;
u4 = u3 & (u2>>2);

15
4. Exerciții pentru aprofundarea cunoștințelor
1. Cum se modifică baza numerică utilizată pentru afișarea valorilor
variabilelor în modul Debug?
2. Ce valori vor avea variabilele a și b după execuția următoarelor linii de
program? Demonstrați prin rularea unui program asemănător în modul
Debug și justificați răspunsul!
int a;
int main(){
int b;
return 0;
}

3. Considerând a=23, b=89, c= 162 realizați următoarele operații la nivel de bit:


!a=, !b=, !c=,
a&b=, a|b=, b&c=, c|b=,
~a&~b=, ~(c|a)=,
~(a&c)=, (a|b)&(a&b)=
4. Ce valoare vor avea variabilele de mai jos după execuția următoarelor linii
de program?
char u1, u2, u3, u4;
u1 = 11 << 4;
u2 = 136 | 8;
u3 = ~7;
u4 = u3 & (u2>>2);

5. Considerând variabila unsigned char stareRelee având o valoare între 0 și


255, scrieți formula de calcul a variabilei unsigned char setareRelee
(funcție de stareRelee) astfel încât variabila setareRelee să conțină primii 4

16
biți ai lui stareRelee, restul de patru biți fiind 0! Același program (aceeași
formulă de calcul) trebuie să calculeze corect setareRelee pentru orice
valoare a lui stareRelee
Ex.
Dacă stareRelee = 10101010 -> setareRelee = 10100000
Dacă stareRelee = 11111111 -> setareRelee = 11110000
Dacă stare Relee = 00000000 -> setareRelee = 00000000

6. Considerând variabila unsigned char stareRelee având o valoare binară


XXXX XXXX, scrieți formula de calcul a variabilei unsigned char
setareRelee (funcție de stareRelee) astfel încât variabila setareRelee să
conțină: X1X1X1X1, unde X – starea inițială (0 sau 1) a bitului.
7. Considerând unsigned char stareRelee = XXXX XXXX, scrieți unsigned
char setareRelee = f(unsigned char stareRelee) (funcție de stareRelee)
astfel încât variabila setareRelee să conțină: X0X1X0X1, unde X – starea
inițială (0 sau 1) a bitului.
8. Considerând unsigned char stareRelee = XXXX XXXX, scrieți unsigned
char setareRelee = f(unsigned char stareRelee) (funcție de stareRelee)
astfel încât variabila setareRelee să conțină: 𝑋01𝑋1𝑋0𝑋, unde X – starea

inițială (0 sau 1) a bitului și 𝑋 – valoarea inversă a stării inițiale.


Ex.
Dacă stareRelee = 10101010, setareRelee = 10111100
Dacă stareRelee = 11110000, setareRelee = 10101100
Dacă stareRelee = 00001111, setareRelee = 00111001

17
18

S-ar putea să vă placă și