Alocare dinamica a memoriei. - PowerPoint PPT Presentation

1 / 20
About This Presentation
Title:

Alocare dinamica a memoriei.

Description:

Alocare dinamica a memoriei. Asigura controlul direct, la executie al alocarii de memorie de catre programator prin apelul unor functii specifice, cu prototipurile in ... – PowerPoint PPT presentation

Number of Views:62
Avg rating:3.0/5.0
Slides: 21
Provided by: andreiClu
Category:

less

Transcript and Presenter's Notes

Title: Alocare dinamica a memoriei.


1
Alocare dinamica a memoriei.
  • Asigura controlul direct, la executie al alocarii
    de memorie de catre programator prin apelul unor
    functii specifice, cu prototipurile in ltstdlib.hgt
    si ltalloc.hgt
  • void malloc(unsigned n)
  • void calloc(unsigned ne, unsigned dim)
  • void realloc(void p, unsigned n)
  • void free(void p)
  • În C, alocarea dinamica se face mai simplu si
    mai sigur, folosind operatorii new si delete.
  • Operatorul new permite alocarea de memorie în
    heap. El se foloseste într-una din formele

2
Alocare dinamica a memoriei.
  • tip p, q, r
  • //rezerva o zona de sizeof(tip) octeti
  • pnew tip
  • //acelasi efect cu initializare cu valoarea
  • // expresiei
  • qnew tip(expresie)
  • //rezerva o zona neinitializata de
  • // expintsizeof(tip) octeti
  • rnew tipexpint
  • Eliberarea memoriei alocate se face prin
  • delete p
  • //elibereaza memoria alocata pentru tablou
  • delete r

3
Exemplul 1
  • include ltstdlib.hgt
  • include ltstdio.hgt
  • int main()
  • double p
  • int n
  • scanf(d, n)
  • p(double)malloc(nsizeof(double))
  • if(pNULL)
  • printf(cerere neonorata\n)
  • exit(1)
  • return 0

4
Exemplul 2
  • char strdup(char s)
  • char p
  • p(char)malloc(strlen(s)1)
  • if(p)
  • strcpy(p, s)
  • return p

5
Exemplul 3
  • Cititi de la intrarea standard un sir de
    caractere de lungime necunoscuta într-un vector
    alocat dinamic.
  • Alocarea de memorie se va face progresiv, în
    incremente de lungime INC, dupa citirea a INC
    caractere se face o realocare.

6
Exemplul 3 alocare incrementala a unui vector.
  • char citire()
  • char p, q
  • int n
  • unsigned dimINC
  • pq(char)malloc(dim)
  • for(n1 (pgetchar())!\n p!EOF n)
  • if(nINC0)
  • dimINC
  • pqrealloc(q,dim)
  • pn
  • continue
  • p
  • p\0
  • return realloc(q,n)

7
Pointeri la pointeri
  • int x10, pxx, ppxpx
  • void pschimb(int pa, int pb)
  • int ptemp
  • ptemppa
  • papb
  • pbptemp
  • int px, py
  • pschimb(px, py)

8
Tabele de pointeri.
  • Cititi in memorie un fisier text (de exemplu
    fisierul standard de iesire).
  • Liniile citite vor fi alocate dinamic prin
    pointeri dintr-un tablou de pointeri.
  • include ltstdio.hgt
  • include ltstdlib.hgt
  • define N 100
  • void afisare(char tp, int n)
  • while(n--)
  • printf(s\n,tp)

9
Tabele de pointeri.
  • int main()
  • //tabel de pointeri alocat static
  • char tpN
  • int lg0 //numar de linii
  • char linie80
  • while(gets(linie))
  • tplgstrdup(linie)
  • afisare(tp, lg)
  • return 0

10
Pointeri la functii
  • Numele unei functii reprezinta adresa de memorie
    la care începe functia. Numele functiei este un
    pointer la functie.
  • Ca si variabilele, pointerii la functii
  • pot primi ca valori functii
  • pot fi transmisi ca parametrii altor functii
  • pot fi intorsi ca rezultate de catre functii
  • La declararea unui pointer catre o functie
    trebuiesc precizate toate informatiile despre
    functie, adica
  • tipul functiei
  • numarul de parametri
  • tipul parametrilor
  • tip (pf)(lista_parametri_formali)

