linux user group brescia

immagine del castello

Archivio della mailing list

Array e malloc

Bauno bauno a inwind.it
Mar 7 Maggio 2002 02:48:27 UTC
On Monday 06 May 2002 16:41, Carlo wrote:
> Per proseguire il discorso...
>
> Ho una struct
>
> orso {
> int cane;
> int gatto;
> char nome[20];
> }
>
> struct orso jolly[uno][due][tre];
>
> con
>
> int uno,due,tre;
>
> come faccio a dichiarare jolly come puntatore e soprattutto ad allocarlo
> con malloc?

Ci sono 20 modi. Te ne cito 2:

Il + "scolastico":

struct orso ***jolly;

jolly = malloc(uno*sizeof(orso**));

for (int i = 0; i < uno; i++) 
	jolly[i] = malloc(due*sizeof(orso*));

for (int i = 0; i < uno; i++)
	for (int j = 0; i < due; i++)
		jolly[i][j] = malloc(tre*sizeof(orso));

Dopodiché puoi andare a caccia di orsi con jolly[i][j][k].

Questo sistema è corretto ma x certi versi inefficiente x 2 motivi:
1) Ogni volta che vuoi accedere ad un elemento, devi passare x una tripla 
indirezione (che, in termini di cicli di CPU, costa).
2) La memoria che allochi tende a frammentarsi molto.

In compenso è molto semplice da implementare e maneggiare.

Quindi se la velocità non è un problema, usa assolutamente questo. Se la 
velocità è un problema, puoi usare una cosa del tipo:

struct orso *jolly;
jolly = malloc(uno*due*tre*sizeof(orso));

A questo punto hai un unico vettore, che puoi xò utilizzare come una matrice 
intercalando al suo interno gli elementi in modo opportuno, tipicamente 
mettendo "tre" orsi "due" volte per "uno"; quindi l'orso i-j-k + in realtà è:


*(jolly+i*due*tre+j*tre+k)


Tenendo presente che l'aritmetica dei puntatori è di gran lunga + veloce della 
loro dereferenziazione.

Tra queste 2 forme ce ne sono diverse che potremmo definire "intermedie", 
tipicamente, si crea una matrice "quasi statica" di puntatori e la si fa 
puntare alle righe/colonne "logiche" del vettore monolitico. Oppure si 
scrivono delle macro che facilitino l'accesso. Se una delle dimensioni è nota 
a priori, puoi usare la famigerata forma 

orso (**)[tre]

che ti risparmia un'indirezione ma se non sei pratico ti incasina brutalmente.

Insomma diventa una questione di struttura del programma, abitudine e 
fantasia. 

Disclaimer: non mi assumo responsabilità su quanto scrivo a quest'ora di 
notte.


-- 
Bauno - Eurydices, oro, properata retexite fata!
"And we are here as on a darkling plain, swept with confused alarms
of struggle and fight, where ignorant armies clash by night" (MA)




Maggiori informazioni sulla lista Lug