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

    [C] Problema lettura da file

    Ho un certo codice che legge l'intestazione di un file bitmap e stampa le informazioni a schermo.
    Il problema è che se leggo i campi della struttura uno ad uno funziona:
    codice:
    /*1 caso: Funziona*/
    fread(&bmp->header.type, sizeof(short), 1, bmp_file);
    fread(&bmp->header.size, sizeof(int), 1, bmp_file);
    fread(&bmp->header.reserved1, sizeof(short), 1, bmp_file);
    fread(&bmp->header.reserved2, sizeof(short), 1, bmp_file);
    fread(&bmp->header.offset, sizeof(int), 1, bmp_file);
    
    fread(&bmp->infoHeader.InfoHeader_size, sizeof(int), 1, bmp_file);
    fread(&bmp->infoHeader.width, sizeof(int), 1, bmp_file);
    fread(&bmp->infoHeader.height, sizeof(nt), 1, bmp_file);
    fread(&bmp->infoHeader.bitPlanes, sizeof(short), 1, bmp_file);
    fread(&bmp->infoHeader.bitCount, sizeof(short), 1, bmp_file);
    fread(&bmp->infoHeader.compressionType, sizeof(int), 1, bmp_file);
    fread(&bmp->infoHeader.ImageData_size, sizeof(int), 1, bmp_file);
    fread(&bmp->infoHeader.hPixelPerMeter, sizeof(int), 1, bmp_file);
    fread(&bmp->infoHeader.vPixelPerMeter, sizeof(int), 1, bmp_file);
    fread(&bmp->infoHeader.numberOfColors, sizeof(int), 1, bmp_file);
    fread(&bmp->infoHeader.numberOfImportantColors, sizeof(int), 1, bmp_file);
    se invece leggo tutto con una fread, mi sballa i valori:
    codice:
    /*2 caso: Non funziona*/
    fread(&bmp->header, sizeof(BMP_Header), 1, bmp_file);
    fread(&bmp->infoHeader, sizeof(BMP_InfoHeader), 1, bmp_file);
    Le strutture sono dichiarate come:
    codice:
    typedef struct{
    	
    	short type;
    	int size;
    	short reserved1;
    	short reserved2;
    	int offset;
    
    }BMP_Header;
    
    typedef struct {
    	
    	int InfoHeader_size;
    	int width;
    	int height;
    	short bitPlanes;
    	short bitCount;
    	int ImageData_size;
    	int compressionType;
    	int hPixelPerMeter;
    	int vPixelPerMeter;
    	int numberOfColors;
    	int numberOfImportantColors;
    
    }BMP_InfoHeader;
    
    typedef struct {
    	
    	BMP_Header header;
    	BMP_InfoHeader infoHeader;
    	
    }BMP;
    L'output nel primo caso (funzionante) è:
    codice:
    TotalSize: 60
    Size: 16
    FileSize: 332374
    Type: 19778
    Reserved Bytes: 0 0
    Offset: 54
    ------------BMP_InfoHeader----------
    Size: 40
    Info Header Size: 40
    Width: 330
    Height: 335
    BitPlanes: 1
    BitCount: 24
    Compression Type: 0
    Size of Image Data: 332320
    Horizontal Pixel Per Meter: 12008
    Vertical Pixel Per Meter: 12008
    Number Of Used Colors: 0
    Number Of Important Used Colors: 0
    che è corretto.
    Nel secondo caso (non funzionante); è:
    codice:
    TotalSize: 56
    Size: 16
    FileSize: 5
    Type: 19778
    Reserved Bytes: 0 54
    Offset: 0
    ------------BMP_InfoHeader----------
    Size: 40
    Info Header Size: 21626880
    Width: 21954560
    Height: 65536
    BitPlanes: 24
    BitCount: 0
    Compression Type: 786956293
    Size of Image Data: 304087040
    Horizontal Pixel Per Meter: 786956288
    Vertical Pixel Per Meter: 0
    Number Of Used Colors: 0
    Number Of Important Used Colors: 826146816
    Perchè ?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    E' un problema di allineamento delle strutture in memoria (per default molti compilatori allineano a 32 bit, quindi 4 byte) e dato che la prima struttura e' di 14 byte, ne aggiungono 2 dummy per renderla di 16 byte ...

    Puoi forzare tu l'allineamento indicando che venga fatto a 2 o 1 byte (va bene comunque nel tuo caso) con la direttiva

    #pragma pack (2)

    oppure

    #pragma pack (1)

    se prevista dal tuo compilatore o con un apposito switch (sempre dipendente dal compilatore) ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Ho risolto, per fortuna gcc supporta # pragma pack.
    Questo problema mi è veramente nuovo -.-

    Grazie


  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da menphisx
    Questo problema mi è veramente nuovo -.-
    C'e' sempre qualcosa di nuovo ...

    Grazie
    Di nulla ...
    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.