Sunteți pe pagina 1din 2

Alocarea dinamica a matricilor

O matrice alocata dinamic va fi constituita dintr-un vector de pointeri catre liniile matricii
si din spatiul alocat liniilor. De aceea se aloca mai intai vectorul care va contine adresele
vectorilor linie

if( (mat=(double **)calloc(nl, sizeof(double *))) ==NULL)


return NULL;

Functia calloc este similara cu malloc, doar ca are doua argumente. Mai sus s-a alocat un
vector de nl pointeri la double. In continuare se aloca spatiu pentru fiecare linie in parte.
Adresa fiecarei linii este memorata in vectorul mat alocat anterior.

for(i=0;i<nl;i++)
if((mat[i]=(double *)calloc(nc, sizeof(double))) ==NULL)
return
NULL;

La sfarsit functia de alocare dinamica a matricii va returna adresa mat.

Exemplu

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

double ** alocmat(int nl, int nc)


{
double **mat;
int i;

if( (mat=(double **)calloc(nl, sizeof(double *))) ==NULL) return NULL;

for(i=0;i<nl;i++)
if((mat[i]=(double *)calloc(nc, sizeof(double))) ==NULL)
return NULL;
return mat;
}

void elibmat(double **m, int nl)


{
int i;
for(i=0;i<nl;i++) free(m[i]);
free(m);
}

void afismat(char *text, double **m, int nl,int nc)


{
int i,j;
printf("\n%s",text);
for(i=0;i<nl;i++) {
printf("\n");
for(j=0;j<nc;j++) printf("%5.2lf ",m[i][j]);
}
}
void initrand(double **m, int nl,int nc)
{
int i,j;
for(i=0;i<nl;i++)
for(j=0;j<nc;j++) m[i][j]=random(100)/100.;
}

typedef double ** MATRICE;


void main()
{
MATRICE a;
a=alocmat(3,5);
randomize();
initrand(a,3,5);
afismat("Matrice initializata aleator",a,3,5);
elibmat(a,3);
}

Programul produce o iesire de forma:

Matrice initializata aleator


0.27 0.50 0.10 0.64 0.39
0.06 0.40 0.51 0.02 0.85
0.09 0.11 0.38 0.99 0.16

Observatii
1. Functia int random(int ValMax) are prototipul in <stdlib.h> si returneaza o
valoare pseudoaleatoare din intervalul [0,ValMax-1].
2. Pentru ca la executii diferite sa nu se obtina aceleasi valori pseudoaleatoare este
necesar apelul functiei void randomize(); cu prototipul tot in <stdlib.h> si care
initializeaza generatorul de numere pseudoaleatoare cu un numar aleator legat de
momentul executiei (de aceea este necesara includerea fisierului time.h).

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