Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    C++ - Gestione strutture e utilizzo malloc

    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
    codice:
    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 :
    codice:
    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
    codice:
    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:
    codice:
    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.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non ho capito il problema ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    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?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    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


  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quote Originariamente inviata da MaledettoC Visualizza il messaggio
    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
    C'è 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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    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.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Potresti usare due blocchi di puntatori
    codice:
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.