Sunteți pe pagina 1din 32

Limbaje de Programare

Limbaje de
Programare
Curs 9 - Tipuri de
Date Proprii

Dan Novischi

Review

Denumirea
Simbolica a
Tipurilor Limbaje de Programare
Structuri
Definire
Curs 9 - Tipuri de Date Proprii
Utilizare
Anonimat
typedef struct
Array de Structuri
Dan Novischi
Pointeri si Alocare
struct vs. Functii

Uniuni
Definire
Utilizare
18 Apr
Anomimat si typedef
Array, Pointeri si
Alocare
union vs. Functii

Campuri de Biti
Definire
Utilizare
union struct and
bit field
Sumar

Limbaje de
Programare 1 Review
Curs 9 - Tipuri de
Date Proprii 2 Denumirea Simbolica a Tipurilor
Dan Novischi
3 Structuri
Review Definire
Denumirea Utilizare
Simbolica a
Tipurilor
Anonimat
typedef struct
Structuri
Definire
Array de Structuri
Utilizare Pointeri si Alocare
Anonimat struct vs. Functii
typedef struct
Array de Structuri 4 Uniuni
Pointeri si Alocare
Definire
struct vs. Functii
Utilizare
Uniuni
Anomimat si typedef
Definire
Utilizare
Array, Pointeri si Alocare
Anomimat si typedef union vs. Functii
Array, Pointeri si
Alocare 5 Campuri de Biti
union vs. Functii
Definire
Campuri de Biti
Utilizare
Definire
Utilizare
union struct and
union struct and bit field
bit field
Review

Limbaje de
Programare
Memoria unui program este impartita in mai multe zone. Fiecare zona
Curs 9 - Tipuri de este dedicata memorarii unei anumite categorii de date sau instructiuni.
Date Proprii
Memoria dinamica se numeste HEAP si este gestionata prin intermediul a
Dan Novischi
patru functii: malloc(...), calloc(...), realloc(...) si free(...).
Review malloc(...) si calloc(...) rezerva o zona de memorie specificata in
Denumirea numar de octeti.
Simbolica a
Tipurilor
realloc(...) se utilizeaza pentru redimensionarea unei zone de
memorie anterior alocate.
Structuri
Definire free(...) elibereaza memoria alocata anterior prin una dintre cele trei
Utilizare functii de alocare.
Anonimat
typedef struct
O zona de memorie alocata din HEAP trebuie intotdeauna eliberata in
Array de Structuri momentul in care nu mai este utilizata. Altfel, in cel mai bun caz, se
Pointeri si Alocare produce fenomenul de Memory Leak.
struct vs. Functii
Retunarea unui pointer dintr-o functie se realizeaza prin asocierea unei
Uniuni
zone de memorie din HEAP in cadrul functiei in cauza.
Definire
Utilizare Alocarea array-urilor multi-dimensionale se realizeaza in mod similar celor
Anomimat si typedef uni-dimensionale, dar prin multipla indirectare.
Array, Pointeri si
Alocare Folosirea memoriei dinamice in cadrul functiilor simplifica lucrul cu
union vs. Functii parametrii sau retunarea datelor care reprezinta array-uri
Campuri de Biti multi-dimesionale.
Definire
Folosind memoria dinamica, orice array multi-dimesional poate fi redus la
Utilizare
union struct and
unul uni-dimesional tinand cont de felul in care sunt stocate datele in
bit field
memorie si aritmetica pointerilor.
Denumirea Simbolica a Tipurilor

Limbaje de
Programare
Curs 9 - Tipuri de
Limbajul C ofera facilitatea de a redenumi (sau a da un nume nou)
Date Proprii oricarui tip de date existent prin intermediul cuvantului cheie typedef.
Dan Novischi Sintaxa gerinica pentru folosirea acestui cuvant este urmatoarea:
Review

Denumirea
typedef nume_tip_existent nume_nou_tip;
Simbolica a
Tipurilor Spre exemplu:
Structuri
Definire
Utilizare
typedef int intreg; // re-denumire int
Anonimat typedef float real; // re-denumire float
typedef struct
Array de Structuri Astfel, dupa re-denumirarea unui anumit tip, noul nume poate fi utilizat
Pointeri si Alocare
in acelasi mod ca vechiul nume de tip. Pentru exemplu de mai sus putem
struct vs. Functii
declara:
Uniuni
Definire
Utilizare intreg a, *b, **c; // variabila, simplu si dublu pointer
Anomimat si typedef real x, *y, **z; // variabila, simplu si dublu pointer
Array, Pointeri si
Alocare
union vs. Functii
Pentru a putea utiliza re-denumirea unui anumit tip, definitia trebuie
Campuri de Biti
Definire
pozitionata intodeauna inaintea utilizarii acestuia. Astfel, o practica buna
Utilizare este pozitionarea tuturor re-denumirilor inafara oricarei functii, imediat
union struct and dupa directivele de preprocesare precum #include si #define.
bit field
Denumirea Simbolica a Tipurilor

