Capitolul 6.7. Campuri

Vezi subiectul anterior Vezi subiectul urmator In jos

Capitolul 6.7. Campuri

Mesaj  zooky la data de Mier Mar 18, 2009 1:55 pm

Atunci cind spatiul de memorare estre la mare pret, poate fi necesar ca mai multe obiecte sa fie impachetate intr-un singur cuvint masina; un caz adesea folosit este compactarea fanioanelor de un singur bit necesare in aplicatii catabelele de simboluri ale compilatoarelor. Formatele externe impuse de interfetele cu diversele echipamente externe, adesea impun compactrea datelor pe un cuvint.

Sa ne imaginam un fragment dintr-un compilator care manipuleaza o tabela de simboluri. Fiecare identificator dintr-un program are anumite informatii asociate, de exemplu, este sau nu un cuvint cheie, e este sau nu extern si/sau static, s. a. m. d. Cel mai compact mod de a coda astfel de informatii este un set de fanioane de un bit cuprinse intr-un "char" sau "int".

Modul cel mai uzual este de a defini un set de masti corespunzatoare pozitiilor cu biti semnificativi, ca in

#define KEYWORD 01
#define EXTERNAL 02
#define STATIC 04

(Numele trebuie sa fie puteri ale lui doi.) Apoi accesul la biti devine un soi de "bitareala" cu operatori de permutare, mascare si complementare, care au foat descrisi in capitolul 2.

Anumite idioame apar frecvent:

flags != EXTERNAL ! STATIC;

valideaza bitii EXTERNAL si STATIC ca fanioane, in timp ce

flags &= (EXTERNAL ! STATIC);

ii invalideaza.

Desi aceste idioame sint cu usurinta manevrate, limbajul C, mai degraba ofera capacitatea preferabila de adefini si accesa cimpuri Un cimp este un set de biti adiacenti cuprinsi intr-un singur "int". Sintaxa de definire si accesul cimpurilor este bazata pe structuri. De exemplu tabela de simboluri definita mai sus ar putea fi inlocuita printr-o definire a trei cimpuri.

struct {
unsigned is_keyword: 1;
unsigned is_extern: 1;
unsigned is_static: 1;
}flags;

Este astfel definita o variabila numita "flags" care contine trei cimpuri de cite un bit. Numarul de dupa ":" reprezinta lungimea cimpului in biti. Cimpurile sint declarate fara semn (unsigned) tocmai pentru a accentua ca sint cantitati fara semn.

Cimpurile individuale sint referite ca "flags.is_keyword", "flags.is_extern", etc, la fel ca oricare alti me, bri ai structurii. Cimpurile se comporta ca niste mici intregi fara semn si pot participa in expresii aritmetice la fel ca oricare alti intregi. Exemplele de mai sus pot fi rescrise mai natural astfel

flags.is_extern = flags.is_static = 1;

pozitioneaza bitii pe unu;

flags.is_extern = flags.is_static = 0;

pozitioneaza bitii pe zero;

if (flags.is_extern == 0 && flags.is_static == 0) ...

pentru a-i testa.

Un cimp poate sa nu corespunda cu limitelke unui "int"; in acest caz cimpul este alinial la urmatoarea margine 'int". Cimpurile nu trebuie sa aibe un nume; cimpurile fara nume(doua puncte si lungimea numai) sint folosite ca umplutura. Lungimea speciala 0 poate fi folosita pentru alinierea la urmatoarea "int" margine.

Exista un numar de reguli de aplicat cimpurilor. Dintre cele mai importante, cipurile sint asignate de la stinga la dreapta in unele masini si de la dreapta la stinga in altele ceea ce reflecta natura diferita a hardwareului inseamna ca, desi cipurile sint utilizabile de preferinta pentru a intretine structurile de adte interne, chestiunea carui sfirsit vine primul trebuie considerata cu grija pentru prelucrarea datelor definite extern.

Alte restrictii care trebuie avute in minte: cimpurile sint fara semn ele pot fi memorate numai in "int"(sau echivalentul "unsigned"); ele nu sint tablouri; ele nu au adrese, astfel ca operatorul "&" nu le poate fi aplicat.
avatar
zooky
Moderator
Moderator

Numarul mesajelor : 147
Data de inscriere : 15/03/2009
Varsta : 24
Localizare : Cernatesti City

Vezi profilul utilizatorului http://e-learning.forumhit.ro

Sus In jos

Vezi subiectul anterior Vezi subiectul urmator Sus


 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum