8.5. Câmp
Limbajul C permite utilizatorului definirea şi prelucrarea datelor pe biţi. Utilizarea datelor pe biţi este legată de folosirea indicatorilor care de obicei sunt date care iau numai două valori 0 sau 1.
Nu este justificat ca un astfel de indicator să fie păstrat ca un întreg pe 16 biţi şi nici măcar pe un octet. Indicatorul poate fi păstrat pe un singur bit. În acest scop, limbajul C oferă posibilitatea de a declara date care să se aloce pe biţi (unul sau mai mulţi biţi). Acest lucru îşi găseşte aplicare în programele de sistem. Astfel, de exemplu, atributele variabilelor dintr-o tabelă de simboluri pot fi păstrate pe biţi, ceea ce conduce la o economisire substanţială a memoriei ocupate de tabela respectivă.
Prin câmp înţelegem un şir de biţi adiacenţi conţinuţi într-un cuvânt calculator. Câmpurile se grupează formând o structură.
Un câmp se declară ca şi o componentă a unei structuri şi el are tipul unsigned (întreg fără semn). Totodată în declaraţia câmpului se indică şi dimensiunea lui în biţi.
În general, o structură cu componente câmpuri are forma:
struct
{ camp1;
. . .
campn;
} nume;
unde campi (i=1,...,n) are unul din formatele de mai jos:
unsigned nume : lungime_în_biţi
sau : lungime_în_biţi
Exemplu:
struct
{ unsigned a:1;
unsigned b:1;
unsigned c:2;
unsigned d:2;
unsigned e:3;
} indicatori;
Data indicatori se alocă într-un cuvânt calculator, adică pe 16 biţi. Componentele ei sunt:
-
a un bit;
-
b un bit;
-
c doi biţi;
-
d doi biţi;
-
e trei biţi.
La câmpuri ne putem referi la fel ca şi la componentele oricărei structuri. Deci la indicatorii de mai sus ne putem referi prin următoarele construcţii:
-
indicatori.a
-
indicatori.b
-
indicatori.c
-
indicatori.d
-
indicatori.e
Alocarea biţilor este dependentă de calculator. De obicei biţii se alocă de la dreapta spre stânga ca în figura de mai jos:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
a
b
c
d
e
Observaţii:
1o. Dacă un câmp nu poate fi alocat în limitele unui cuvânt, el se alocă în întregime în cuvântul următor.
2o. Nici un câmp nu poate avea o dimensiune mai mare decât 16 biţi.
3o. Formatul fără nume (al doilea format) pentru câmp se foloseşte pentru cadraje. Acest lucru este util atunci când sunt zone de biţi neutilizate în cadrul unui cuvânt. De asemenea, utilizarea formatului cu lungime egală cu zero permite ca alocarea câmpurilor următoare lui să se facă în cuvântul următor.
4o. O structură care are şi componente câmpuri poate avea şi componente obişnuite.
5o. Nu se pot defini tablouri de câmpuri.
6o. Unui câmp nu i se poate aplica operatorul adresă.
Câmpurile se utilizează frecvent la scrierea unor programe de sistem, cum ar fi : drivere pentru periferice, compilatoare, etc.
Utilizarea câmpurilor poate conduce la programe cu o portabilitate redusă. Totodată, accesul la date pe biţi conduce la creşterea numărului de operaţii, fiind necesare deplasări şi operaţii pe biţi suplimentare, fapt ce poate conduce atât la creşterea timpului de execuţie a programelor, cât şi la creşterea memoriei utilizate. Ori datele pe biţi se folosesc chiar în ideea de a economisi memorie.
8.6. Tipul enumerat
Tipul enumerat permite utilizatorului să folosească în program nume sugestive în locul unor valori numerice. De exemplu, în locul numărului unei luni calendaristice, se poate folosi denumirea ei:
1 ian
2 feb
-
mar
În locul valorilor 0 şi 1 se pot folosi cuvintele FALS şi ADEVĂRAT.
Prin aceasta, se introduce o mai mare claritate în programe, deoarece valorile numerice sunt înlocuite prin diferite sensuri atribuite lor.
Un tip enumerat se introduce printr-o declaraţie de forma:
enum nume {nume0, nume1, . . . , numen};
Prin această declaraţie se defineşte tipul enumerat nume, iar numei are valoarea i. O formă mai generală a declaraţiei de mai sus permite programatorului să forţeze valorile numelor din acoladă. În acest scop, se pot folosi construcţii de forma:
numei= eci
unde eci este o expresie constantă de tip int.
Cu alte cuvinte, unui nume i se poate atribui o valoare sau valoarea lui coincide cu a numelui precedent mărită cu 1. Dacă primului nume din acoladă nu i se atribuie o valoare, el are valoarea 0. Numele nume0, nume1,. . . , numen trebuie să fie nume diferite. Ele sunt constante şi valoarea lor se stabileşte prin declaraţia în care au fost scrise. Domeniul lor de valabilitate este definit de domeniul de valabilitate al declaraţiei prin care se definesc:
-
instrucţiunea compusă care conţine declaraţia;
-
fişierul sursă în care este scrisă declaraţia, dacă este externă oricărei funcţii.
Valorile atribuite lui nume0, nume1, . . . , numen sunt de obicei diferite, dar unele pot să şi coincidă.
După ce s-a introdus un tip enumerat, se pot declara date de tipul respectiv printr-o declaraţie de forma:
enum nume lista_de_variabile;
Datele de tip enumerat se consideră de tip int şi se pot utiliza în program oriunde este legal să apară o dată de tip int.
Observaţii:
1o. Se pot utiliza, ca şi în cazul structurilor, construcţii de forma:
enum nume {nume0, nume1,. . . , numen} lista_de_variabile;
sau
enum { nume0, nume1,. . . , numen} lista_de_variabile;
2o. De asemenea, se poate utiliza construcţia typedef pentru a atribui un nume unui tip enumerat:
typedef enum nume {nume0, nume1,. . . , numen} NUME;
În continuare se pot declara date de tipul NUME, astfel:
NUME lista_de_variabile;
Exemple:
-
enum luna{ian=1,feb,mar,apr,mai,iun,iul,aug,sep,oct,nov,dec};
enum luna luna_calendaristica
Prin prima declaraţie se introduce tipul enumerat luna. Mulţimea de valori asociate acestui tip este formată din numerele întregi 1,2, . . . , 12. Se pot utiliza denumirile:
ian ia valoarea 1
feb ia valoarea 2
. . .
dec ia valoarea 12
A doua construcţie declară data luna_calendaristica de tipul luna. Ei i se pot atribui valori prin expresii de atribuire de forma:
luna_calendaristica = mar sau
luna_calendaristica = mai + 4
-
typedef enum {luni, marti,miercuri,joi,vineri,sambata,duminica} ZI;
ZI z;
Variabila z este de tip ZI. Se poate utiliza în expresii de forma:
z=marti;
if(zelse // trateaza zi de odihna
Dostları ilə paylaş: |