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
|