Capitolul 6.8. Uniuni

Vezi subiectul anterior Vezi subiectul urmator In jos

Capitolul 6.8. Uniuni

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

O uniune este o varaibila care poate pastra (la momente diferite) obiecte de diferite tipuri si dimensiuni, iar compilatorul tine seama de cerintele de dimensiune si aliniament. Uniunile permit sa se manipuleze diferite feluri de date intr-o singura zona de memorie, fara sa se includa in program nici un fel de informatii dependente de masina.

Ca de exemplu, sa consideram din nou o tabela de simboluri a unui compilator. Sa presupunem ca constantekle pot fi "int", "float" sau pointeri de caractere. Valoarea unei constante particulare trebuie memorata intr-o variabila de tipul corespunzator, dar este cel mai convenabil pentru organizarea tabelei daca valoarea ocupa aceasi dimensiune de memorie si acelasi loc in memorie in functie de tipul ei. Aceasta este scopul unei uniuni -sa permita ca o singura variabila care poate sa contina oricare din mai multe tipuri. La fel ca la cimpuri, sintaxa se bazeaza pe structuri.

union u-tag{
int ival;
float fval;
char *pval;
} uval;

O variabila "uval" va fi suficient de mare ca sa pastreze oricare din cele trei tipuri, iar privitor la masina, codul generat de compilator este indiferent de caracteristicile hard. Oricare din aceste tipuri poate fi asignat la "uval" si apoi utilizat in expresii, atita vreme cit uzajul este considerat, adica tipul utilizat trebuie sa fie cel mai recent memorat. Este responsabilitatea programatorului sa tina seama de tipul de data curent memorat intr-o uniune; rezultatele sint dependente de masina daca ceva este memorat ca un tip si este extras ca altul.

Sintactic, membri unei uniuni sint accesati ca

union-name.member

sau

union-pointer->member

la fel cu structurile. Daca variabila "utype" este folosita pentru a tine seama de tipul curent al marimii memorate in "uval", poate scrie un cod, astfel:

if (utype == INT)
printf("%d\n", uval.ival);
else if (utype == FLOAT)
printf("%f\n", uval.fval);
else if (utype == STRING)
printf("%s\n", uval.pval);
else
printf("bad type %d in utype\n", utype);

Uniunile pot sa se gaseasca in structuri si tablouri si viceversa. Notatia pentru a accesa un membru a unei uniuni dintr-o structura(sau viceversa) este identica cu aceea pentru structurile in cuiburi. De exemplu in structura definita prin

struct {
char *name;
int flags;
int utype;
union {
int ival;
float fval;
char *pval;
} uval;
} symtab[NSYM];

variabila "ival" este referita astfel

symtab[i].uval.ival

iar primul caracter al sirului "pval" prin

*symtab[i].uval.pval

In fond, o uniune este o structura in care toti membri au deplasamentul zero, structura este suficient de mare ca sa cuprinda cel mai mare membru, iar aliniamentul este potrivit pentru toate tipurile din uniune Ca si la structuri singurele operatii admise cu uniunile sint de a accesa un membru si obtinerea adresei lui;uniunile nu pot fi asignate, nu se pot aplica functii asupra lor, Pointeri la uniuni pot fi utilizati de o maniera identica pinterilor la structuri.

In capitolul 8 se arata cum alocatorul de memorie prin intermediul unei uniuni de memorie prin intermediul unei uniuni forteaza o variabila sa se alinieze la orice fel de particularitati de memorare.
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