Limbaje de
Programare
Curs 9 - Tipuri de
Date Proprii
Re-denumirele folosind typedef suporta de asemenea si orice specificator
de semn sau clasa de memorare.
Dan Novischi
Spre exemplu, putem specifica tipul de date BYTE ca avand urmatoarea
Review
definitie:
Denumirea
Simbolica a typedef unsigned char BYTE;
Tipurilor

Structuri Astfel, putem scrie un program care afisiaza suma a doua variabile de tip
Definire byte in felul urmator:
Utilizare
Anonimat #include <stdio.h>
typedef struct
Array de Structuri
typedef unsigned char BYTE;
Pointeri si Alocare int main(void){
struct vs. Functii BYTE a = 3, b = 5;
Uniuni printf("a + b = %u", a + b);
Definire return 0;
Utilizare
}
Anomimat si typedef
Array, Pointeri si
Alocare Un alt exemplu, este definitia tipului de date size_t din biblioteca
union vs. Functii
stdlib.h care are urmatoarea forma:
Campuri de Biti
Definire typedef unsigned int size_t;
Utilizare
union struct and
bit field
Definirea Structurilor

Limbaje de
Programare In programele de pana acum am declarat o serie de variabile de diverse
Curs 9 - Tipuri de
Date Proprii tipuri, inclusiv array-uri sau pointeri, pe care le numeam tipuri de baza.
Dan Novischi Exista insa o serie de aplicatii unde tipurile de baza nu sunt suficiente. O
astfel de aplicatie poate fi una care implementeaza un sistem de
Review
organizare al resurselor din cadrul unei facultati, precum: stundeti,
Denumirea
Simbolica a
profesori, cursuri, sali de curs/laborator/seminar, orare, diverse cataloage,
Tipurilor s.a.m.d.
Structuri Spre exemplu, doar pentru a descrie un stundent avem nevoie de mai
Definire
multe date precum: nume, prenume, CNP, ID, data inmatricularii, GPA,
Utilizare
Anonimat
foaia matricola, s.a.m.d.
typedef struct
Astfel, avem nevoie de o facilitate prin care sa organizam o inregistrare
Array de Structuri
Pointeri si Alocare
(record) in mod explicit. In aplicatia de mai sus avem nevoie sa definim
struct vs. Functii cea ce inseamna Stundent, Profesor, Orar, s.a.m.d.
Uniuni Aceasta facilitate este suportata prin intermediul structurilor folosind
Definire
Utilizare
cuvantul cheie struct, iar forma generala pentru definitia acesteia este:
Anomimat si typedef
struct nume_structura{
Array, Pointeri si
Alocare tip nume_camp1;
union vs. Functii tip nume_camp2;
Campuri de Biti ...
Definire
tip nume_campN;
Utilizare
union struct and
};
bit field
Definirea Structurilor

Limbaje de
Programare
Curs 9 - Tipuri de
Date Proprii In definitia de mai sus struct specifica faptul ca este vorba de o
Dan Novischi structura, nume_structura reprezinta numele dat de catre utilizator
acesteia si campurile care fac parte din acestea sunt scrise intre acolade
Review
urmate de ;.
Denumirea
Simbolica a Observati ca fiecare camp al structurii seamna cu o declaratie de
Tipurilor
variabila, unde fiecare are un tip de date si nume; iar structura in sine
Structuri
poate contine oricate campuri.
Definire
Utilizare Astfel pentru definirea unui student pentru aplicatia mentionata am
Anonimat
putea scrie:
typedef struct
Array de Structuri
struct Student{
Pointeri si Alocare
struct vs. Functii
char* nume;
char* prenume;
Uniuni
Definire
char cnp[14];
Utilizare long id;
Anomimat si typedef float gpa;
Array, Pointeri si
Alocare };
union vs. Functii
unde se poate observa ca structura este compusa din mai multe campuri
Campuri de Biti
Definire
de mai multe tipuri.
Utilizare
union struct and
bit field
Utilizare Structuri

Limbaje de
Programare
Curs 9 - Tipuri de
Utilizarea unei variabile de tip structura, dupa definitia in prealabila,
Date Proprii presupune declaratia acesteia. Astfel avem urmatoarea forma generala:
Dan Novischi

Review
struct nume_structura nume_variabila;
Denumirea
Simbolica a
Tipurilor
Spre exemplu, declaratia unei variabile de tipul structurii Student definita
anterior se poate scrie:
Structuri
Definire
Utilizare
struct Student s;
Anonimat
typedef struct unde s este o variabila de tipul struct Student.
Array de Structuri
Pointeri si Alocare
Variablile de tip structura pot fi declarate si in momentul definitei
struct vs. Functii structuri. Forma generala a acestei declaratii este:
Uniuni
struct Student{
Definire
Utilizare
char* nume;
Anomimat si typedef char* prenume;
Array, Pointeri si
Alocare
char cnp[14];
union vs. Functii long id;
Campuri de Biti
float gpa;
Definire }s1, s2;
Utilizare
union struct and unde s1 si s2 sunt doua variabile de tipul structurii struct Student.
bit field
Utilizare Structuri

