Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    80

    [C++] Salvare immagine su file binario

    Ciao a tutti,
    ho bisogno di salvare una serie di immagini su un file binario. Utilizzo le librerie OpenGL (per il programma in generale) e quello che ho provato a fare io è ciò che segue:

    codice:
    AUX_RGBImageRec** bitmap; // array che conterrà le immagini
    bitmap = new AUX_RGBImageRec*[n_img]; // n_img = numero delle immagini
    memset(bitmap, 0, sizeof(void *)*1);
    
    // caricamento immagini
    
    for(int i=0; i < n_img; i++){
        bitmap[i] = load_bitmap(/*nome immagine*/);
    }
    // load_bitmap: funzione da me creata che carica un immagine bmp
    
    // salvataggio su file
    
    ofstream file;
    file.open(/*nome*/, ios::binary);
    
    for(int i=0; i < n_img; i++){
        file.write((char*)bitmap[i], sizeof(AUX_RGBImageRec*));
    }
    file.close();
    
    // lettura
    
    ifstream file;
    file.open(/*nome*/, ios::binary);
    
    for(int i=0; i < n_img; i++){
        file.read((char*)bitmap[i], sizeof(AUX_RGBImageRec*));
    }
    file.close();
    Ciò mi manda in crash il programma.. prima di leggere il file, l'array bitmap viene inizializzato come ho scritto all'inizio.. l'errore è: null pointer.

    Dove ho sbagliato?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,461
    Facendo debugging passo passo dovresti riuscire ad individuare esattamente la linea in cui avviene l'errore ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    80
    Avevo già provato il debug.. il punto di interruzione è nel file memcpy.asm scritto in assembly..

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,461
    Quando si ferma nella memcpy se vedi le chiamate nello stack (il debugging ti dà appositamente anche queste informazioni) dovresti capire quale funzione del tuo programma l'ha chiamato.

    Oppure se esegui passo passo (linea per linea) dovresti indicare quale è l'ultima linea eseguita prima dell'interruzione ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    80
    L'ultima riga prima dell'interruzione è quella in cui leggo i dati

    codice:
    for(int i=0; i < n_img; i++){
    ->  file.read((char*)bitmap[i], sizeof(AUX_RGBImageRec*));
    }
    Causa dell'interruzione: null pointer. La variabile bitmap viene settata a null tramite la funzione memset(), ma anche se non setto la variaible a null l'errore è sempre nella stessa riga.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,461
    Si vede che il puntatore

    bitmap[i]

    è nullo.

    Non so il perché ma non dovrebbe esserlo se lo usi.

    Quando inizializzi correttamente tutti i puntatori di bitmap[...] ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    80
    In teoria basterebbe il memset, però ora ho provato ad aggiungere questa riga di codice:
    codice:
    bitmap[i] = new AUX_RGBImageRec();
    Ora non dà più errori, solo che non carica l'immagine

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,461
    Il memset non basta proprio, primo perché quel memset non si capisce bene cosa faccia e in secondo luogo perché non si usa un memset per allocare lo spazio e farlo puntare dal puntatore ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    80
    Il memset serve per assicurarsi che il record di immagini non contenga nulla.
    Poi in ogni locazione del vettore verrà caricata un immagine dal file. Il problema era nel fatto che non avevo allocato ogni singola locazione, ma ora che l'ho fatto, la lettura avviene correttamente, solo che non è presente alcuna immagine. Ho sbagliato in scrittura forse?

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2011
    Messaggi
    80
    Finalmente sono riuscito a risolvere il problema..
    ho cercato meglio sulla struttura AUX_RGBImageRec e ho trovato cosa contiene al suo interno:
    codice:
    typedef struct _AUX_RGBImageRec {
        GLint sizeX, sizeY;
        unsigned char *data;
    } AUX_RGBImageRec;
    Per cui prima salvo sizeX e sizeY e poi tutto l'array data, quindi per rileggerlo leggo prima le dimensioni in modo da poter allocare l'array (sizeX * sizeY * 3) e poi tutte le sue locazioni. L'immagine finalmente è stata salvata grazie per l'aiuto

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.