PDA

View Full Version : C++ Matrice a tre dimensioni (puntatori)


Frai
14-04-2006, 09:28
Ciao a tutti,
volevo esporvi un problema che ho incontrato in questi giorni e che mi sta creando grossi problemi.

Sto lavorando con una matrice (**Nome_immagini ), alloco la memoria in questo modo.


if ((Nome_immagini = (int**)calloc(3, sizeof(int*))) == NULL){
printf("Memoria insufficiente");
exit(2);
}
for (i=0; i<3; i++){
if ((Nome_immagini[i] = (int*)calloc(4, sizeof(int))) == NULL){
printf("Memoria insufficiente");
exit(2);
}
}


Il problema è che ora mi serve tenere traccia di queste matrici nel tempo, per poter usare i valori della matrice allo step 2, anche se sono allo step 6. Quindi devo memorizzarli.

Avevo pensato di utilizzare un vettore di puntatori che punti alla matrice. Ma ho sempre problemi di cast.
:mc: non so più che fare.....

grazie ciao

VendeR
14-04-2006, 10:40
scusa ma cosa intendi che vuoi tenere traccia dei valori nel tempo??
se tu carichi dei valori nella matrice (dopo che l'hai allocata) essi ci restano salvati, ci rimangono finche non usi una free() o chiudi il programma

mr_hyde
14-04-2006, 22:13
Anch'io non credo di aver afferrato bene: tu hai una serie di nomi (credo di immagini) che pero' possono cambiare nel tempo e vuoi tenere traccia della situazione istante per istante?

Detto con un esempio:

All'istante "t" tu hai
Elenco immagini = {"palla.jpg", "tavola.gif"}

All'istante "t+1" tu hai
Elenco immagini = {"palla.jpg", "tavola.gif", "zaino.png"}

e cosi' via, e tu hai bisogno di una struttura dati che ti permetta di vedere come era il tuo elenco immagini ad un certo istante...

Se e' cosi' semplificati la vita con il C++:
1) definisci un tipo dato per l'elenco delle immagini, una cosa del tipo

typedef std::vector<std::string> tipoElenco;

2) definisciti un tipo per l'elenco temporale, che non sara' altro che un array di ipoElenco

typedef tipoElenco tipoElencoTemporale[MAX_ISTANTI]

(ovviamente puoi anche ri-usare i vettori delle STL o mappe o qualunque altro contenitore delle STL che ti sembri piu' idoneo al tuo problema)


A questo punto, se scrivi

tipoElencoTemporale elencoTemporale;

avrai il tuo elenco temporale VUOTO (non c'e' alcuna informazione allocata).

Quando vorrai aggiungere un "istante":

tipoElenco elenco;

elenco.push_back("foto_di_pino.jpg");
elenco.push_back("foto_di_gino.jpg");
elenco.push_back("foto_di_lino.jpg");

elencoTemporale[t] = elenco;


E, ovviamente, per andare a ripescare l'elenco delle immagini in un dato momento:

tipoElenco elenco = elencoTemporale[x];

for (int i = 0, std::vector<std::string>::const_iterator it = elenco.begin();
it != elenco.end();
++it,
++i)
{
std::cout << "Immagine " << i << " = " << *it << std::endl;
}


In questo modo:
1) fai fare il lavoro grosso alle STL
2) non allochi tu direttamente, non ti incasini con i cast, la memoria viene
automaticamente deallocata quando non serve piu'
3) usi il C++ e non il C!

Poi, ovviamente, potrei non aver capito per niente la tu richiesta.

Ciao,
Mr Hyde

Frai
15-04-2006, 10:07
Grazie intanto per il suggerimento, ma il problema è che sto lavorando su un codice già fatto e non vorrei cambiare troppe cose.

Questa è la situazione: Ho un database dal quale leggo delle immagini (caratterizzate da: nome e una serie di features). Quindi ho un doppio puntatore: **Immagini_DB all'interno del quale vengono memorizzate sempre lo stesso numero di immagini (es:16).

Il problema è che queste features cambiano del tempo e nel programma attuale le nuove features vengono riscritte su quelle dello step precedente. La memoria viene liberata solo alla fine del programma dopo aver copiato l'inf su un file.

Ovvero se avessi 2 immagini e 4 features, questa sarebbe la situazione:

Immagini_DB: step 1

pesce-->0,4 | 0,3 | 0,72| 0,5
macchina ---> 343 | 0,89| 3,33| 3,22

Stp 2

pesce-->0,5| 33,2| 0,76| 0,9
macchina---> 340,2| 22,1| 0,4| 3,4

Perdendo ovviamente tutti i dati dello step 1.
A me serve tenere traccia anche di quei dati, perchè devono essere utilizzati..... per questo pensavo di aggiungere un altra dimensione e quindi fare una matrice tridimensionale:

***Immagini_DB

Tempo-->nome-->features.


Spero di essere stato un pò più chiaro.

Grazie, io non riesco a farlo proprio andare... ho sempre problemi di cast tra int*, int** ecc..


Ciao