Limbaje de
Programare Deoarece definitiile structurilor se scriu deobicei inafara oricarei functii
Curs 9 - Tipuri de (dupa directivele de pre-compilare), aceasta modalitate de a declara
Date Proprii
variabile este folosita numai in anumite cazuri cum ar fi: variabile statice.
Dan Novischi
Altfel, variabile declarate odata cu definitia vor fi globale relativ la tot
Review programul.
Denumirea Accesul la campurile unei variabile de tip structura se realizeaza folosind
Simbolica a
Tipurilor
urmatoarea sintaxa:
Structuri
Definire
nume_structura.nume_camp;
Utilizare
Anonimat
typedef struct Spre exemplu, pentru a aloca o zona de memorie campului prenume de 30
Array de Structuri de octeti pentru variabila s putem scrie:
Pointeri si Alocare
struct vs. Functii
s.prenume = (char*) malloc(30);
Uniuni
Definire Similar array-urilor, structurile pot fi initializate la declaratie folosind o
Utilizare
Anomimat si typedef
lista de initializare.
Array, Pointeri si Lista de intializare pentru o structura trebuie sa contina constante
Alocare
union vs. Functii
aferente fiecarui camp in ordinea in care apar in definitia structurii. Spre
Campuri de Biti
exemplu, s poate fi initializat la declaratie astfel:
Definire
Utilizare
struct Student s =
union struct and {"Popa", "Ion", "2170101123456", 1123, 10.0};
bit field
Utilizare Structuri

Limbaje de
Programare
Realizati un program care citeste (de la tastatura) si afiseaza o structura
Curs 9 - Tipuri de Student:
Date Proprii

Dan Novischi #include <stdio.h>


#include <stdlib.h>
Review #include <string.h>
Denumirea
Simbolica a
Tipurilor /* Definitie structura */
Structuri
struct Student{
Definire char* nume;
Utilizare char* prenume;
Anonimat
char cnp[14];
typedef struct
Array de Structuri
long id;
Pointeri si Alocare float gpa;
struct vs. Functii }
Uniuni
Definire
int main(void){
Utilizare
Anomimat si typedef
char buf[30]; // Buffer pentru citire
Array, Pointeri si struct Student s; // Declaratie variabila Student
Alocare
union vs. Functii
/* Citire nume */
Campuri de Biti
Definire
printf("Nume: "); scanf("%29s", buf);
Utilizare s.nume = (char*) malloc(strlen(buf)+1);
union struct and strcpy(s.nume, buf);
bit field
Utilizare Structuri

Limbaje de
Programare
Curs 9 - Tipuri de
Date Proprii
/* Citire prenume */
Dan Novischi
printf("Prenume: "); scanf("%29s", buf);
s.prenume = (char*) malloc(strlen(buf)+1);
Review strcpy(s.prenume, buf);
Denumirea
Simbolica a /* Citire CNP */
Tipurilor
printf("CNP: "); scanf("%13s", buf);
Structuri
Definire
strcpy(s.cnp, buf);
Utilizare
Anonimat /* Citire ID */
typedef struct
printf("ID: "); scanf("%l", &s.id);
Array de Structuri
Pointeri si Alocare
struct vs. Functii /* Citire GPA */
Uniuni printf("GPA: "); scanf("%f", &s.gpa);
Definire
Utilizare
/* Afisari */
Anomimat si typedef
Array, Pointeri si
printf("\nNume: %s", s.nume);
Alocare printf("\nPrenume: %s", s.prenume);
union vs. Functii
printf("\nCNP: %s", s.cnp);
Campuri de Biti
printf("\nID: %l", s.id);
Definire
Utilizare
printf("\nGPA: %f", s.gpa);
union struct and
bit field
Utilizare Structuri

Limbaje de
Programare
Curs 9 - Tipuri de /* Dealocari */
Date Proprii free(s.nume);
Dan Novischi free(s.prenume);
return 0;
Review
}
Denumirea
Simbolica a
Tipurilor
In programul de mai sus:
Structuri
Definire
Pentru citirea sirurilor de caractere a fost utilizata o variabila auxiliara
Utilizare buf (buffer).
Anonimat
typedef struct
Campurile nume si prenume sunt pointeri in cadrul definitiei structuri.
Array de Structuri Prin urmare, fiecarui pointer i s-a atribuit o zona de memorie dinamica
Pointeri si Alocare prin intermediul functiei malloc(...)
struct vs. Functii

Uniuni
Campul CNP este declarat ca fiind un array de caractere. Deci, acesta
Definire
corespunde unei zone de memorie si nu trebuie alocat.
Utilizare
Campurile id sigpa reprezinta variabile in cadrul structurii. Astfel, pentru
Anomimat si typedef
Array, Pointeri si
citirea acestora de la tastura s-a aplicat operatorul de adresare asupra
Alocare
campurilor prin s.id si respectiv s.gpa.
union vs. Functii

Campuri de Biti
Deoarece programul a alocat zone de memorie dinamica capurilor nume si
Definire prenume, acestea au fost de-alocate utlerior folosind functia free(...).
Utilizare
union struct and
bit field
Structuri Anonime

Limbaje de
Programare
Curs 9 - Tipuri de
Date Proprii

