PDA

Visualizza la versione completa : C++ - Gestione strutture e utilizzo malloc


MaledettoC
23-05-2016, 11:35
Ciao a tutti,
programmino di lettura da file unicode di strutture grafiche che poi dovrò stampare.
Ho effettuato un ciclo while per leggere tutto il file riga per riga.
Ho creato delle strutture al momento due (rettangolo e picture) così definite


typedef struct
{
int ObjID;
int Xs;
int Ys;
int Xd;
int Yd;
COLORREF bckground ;
COLORREF fgcolor;
int LinkID;
int numRect;

}Rettangolo;

typedef struct
{
int ObjID;
int Xs;
int Ys;
int Xd;
int Yd;
COLORREF bckground ;
COLORREF fgcolor;
int LinkID;
WCHAR * sPathImage;
}Picture;


Nel leggere il file effettuo :

if (puntObj[numObj] != NULL ) numObj++; // così diventa 1
puntObj[numObj] = malloc(sizeof(Rettangolo)); //lo spazio allocato sarà grande come la dimensione della struttura.
puntRect = (Rettangolo*) puntObj[numObj] ;
puntRect ->numRect = numObj;
puntRect -> ObjID = 2; //per dire che la nostra struttura è un rettangolo.
Leggo poi i restanti valori (dimensioni, colore, etc)
Passo poi alla seconda struttura grafica

if (puntObj[numObj] != NULL ) numObj++; // così diventa 1
puntObj[numObj] = malloc(sizeof(Picture)); //lo spazio allocato sarà grande come la dimensione della struttura.
puntPict = (Picture*) puntObj[numObj];
puntPict -> ObjID = 5; //per dire che la nostra struttura è un rettangolo.

le variabili utilizzate sono state così definite:

Rettangolo * puntRect;
Picture * puntPict;
void * puntObj [1000];
int numObj=0;


Ora... alla fine vorrei leggere le strutture e procedere con la stampa dei singoli oggetti... ma in debug mi accorgo che se vado a leggere il valore di (Rettangolo*) puntObj[0] trovo i valori correttamente caricati del primo oggetto rettangolo ma se sostituisco (Rettangolo*) con il secondo puntatore (Picture*) leggo gli stessi valori . Ora come faccio a leggere quello che ho caricato in puntObj?
Grazie.

oregon
23-05-2016, 13:43
Non ho capito il problema ...

MaledettoC
23-05-2016, 14:01
Il mio problema è che non so come leggere le strutture che ho caricato. nel debug quando vado a vedere a cosa punta (Rettangolo*) puntObj[0] vedo i dati della struttura caricati correttamente per il primo rettangolo , ma se faccio (Picture*) puntObj[0] vedo gli stessi stessi valori . Non riesco a capire come posso leggere le strutture che ho caricato , devo creare un 3° puntatore?

oregon
23-05-2016, 14:04
C'è un problema di fondo nel tuo ragionamento ...

Se il primo puntatore punta ad una struttura Rettangolo, perché dovresti utilizzarlo con una struttura Picture? Semmai sarà un altro puntatore a fare riferimento all'altra struttura, che so, ad esempio

(Picture*) puntObj[5]

ma questo dipende da quanto valeva numObj man mano che caricavi i dati.

MaledettoC
23-05-2016, 14:12
numobj viene incrementato ogni volta.
quindi come nel mio caso ci sono 3 oggetti, 2 rettangoli e 1 immagine , non capisco perchè (Picture*) puntObj[0] abbia gli stessi valori di (Rettangolo*) puntObj[0] . Perchè il puntatore punta alla stessa area di memoria puntObj[0]? e quindi poi prende i valori letti e li mette nella struttura indicata dal puntatore ? Ma se volessi leggere le aree che ho allocato? AIUTOOO mi sto perdendo

oregon
23-05-2016, 15:15
numobj viene incrementato ogni volta. quindi come nel mio caso ci sono 3 oggetti, 2 rettangoli e 1 immagine , non capisco perchè (Picture*) puntObj[0] abbia gli stessi valori di (Rettangolo*) puntObj[0] . Perchè il puntatore punta alla stessa area di memoria puntObj[0]? e quindi poi prende i valori letti e li mette nella struttura indicata dal puntatore ? Ma se volessi leggere le aree che ho allocato? AIUTOOO mi sto perdendoC'è un po' di confusione ... Se leggi in memoria dei dati secondo una struttura, il puntatore lo devi usare coerentemente. Ovvero se i primi due puntatori puntano a strutture Rettangolo allora dovrai utilizzare puntObj[0] e puntObj[1] SEMPRE come puntatori a Rettangolo (ovvero Rettangolo *). Dato che l'ultimo puntatore l'hai usato per puntare alla struttura Picture dovrai usare puntObj[2] SEMPRE come puntatore a Picture (ovvero Picture *).Ma non ha senso usare un puntatore che punta ad un certo tipo di struttura come puntatore ad un'altra ...

MaledettoC
23-05-2016, 15:33
Io non so a priori quante strutture ci sono come rettangolo o come immagine. Quindi pensavo che un (picture*) puntobj[0] non mi facesse tornare indietro nessun risultato in quanto nella posizione [0] non c'e' un'immagine caricata ma era stata allocata per un rettangolo.

oregon
23-05-2016, 15:37
Assolutamente no. In C non esiste nulla che faccia questo tipo di controllo. Il puntatore è un semplice indirizzo di memoria che punta a dati binari e basta. Nessuno ti dice che tipo di dati ci sono, sei tu a saperlo.

oregon
23-05-2016, 15:42
Potresti usare due blocchi di puntatori
Rettangolo *puntRect[500];Picture *puntPict[500];int numRect = 0;int numPict = 0;oppure usare un campo comune all'inizio delle due strutture che indichi subito di che tipo si tratta.

Loading