11
Pointeri la functii
  • Apelul unei functii prin intermediul unui pointer
    are forma
  • (pf)(lista_parametri_actuali)
  • sau mai simplu, fara indirectare
  • pf(lista_parametri_actuali)
  • De exemplu, initializarea unui tablou cu pointeri
    cu functiile matematice uzuale se face prin
  • double (tabfun)(double) sin, cos, tan, exp,
    log
  • Pentru a calcula radacina de ordinul 5 din e este
    suficienta atribuirea
  • y (tabfun3)(0.2)
  • În acest mod putem transmite în lista de
    parametri a unei functii numele altei functii

12
Exemplu calculul unei integrale definite.
  • Definiti o functie pentru calculul unei integrale
    definite prin metoda trapezelor,cu un numar fixat
    n de puncte de diviziune
  • Folositi apoi aceasta functie pentru calculul
    unei integrale definite cu o precizie data ?.
    Aceasta precizie este atinsa în momentul în care
    diferenta între doua integrale, calculate cu n,
    respectiv 2n puncte de diviziune este inferioara
    lui ?

13
Calculul unei integrale definite.
  • include ltmath.hgt
  • double sinxp()
  • double trapez(double,double,int,double()(double))
  • double a0.0, b1.0, eps1E-6
  • int N10
  • void main(void)
  • int nN
  • double In,I2n,vabs
  • Intrapez(a,b,n,sinxp)
  • do n2
  • I2ntrapez(a,b,n,sinxp)
  • if((vabsIn-I2n)lt0) vabs-vabs
  • InI2n
  • while(vabs gt eps)
  • printf(6.2lf\n, I2n)

14
Integrala unei functii definite.
  • double trapez(double a,double b,int
    n,double(f)(double))
  • double h,s
  • int i
  • h(b-a)/n
  • for(s0.0,i1iltni)
  • s(f)(aih)
  • s((f)(a)(f)(b))/2.0
  • sh
  • return s
  • double sinxp(double x)
  • return sin(xx)

15
Declaratii complexe.
  • O declaratie complexa este o combinatie de
    pointeri, tablouri si functii. In acest scop se
    folosesc atributele
  • () functie
  • tablou
  • - pointer
  • care pot genera urmatoarele combinatii
  • () functie ce returneaza un pointer
  • ()() pointer la o functie
  • - tablou de pointeri
  • () pointer la tablou
  • tablou bidimensional
  • Exista si combinatii incorecte, provenite din
    faptul ca nu este permisa
  • declararea unui tablou de functii
  • Declararea unei functii ce returneaza un tablou

16
Declaratii complexe.
  • Combinatiile interzise sunt
  • () functie ce returneaza un tablou
  • () tablou de functii
  • ()() functie ce returneaza o functie
  • Regula dreapta stânga
  • se incepe cu identificatorul
  • se cauta în dreapta identificatorului un atribut
  • daca nu exista, se cauta în partea stanga
  • se substituie atributul cu sablonul text
    corespunzator
  • se continua substitutia dreapta-stânga
  • se opreste procesul la întâlnirea tipului datei.

17
Declaratii complexe exemple.
  • int ( a10) ( )
  • tablou de 10
  • pointeri la
  • functii ce returneaza int
  • double ((pf)())34
  • pointer la
  • o functie ce returneaza un pointer
  • la un tablou cu 3 linii si 4 coloane de double

18
Declaratii complexe.
  • Pentru cresterea claritatii, sa definim progresiv
    noi tipuri folosind typedef
  • /tipul SIRsir de caractere/
  • typedef char SIR
  • /tipul VECTORtablou de 10float/
  • typedef float VECTOR10
  • /tipul MATRICE tablou de 10x10 float/
  • typedef float MATRICE1010
  • /tipul PFADRDpointer la functie de argument
    double si rezultat double /
  • typedef double (PFADRD)(double)

19
Declaratii complexe.
  • SIR s1, s2
  • VECTOR b, x
  • MATRICE a
  • PFADRD pf1

20
Tablouri multidimensionale
  • typedef struct nod3
  • int n
  • double v
  • N3
  • typedef struct nod2
  • int n
  • N3 pn3
  • N2
  • N2 alocmat()
  • N2 n2, p2n2
  • int i, j, n
  • scanf("d", n)
  • p2-gtn n
  • p2-gtpn3(N3)malloc(nsizeof(N3))
  • for(i0 iltn i)
  • p2-gtpn3i(N3)malloc(sizeof(N3))
  • scanf("d", p2-gtpn3i-gtn)
  • p2-gtpn3i-gtv(double)malloc(p2-gtpn3i-gtn
    sizeof(double))
Write a Comment
User Comments (0)
About PowerShow.com