Dan Novischi Limbajul C ofera posibilitatea de a declara structuri anonime (fara nume)
prin furnizarea unor nume de variabile la declaratie.
Review
Spre exemplu, putem scrie:
Denumirea
Simbolica a
Tipurilor struct{
Structuri
char* nume;
Definire char* prenume;
Utilizare char cnp[14];
Anonimat
long id;
typedef struct
Array de Structuri
float gpa;
Pointeri si Alocare }s1, s2;
struct vs. Functii
unde similar ca inainte s1 si s2 sunt doua variabile de tip structura, dar
Uniuni
Definire
structura in sine NU are un nume.
Utilizare
Folosind structuri anonime, ulterior nu se mai pot declara alte variabile
Anomimat si typedef
Array, Pointeri si
deoarece nu avem posibilitatea de a ne referi la aceste structuri.
Alocare
union vs. Functii
Astfel, odata cu definirea unei structuri anonime trebuie (obligatoriu)
Campuri de Biti
furnizate numele de variabile.
Definire
Utilizare
union struct and
bit field
typedef struct

Limbaje de
Programare
Curs 9 - Tipuri de Anterior, am vazut ca prin intermediul typedef putem redenumi tipuri de
Date Proprii date.
Dan Novischi
In acest context, definitia unei structuri reprezinta un tip de date pe care
Review il putem redenumi utilizand urmatoarea forma generala:
Denumirea
Simbolica a typedef struct nume_structura{
Tipurilor tip camp1;
Structuri ...
Definire tip campN;
Utilizare
Anonimat
}nume_tip_date;
typedef struct
Array de Structuri unde nume_tip_date reprezinta noul nume al structurii (NU o variabila)
Pointeri si Alocare datorita precedarii definitiei cu typedef.
struct vs. Functii
Spre exemplu, putem redunumi structura struct Student la numele de
Uniuni
Definire
tip Student astfel:
Utilizare typedef struct Student{
Anomimat si typedef
char* nume;
Array, Pointeri si
Alocare char* prenume;
union vs. Functii
char cnp[14];
Campuri de Biti long id;
Definire
float gpa;
Utilizare
union struct and
} Student;
bit field
typedef struct

Limbaje de
Programare
Curs 9 - Tipuri de Astfel, declaratia ulterioara de variabile devine mai usoara. Spre exemplu,
Date Proprii pentru a declara variabile de tip struct Student acum putem scrie
Dan Novischi simplu:
Review
Student s; // in loc de struct Student s;
Denumirea
Simbolica a
Tipurilor Evident, putem folosi typedef impreuna cu forma anonima de definitie a
Structuri structurii pentru a creea acelasi tip de date:
Definire
Utilizare
typedef struct{
Anonimat char* nume;
typedef struct char* prenume;
Array de Structuri
Pointeri si Alocare
char cnp[14];
struct vs. Functii long id;
Uniuni
float gpa;
Definire } Student;
Utilizare
Anomimat si typedef unde Student reprezinta noul nume de tip ca si in cazul anterior.
Array, Pointeri si
Alocare Folosirea lui typedef cu structuri anoime face posibila declaratia
union vs. Functii ulterioara de variabile, dat fiind faptul ca prin re-denumirea structurii ne
Campuri de Biti putem referi la aceasta.
Definire
Utilizare
union struct and
bit field
Array de Structuri

Limbaje de
Programare
Curs 9 - Tipuri de
Date Proprii Array-urile de structuri pot fi declarate similar celor obisnuite. Spre
Dan Novischi exemplu, pentru un array de stundenti putem scrie:
Review struct Student s[180];
Denumirea // sau
Simbolica a
Tipurilor Student s[180];
Structuri
Definire
Accesul la elementele din array se poate realiza identic ca la variabile
Utilizare obisnuite, dar fiecare element in acest caz reprezinta o structura pentru
Anonimat care trebuie mai departe sa accesam un camp.
typedef struct
Array de Structuri Spre exemplu pentru a accesa campul gpa pentru elementul de la indexul
Pointeri si Alocare 30 din array-ul declarat mai sus putem scrie:
struct vs. Functii

Uniuni
s[30].gpa = 10.0;
Definire
Utilizare
Anomimat si typedef
Array, Pointeri si
Putem, de asemenea folosi numele array-ului ca un pointer. Astfel,
Alocare accesul la campul gpa pentru elementul de la indexul 30 arata astfel:
union vs. Functii

Campuri de Biti
Definire
(*(s+30)).gpa = 10.0;
Utilizare
union struct and
bit field
Pointeri si Alocare

Limbaje de
Programare
Curs 9 - Tipuri de Dupa cum se poate observa in exemplul anterior, accesul prin intermediul
Date Proprii pointerilor la campurile individuale ale unei structuri se realizeaza in doi
Dan Novischi pasi:
se dereferentiaza pointerul la structura in cauza
Review iar apoi utilizeaza accesul in cadrul structurii pentru a obtine campul
Denumirea
Simbolica a Spre exemplu, accesul la campul gpa pentru primul element din array se
Tipurilor scrie:
Structuri
Definire
(*s).gpa = 10.0;
Utilizare
Anonimat Acesta sintaxa devine anevoiasa in cele mai multe din cazuri. Astfel,
typedef struct
pentru accesul la un anumit camp dintr-o structura, limbajul C ne pune la
Array de Structuri
Pointeri si Alocare
dispozitie urmatoarea sintaxa alternativa:
struct vs. Functii s->gpa = 10.0;
Uniuni
Definire
unde s->gpa are semnificatia indentica cu (*s).gpa.
Utilizare
In general o variabila de tip structura ocupa unul sau mai multi octeti
Anomimat si typedef
Array, Pointeri si
(memorati la adrese succesive) in functie de tipul si numarul campurilor
Alocare declarate in definitia structurii in cauza.
union vs. Functii

