Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    278

    [C] posizione puntatore dopo una struct

    Sto ceercando di capire la posizione del puntatore, ma il risultato stampato a video, mi sorprende:
    codice:
    #include <stdio.h>
    #include <stdint.h>
    //dichiarazione variabili e puntatori
    FILE *fp;
    fpos_t *posizione;
    long t;
    //funzione swap big endian --> little Endian per valori di 16 bit
    uint32_t swap32(uint32_t f)
    {
    f = ((f>>24)&0xff) | ((f<<8)&0xff0000) | ((f>>8)&0xff00) |  ((f<<24)&0xff000000 );
    }
    uint16_t swap16(uint16_t x)
    {
        x = (x>>8) | (x<<8);
    }
    //struct per file midi
    struct intestazione
    {
    uint32_t header;
    uint32_t lunghezza;
    uint16_t formato;
    uint16_t numerotracce;
    uint16_t tempo;
    };
    struct intestazione ise;
    
    main()
    {
    fp=fopen("formato.mid","rb");
    	fread(&ise,sizeof(ise),1,fp);
    	t=ftell(fp);
    	printf("posizione: %ld",t);
    fclose(fp);
    }
    Perché mi stampa posizione 16?!
    2 uint da 32 3 da 16 non dovrebbe stampare 14?!

    Ho intuito che è un problema di dimensione. Cioè ho capito che stampa 16 perché è legato ad una dimensione minima che può leggere, ma non ho ben capito qual è la regola.
    Qual è la spiegazione corretta?

    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Originalmente inviato da stejano
    Qual è la spiegazione corretta?
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

    The function fread() reads nmemb elements of data, each size bytes
    long, from the stream pointed to by stream, storing them at the loca-
    tion given by ptr.
    Puoi leggere al massimo sizeof(ise) quindi 16 bytes. Se il file formato.mid contiene meno di 16 caratteri (bytes), ftell tornerà tale numero/posizione dello stream (ossia nbytes +1), ma dovuto alla fread non può andare oltre i 16 bytes..

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    278
    Ma perché 16?! la struct non è di dimensione 14?!

    2 uint32 sono 8 byte

    3 uint16 non sono 2 2 2 = 6 byte

    8+6=14.

    In questo calcolo secondo me non tengo in considerazione qualcosa. Ma non capisco cosa.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non consideri i 2 byte di padding che il compilatore introduce per mantenere l'allineamento della struttura.
    codice:
    |---------| // uint32
    |---------| // uint32
    |----|----| // due uint_16
    |----|----| // un uint_16 con 2 byte di padding
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    278
    Ah ok non conoscevo questo allinemaneto dei dati da parte del processore. Ok allora ci sbatto dentro un pragma pack e risolvo.

    Mille grazie!!!

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.