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

    C++ - Utilizzo Malloc e gestione strutture.

    Ciao a tutti,
    nel mio programmino, leggo un file e carico delle strutture. Il file contiente oggetti e caratteristiche di questi.
    All'interno del file, però, una struttura (tipo il rettangolo) puo' presentarsi piu' volte , quindi leggo il file e con la malloc mi occupo delle aree di memoria dove con l'aiuto di un indice posso andare a riprendere le singole strutture e rileggere le loro caratteristiche.

    ES.
    codice:
    //faccio la malloc 
                   puntObj[numObj] = malloc(sizeof(Rettangolo)); 
                   if (puntObj[numObj] != NULL ) numObj++; // così diventa 1
                   puntRect = (Rettangolo*) puntObj[numObj]        ;
                   puntRect -> ObjID = 2; //per dire che la nostra struttura è un rettangolo.
    però nell'istruzione dove assegno il numero 2 mi dà il seguente errore

    Unhandled exception at 0x0016190b in Stampa.exe: 0xC0000005: Access violation writing location 0x00000000.

    Ho definito:
    codice:
    void * puntObj [1000];
    int numObj=0;
    Rettangolo * puntRect; //punta alla struttura rettangolo 
    //La struttura rettangolo è così definita all'interno di .h
    typedef struct 
    {
        int ObjID;
        int Xs;
        int Ys;
        int Xd;
        int Yd;
        COLORREF bckground ;
        COLORREF fgcolor;
        int LinkID;
    }Rettangolo;
    Come mai presenta quell'errore?
    Dove sbaglio?

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se aumenti numobj con

    numobj++;

    non devi usarlo dopo nelle altre istruzioni !
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Io lo utilizzo perchè mi dice che la struttura 1 ha quei valori. Mi serve perchè alla fine del file letto avrò piu' strutture rettangolo e quindi dovrò ciclare per ognuno e leggere le caratteristiche.
    codice:
    puntRect = (Rettangolo*) puntObj[numObj]        ; //NUMoBJ SARà LA PRIMA VOLTA =1
                   puntRect -> ObjID = 2;
    L'errore è su
    puntRect -> ObjID = 2;

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    tu allochi memoria e salvi il puntatore in posizione numObj, però incrementandolo subito dopo vai a fare il cast con il "puntatore" in posizione numObj+1 ,che ancora impostato e non si sa dove va a puntare

    codice:
    puntObj[numObj] = malloc(sizeof(Rettangolo));  // numObj = 0, puntObj[0] punta alla memoria allocata
    if (puntObj[numObj] != NULL ) numObj++; // così diventa 1
    puntRect = (Rettangolo*) puntObj[numObj]; // numObj = 1 fai il cast con puntObj[1] .... sicuro che contiene un riferimento valido?
    puntRect -> ObjID = 2; //puntRect a cosa punta?

  5. #5
    Io pensavo che PuntRec fosse come scrivere
    (Rettangolo*) puntObj[numObj] e ObjID è dichiarato nella struttura Rettangolo
    codice:
    typedef struct 
    {
        int ObjID;
        int Xs;
        int Ys;
        int Xd;
        int Yd;
        COLORREF bckground ;
        COLORREF fgcolor;
        int LinkID;
    }Rettangolo;

  6. #6
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Come diceva Oregon, il problema è in numObj.
    Il puntatore lo salvi nella posizione numObj (puntObj[numObj] = malloc(...)) ma poi puntRect lo vai a prendere dalla posizione numObj +1 (dove presumo che ancora non effettui la malloc)

    In pratica dovresti incrementare numObj alla fine

  7. #7
    ok grazie ci provo subito!

  8. #8
    ok fatto mettendolo prima della malloc e ora funziona.
    GRAZIE! Utili come sempre!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.