Campuri de Biti
Cea ce inseamna ca numarul de octeti pe care o structura ii ocupa in
Definire memorie este variabil in functie de definitia acesteia si NU este cunoscut
Utilizare de la bun inceput.
union struct and
bit field
Pointeri si Alocare

Limbaje de
Programare
Curs 9 - Tipuri de
Date Proprii Astfel, pentru a obtine numarul de octeti pe care o anumita structura o
Dan Novischi ocupa in memorie se va utiliza operatorul sizeof(...). Spre exemplu,
pentru a obtine numarul de octeti pe care ii ocupa stuctura Student vom
Review scrie:
Denumirea
Simbolica a
sizeof(struct Student);
Tipurilor
sau similar, daca am folosit typedef in definitie:
Structuri
Definire
sizeof(Student);
Utilizare
Anonimat Prin urmare, daca dorim sa alocam o singura structura Student vom
typedef struct
scrie:
Array de Structuri
Pointeri si Alocare
struct vs. Functii struct Student *s =
Uniuni
(struct Student*) malloc(sizeof(struct Student));
Definire
Utilizare sau similar:
Anomimat si typedef
Array, Pointeri si
Alocare Student *s = (Student*) malloc(sizeof(Student));
union vs. Functii

Campuri de Biti unde pointerului *s i s-a atribuit o zona de memorie din HEAP de
Definire
dimensiunea structuri struct Student.
Utilizare
union struct and
bit field
Pointeri si Alocare

Limbaje de
Programare
Curs 9 - Tipuri de Evident, putem aloca un array de 180 de structuri prin:
Date Proprii
Student *s = (Student*) malloc(180 * sizeof(Student));
Dan Novischi

Review
In mod similar putem de-aloca (elibera) zona de memorie anterior alocata:
Denumirea
free(s);
Simbolica a
Tipurilor Astfel, TOATE notiunile de la array-uri, pointeri si alocare dinamica
Structuri pentru tipurile de baza sunt valabile si in cazul structurilor; singurele
Definire
diferente fiind la declaratia unei variabile (prin utilizarea lui struct) si
Utilizare
Anonimat
accesul la campurile individuale din cadrul acestora.
typedef struct
Array de Structuri
Pointeri si Alocare
struct vs. Functii

Uniuni
Definire
Utilizare
Anomimat si typedef
Array, Pointeri si
Alocare
union vs. Functii

Campuri de Biti
Definire
Utilizare
union struct and
bit field
Parametrii si Return Functii

Limbaje de
Programare Si in cadrul functiilor structurile pastreaza semnificatii identice cu cele ale
Curs 9 - Tipuri de
Date Proprii tipurilor de baza in cea ce priveste declaratia parametriilor, tipul returnat
Dan Novischi si transmiterea argumentelor.
Trebuie de mentionat insa ca trasmiterea argumentelor prin valoare de tip
Review
structura catre functii este in general de evitat. Acest lucru se datoreaza
Denumirea
Simbolica a
faptului ca o structura ocupa deobicei un numar mai mare de octeti, iar
Tipurilor transmiterea prin valoare presupune copierea acestor octeti la fiecare apel
Structuri de functie.
Definire
Utilizare
Astfel, atat parametrii de functii cat si tipul returnat de acestea, in cazul
Anonimat structurilor, se realizeaza folosind mecanismul de trasmitere prin
typedef struct referentinta (prin pointeri).
Array de Structuri
Pointeri si Alocare Spre exemplu, in programul precedent putem organiza citirea datelor unui
struct vs. Functii student de la tastura astfel:
Uniuni Student* readStudentFromKB(Student *s){
Definire
char buf[30]; // Buffer pentru citire
Utilizare
Anomimat si typedef
if(s == NULL)
Array, Pointeri si s = (Student*) malloc(sizeof(Student));
Alocare
union vs. Functii
/* Citire nume */
Campuri de Biti
Definire
printf("Nume: "); scanf("%29s", buf);
Utilizare s->nume = (char*) malloc(strlen(buf)+1);
union struct and
bit field
strcpy(s->nume, buf);
Parametrii si Return Functii

Limbaje de
Programare
/* Citire prenume */
Curs 9 - Tipuri de printf("Prenume: "); scanf("%29s", buf);
Date Proprii
s->prenume = (char*) malloc(strlen(buf)+1);
Dan Novischi
strcpy(s->prenume, buf);
Review
/* Citire CNP */
Denumirea
Simbolica a printf("CNP: "); scanf("%13s", buf);
Tipurilor
strcpy(s->cnp, buf);
Structuri
Definire
/* Citire ID */
Utilizare
Anonimat
printf("ID: "); scanf("%l", &s->id);
typedef struct
Array de Structuri /* Citire GPA */
Pointeri si Alocare
struct vs. Functii
printf("GPA: "); scanf("%f", &s->gpa);
Uniuni
Definire
return s;
Utilizare }
Anomimat si typedef
Array, Pointeri si
Alocare
union vs. Functii

Campuri de Biti
Definire
Utilizare
union struct and
bit field
Definirea Uniunilor

Limbaje de
Programare
Uniunile sunt un tip de date special care faciliteaza stocarea datelor in
Curs 9 - Tipuri de aceeasi zona de memorie (sau, altfel spus, stocarea intr-o zona comuna
Date Proprii
de memorie).
Dan Novischi
Datele continute de o uniune pot fi de orice tip, precum: int, char,
Review double, struct, s.a.m.d.
Denumirea Pentru definitia unei uniuni se utilizeaza cuvantul cheie union si similar
Simbolica a
Tipurilor
definitiei unei structuri aceasta are urmatoarea forma generala:
Structuri
Definire union nume_uniune{
Utilizare tip nume_camp1;
Anonimat
tip nume_camp2;
typedef struct
Array de Structuri
...
Pointeri si Alocare tip nume_campN;
struct vs. Functii };
Uniuni
Definire
Utilizare Spre exemplu, putem scrie o definitie de uniune care uneste pretul unei
Anomimat si typedef masini cu modelul acestia:
Array, Pointeri si
Alocare union CarDetail{
union vs. Functii float price;
Campuri de Biti char model[4];
Definire };
Utilizare
union struct and
unde campul price are 4 octeti (sizeof(float)) si este stocat intr-o
bit field zona comuna cu cei 4 octeti ai campului model.
Utilizare Uniuni

Limbaje de
Programare Declaratia unei variabile de tip uniune se realizeaza similiar cu cea de la
Curs 9 - Tipuri de
Date Proprii
structuri, avand urmatoarea forma generala:
Dan Novischi union nume_uniune nume_variabila;
Review
Spre exemplu, declaratia unei variabile de tipul uniunii CarDetail definita
Denumirea
Simbolica a anterior se poate scrie:
Tipurilor

Structuri union CarDetail c;


Definire
Utilizare unde c este o uniune de tip union CarDetail.
Anonimat
typedef struct
Accesul la campul unei uniuni se realizeaza in mod similar cu structurile si
Array de Structuri are forma:
Pointeri si Alocare
struct vs. Functii nume_uniune.nume_camp;
Uniuni
Definire Spre exemplu, putem atribui un pret prin:
Utilizare
Anomimat si typedef
c.price = 12355.5;
Array, Pointeri si
Alocare
Deoarece campurile unei uniuni sunt stocate in aceeasi zona de memorie
union vs. Functii (intr-o zona comuna), modificarea unui anumit camp va determina
Campuri de Biti modifcarea celorlate campuri continute in uniune. Astfel, dupa atribuirea
Definire de mai sus am putea afisa valorile octetilor individuali prin:
Utilizare
for(i = 0; i < 4; i++)
union struct and
bit field printf("%d ", c.model[i]);
Anomimat si typedef

Limbaje de
Programare
Curs 9 - Tipuri de
Date Proprii Similar structurilor, uniunile pot fi anonime prin furnizarea unor nume de
Dan Novischi variabile in momentul definiirii. Astfel, anterior puteam scrie si:
union{
Review
float price;
Denumirea char model[4];
Simbolica a
Tipurilor }c;
Structuri Se poate, de asemenea folosi typedef pentru a redenumi tipul de date
Definire
definit de o uniune, prin:
Utilizare
Anonimat typedef union CarDetail{
typedef struct float price;
Array de Structuri
Pointeri si Alocare
char model[4];
struct vs. Functii }CarDetail;
Uniuni sau similar folosind uniuni anonime prin:
Definire
typedef union{
Utilizare
Anomimat si typedef
float price;
Array, Pointeri si char model[4];
Alocare
union vs. Functii
}CarDetail;
Campuri de Biti Astfel ulterior putem declara variabile de tip union CarDetail prin:
Definire
CarDetail c;
Utilizare
union struct and
bit field
Array, Pointeri si Alocare

Limbaje de
Programare Array-urile de uniuni se declara in mod obisnuit ca orice alt tip de date,
Curs 9 - Tipuri de
Date Proprii
spre exemplu:
Dan Novischi
union CarDetail c[10];

Review sau pentru o definitie cu typedef:


Denumirea CarDetail c[10];
Simbolica a
Tipurilor

Structuri Campurile unui anumit element se acceseaza in mod similar structurilor


Definire folosind indexarea si apoi accesul la camp:
Utilizare
Anonimat c[5].price = 2102.2;
typedef struct
Array de Structuri
sau folosind aritmetica cu pointeri:
Pointeri si Alocare
struct vs. Functii (*(c+5)).price = 2102.2;
Uniuni
Definire De asemenea, alocarea se realizeaza in mod analog prin:
Utilizare
Anomimat si typedef union CarDetail *c =
Array, Pointeri si (union CarDetail*) malloc(sizeof(union CarDetail));
Alocare
union vs. Functii

Campuri de Biti
sau pentru o definitie cu typedef:
Definire CarDetail *c = (CarDetail*) malloc(sizeof(CarDetail));
Utilizare
union struct and
Accesul la membrii prin intermediul unui pointer la o uniune se poate
bit field realiza folosind ->.
union vs. Functii

Limbaje de
Programare Ca si in cazul structurilor, uniunile pastreaza semnificatii identice in cea
Curs 9 - Tipuri de
Date Proprii
ce privesc parametrii, tipul returnat si transmiterea argumentelor.
Dan Novischi Evident, si de acesta data transmiterea uniunilor prin valoarea este de
evitat. Astfel, se utilizeaza in general mechanismul de transmitere prin
Review referentinta.
Denumirea
Simbolica a Spre exemplu, putem scrie o functie pentru citirea unui detaliu despre o
Tipurilor masina de la tastatura in felul urmator:
Structuri CarDetail* readCarDetailFromKB(CarDetail *c, int member){
Definire
Utilizare
Anonimat if(c == NULL)
typedef struct c = (CarDetail*) malloc(sizeof(CarDetail));
Array de Structuri
Pointeri si Alocare
struct vs. Functii
switch(member){
Uniuni
case 0:
Definire
printf("Car model: "); scanf("%3s", c->model);
Utilizare break;
Anomimat si typedef
case 1:
Array, Pointeri si
Alocare printf("Car price: "); scanf("%f", &c->price);
union vs. Functii break;
Campuri de Biti }
Definire
Utilizare
union struct and
return c;
bit field }
Definitie Bit Field

Limbaje de
Programare In limbajul C Bit Fileds sau campuri de biti reprezinta o facilitate prin
Curs 9 - Tipuri de
Date Proprii intermediul careia putem defini si accesa biti individuali ale diverselor date
Dan Novischi
prin nume. Altfel spus, putem "atribui" nume individuale unor biti.
Forma generala definirea unor campuri de biti utilizeaza cuvantul cheie
Review
struct dupa cum urmeaza:
Denumirea
Simbolica a
Tipurilor struct nume_bit_field{
Structuri tip nume_camp1 : numar_biti;
Definire tip nume_camp2 : numar_biti;
Utilizare
Anonimat
...
typedef struct tip nume_campN : numar_biti;
Array de Structuri };
Pointeri si Alocare
struct vs. Functii

Uniuni
unde nume_bit_field reprezinta numele dat campului de biti (NU o
Definire structura), numar_biti reprezinta numarul de biti alocat fiecarui camp,
Utilizare iar nume_campX reprezinta numele unui camp de acelasi tip cu numele
Anomimat si typedef
celorlate campuri.
Array, Pointeri si
Alocare
Bit Field-urile, ca si structurile, pot fi definite cu ajutorul cuvantului cheie
union vs. Functii
typedef si respecta de asemenea regulile de anonimat.
Campuri de Biti
Definire Utilizare acestora este des intalnita in programarea embedded (sunt
Utilizare practic omni-prezente) si in definirea succinta a divereselor status-uri
union struct and
bit field dintr-un program.
Definitie Bit Field

Limbaje de
Programare
Spre exemplu, putem defini un camp de biti care sa poata reprezenta mai
Curs 9 - Tipuri de multe status-uri pentru un robotel pe un singur octet:
Date Proprii
typedef struct Status{
Dan Novischi
BYTE battery_ok : 1;
Review BYTE wifi_enabled : 1;
Denumirea
BYTE connected : 1;
Simbolica a BYTE command_state : 2;
Tipurilor
BYTE sensors_state : 3;
Structuri } Status;
Definire
Utilizare
unde BYTE se presupune a fi definit anterior si fiecare stare, dupa cum se
Anonimat poate observa, are asociata un numar de biti.
typedef struct Daca anumiti biti nu sunt folositi, acestia pot fi marcati explicit prin
Array de Structuri
Pointeri si Alocare
omiterea numelui pentru un camp. Spre exemplu, sa presupunem ca
struct vs. Functii command_state si sensors_state au ambele o reprezentare pe doi biti,
Uniuni iar bitul nefolosit se afla intre cele doua stari. Atunci, putem scrie
Definire urmatoarea definitie:
Utilizare typedef struct Status{
Anomimat si typedef
Array, Pointeri si
BYTE battery_ok : 1;
Alocare BYTE wifi_enabled : 1;
union vs. Functii
BYTE connected : 1;
Campuri de Biti BYTE command_state : 2;
Definire
Utilizare
BYTE : 1;
union struct and BYTE sensors_state : 2;
bit field
} Status;
Utilizare Bit Field

Limbaje de
Programare
Curs 9 - Tipuri de
Utilizarea unui Bit Field presupune ca si in cazul structurilor obisnuite
Date Proprii declararea unei variabile de tipul definit. Astfel, pentru definitia
Dan Novischi anterioara putem declara:
Status robotStatus;
Review

Denumirea
Accesul la campurile individuale se realizeaza in mod similar cu cele de la
Simbolica a structuri. Spre exemplu:
Tipurilor
// definitie pentru tipul boolean
Structuri
Definire
typedef enum{ FALSE = 0, TRUE = 1} Boolean;
Utilizare
Anonimat // definitie pentru starea unei comenzi
typedef struct
typedef enum{
Array de Structuri
Pointeri si Alocare
CMD_RECEIVED = 0,
struct vs. Functii CMD_ACK = 1,
Uniuni CMD_PARSE_ER = 2,
Definire CMD_CHECKSUM_ERR = 3
Utilizare
}CommandState;
Anomimat si typedef
Array, Pointeri si
Alocare robotStatus.battery_ok = TRUE; // sau similar
union vs. Functii
robotStatus.command_state = CMD_CHECKSUM_ERR;
Campuri de Biti
Definire
Evident, definirea array-urilor, lucrul cu pointeri cat si alocarea dinamica
Utilizare pastreaza pentru Bit Field-uri semnificatia si sintaxa identica cu cea a
union struct and
bit field
structurilor.
union struct and bit field

Limbaje de
Programare
In sistemele embedded aproape in totalite se utilizeaza micro-controllere
Curs 9 - Tipuri de (MCU) care sunt programate in limbajul C.
Date Proprii
Accesul la diverse module — dupa cum veti vedea mai tarziu in cadrul
Dan Novischi
cursului de Sisteme cu Micro-Procesoare — se relizeaza prin intermediul
Review
asa numitilor registrii (memory mapped registers).
Denumirea
Astfel, pentru lucrul cu registrii trebuie sa avem posibilitatea de a accesa
Simbolica a atat biti individuali, cat si intreg registru.
Tipurilor
Din punct de vedere al limbajului C, pentru a facilita aceasta interactiune
Structuri
descriea ca tip de date a unui registru utilizeaza uniuni de campuri de biti.
Definire
Utilizare
Spre exemplu, o descriere uzuala a tipului de date care reprezinta un
Anonimat registru de 8 biti (1 octet) arata ca mai jos:
typedef struct
typedef union{
Array de Structuri
Pointeri si Alocare
unsigned char reg;
struct vs. Functii struct{
Uniuni unsigned char bit0 : 1;
Definire unsigned char bit1 : 1;
Utilizare unsigned char bit2 : 1;
Anomimat si typedef
Array, Pointeri si
unsigned char bit3 : 1;
Alocare unsigned char bit4 : 1;
union vs. Functii
unsigned char bit5 : 1;
Campuri de Biti unsigned char bit6 : 1;
Definire
Utilizare
unsigned char bit7 : 1;
union struct and }bits;
bit field
}Register;
union struct and bit field

Limbaje de
Programare
Curs 9 - Tipuri de Sa presupunem ca un astfel de registru este DDR (Data Drirection
Date Proprii
Register):
Dan Novischi

Register DDR;
Review

Denumirea atunci accesul la nivel de registru pentru setarea bitilor 4 si 5 la valoarea


Simbolica a
Tipurilor 1 arata astfel:
Structuri
DDR.reg |= (3 << 4); // 3 = 0000 0011
Definire
Utilizare
Anonimat
iar acesul la nivel de bit pentru aceeasi operatie este dat de:
typedef struct
Array de Structuri DDR.bits.bit4 = 1;
Pointeri si Alocare DDR.bits.bit5 = 1;
struct vs. Functii

Uniuni
Similar am putea setea cei doi biti la valoarea zero (sa ii resetam) prin:
Definire
Utilizare
Anomimat si typedef DDR.reg &= ~(3 << 4); // 3 = 0000 0011
Array, Pointeri si
Alocare
iar acesul la nivel de bit pentru aceeasi operatie este dat de:
union vs. Functii

Campuri de Biti DDR.bits.bit4 = 0;


Definire
DDR.bits.bit5 = 0;
Utilizare
union struct and
bit field
Anunt Lucrare / Recuperari

Limbaje de
Programare
Curs 9 - Tipuri de
Date Proprii

Dan Novischi RECUPERARE CURS


Review Recuperarea Cursului de Marti 18 Apr 2017 va avea loc Sambata 22 Apr.
Denumirea
2017 intre 14:00 - 16:00 in sala EA004.
Simbolica a
Tipurilor

Structuri
Definire
Utilizare LUCRAREA 2
Anonimat
typedef struct
Va avea loc dupa Sambata 24 Apr. 2017 dupa Curs si va dura 30 min.
Array de Structuri Date:
Pointeri si Alocare
struct vs. Functii
Gruple 114A, 115A, 116A vor sustine intre 16:00 - 16:30
Gruple 111A, 112A, 113A vor sustine intre 16:50 - 17:20
Uniuni
Definire Subiectele vor contine cerinte pentru implementarea unor programe
Utilizare similare (NU identice) cu cele prezentate in cardrul cursului si al
Anomimat si typedef
laboratorului.
Array, Pointeri si
Alocare
Materia acoperita de lucrare este data de: Curs5 – Curs7 si Lab5 – Lab7.
union vs. Functii

Campuri de Biti
Definire
Utilizare
union struct and
bit field

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