C: byte di padding

di Anonimizzato21674 il
28 risposte

28 Risposte - Pagina 2

  • E' da correggere solo la prima parte ... devi indicare la variabile che usi per la struttura passandola per indirizzo
  • Quindi, nel caso di struct struttura s, devo scrivere &s? Grazie a tutti per la disponibilità!
  • Scusatemi, ma ancora non mi torna
  • Codice di scrittura

    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct struttura {
     float a;
      double b;
      char c1, c2, c3;
      short int d;
      char c4;
      long int e;
     };
     
     int main() {
    FILE *fp;
      fp = fopen("es17.dat", "w");
      struct struttura s;
      
      printf("inserisci float: ");
      scanf("%f", &s.a);
      printf("inserisci double: ");
      scanf("%f", &s.b);
        printf("inserisci char: ");
      scanf("%c", &s.c1);
      getchar();
       printf("inserisci char: ");
      scanf("%c", &s.c2);
      getchar();
      printf("inserisci char: ");
      scanf("%c", &s.c3);
     getchar();
      printf("inserisci short int: ");
      scanf("%hd", &s.d);
      printf("inserisci char: ");
      scanf("%c", &s.c4);
      printf("inserisci long int: ");
      scanf("%ld", &s.e);
    
    fwrite(&s, sizeof(struct struttura), 1, fp);
    
    fclose(fp);
    
    return 0;}
    
    
    
    
  • 
    #include <stdio.h>
    #include <stdlib.h>
    
     float a;
      double b;
      char c1, c2, c3;
      short int d;
      char c4;
      long int e;
     
     
     int main() {
    FILE *fp;
      fp = fopen("es17.dat", "w");
      
      float a;
      double b;
      char c1, c2, c3;
      short int d;
      char c4;
      long int e;
      
      fread(&a, sizeof(float), 1, fp);
      printf("a: %f\n", a);
      fread(&b, sizeof(double), 1, fp);
      printf("b: %f\n", b);
      
      //in modo analogo per tutti gli altri elementi
      ... 
      
      Fclose(fp);
      return0;
      }
    
    
  • Ma scusa: eri partito bene considerando il padding della struttura ( anche se i conti erano sbagliati) e ora posti un codice dove non li consideri nemmeno di striscio...???
  • Non ho scritto le funzioni, scusate, Ho messo fseek(fp, 2, 1) dopo c3 e c4
  • Come ti ho già scritto nel mio post precedente, i tuoi conti sul padding non sono corretti:
    
    sizeof(struct struttura): 32
    a : 0x7ffde9dc6bf0
    b : 0x7ffde9dc6bf8
    c1: 0x7ffde9dc6c00
    c2: 0x7ffde9dc6c01
    c3: 0x7ffde9dc6c02
    d : 0x7ffde9dc6c04
    c4: 0x7ffde9dc6c06
    e : 0x7ffde9dc6c08
    
    Hai un double ad inizio struttura, che viene allineato a 8 bytes.
  • Quindi va di 8 in 8? Non di 4 in 4?
  • Ti ho scritto tutti gli indirizzi delle variabili della struttura, dovresti riuscire a fare un pio di conti da solo... E puoi provare il codice che ti ho postato sulla tua macchina per verificare gli indirizzamenti.
  • Scusate se rispondo solo adesso. Innanzitutto la dimensione della struttura mi risulta essere pari a 24 (non 32). Poi, gli indirizzi degli elementi della struct sono:
    
    a: 0xbff94f44
    b: 0xbff94f48
    c1: 0xbff94f50
    c2: 0xbff94f51
    c3: 0xbff94f52
    d: 0xbff94f54
    c4: 0xbff94f56
    e: 0xbff94f58
    
    Ciò significa che:
    - tra a e b ho 4 byte, corrispondenti alla dimensione di a
    -tra b e c1 ho 2 byte.. E qui non mi torna.. Non dovrebbero essere 8?
    -per i char ho 1 byte, tutto ok
    -tra c3 e d ho 2 byte, uno corrispondente alla dimensione di c3 e uno di padding
    -tra d e c4 ho 2 byte, tutto ok
    -tra c4 e e ho 2 byte, uno per c4 e uno di padding
  • Ecco qua.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    
    struct S
    {
        float a;
        double b;
        char c1, c2, c3;
        short int d;
        char c4;
        long int e;
    };
    
    int main() {
    
        FILE *fp;
    
        float a = 1;
        double b = 2;
        char c1 = 'a', c2 = 'b', c3 = 'c';
        short int d = 3;
        char c4 = 'd';
        long int e = 4;
    
        S s = {11.f, 22., 'A','B','C', 33, 'D', 44l};
    
    
        printf("Writing ...\n");
    
        fp = fopen("es17.dat", "w");
    
        fwrite(&a, sizeof(float), 1, fp);
        printf("a: %f\n", a);
    
        fwrite(&b, sizeof(double), 1, fp);
        printf("b: %f\n", b);
    
        fwrite(&c1, sizeof(char), 1, fp);
        printf("c1: %c\n", c1);
    
        fwrite(&c2, sizeof(char), 1, fp);
        printf("c2: %c\n", c2);
    
        fwrite(&c3, sizeof(char), 1, fp);
        printf("c3: %c\n", c3);
    
        fwrite(&d, sizeof(short int), 1, fp);
        printf("d: %hd\n", d);
    
        fwrite(&c4, sizeof(char), 1, fp);
        printf("c4: %c\n", c4);
    
        fwrite(&e, sizeof(long int), 1, fp);
        printf("e: %ld\n", e);
    
        fwrite(&s, sizeof(S), 1, fp);
        printf("a: %f\n", s.a);
        printf("s: %ld\n", s.e);
    
        fclose(fp);
    
        printf("... done\n");
    
        printf("Reading ...\n");
    
        fp = fopen("es17.dat", "r");
    
        fread(&a, sizeof(float), 1, fp);
        printf("a: %f\n", a);
    
        fread(&b, sizeof(double), 1, fp);
        printf("b: %f\n", b);
    
        fread(&c1, sizeof(char), 1, fp);
        printf("c1: %c\n", c1);
    
        fread(&c2, sizeof(char), 1, fp);
        printf("c2: %c\n", c2);
    
        fread(&c3, sizeof(char), 1, fp);
        printf("c3: %c\n", c3);
    
    //    fseek(fp, 2, 1);            //sposto il puntatore di 2 byte dalla posizione corrente(va alla casella 17)
    
        fread(&d, sizeof(short int), 1, fp);
        printf("d: %hd\n", d);
    
        fread(&c4, sizeof(char), 1, fp);
        printf("c4: %c\n", c4);
    
    //    fseek(fp, 2, 1);           //casella 21
    
        fread(&e, sizeof(long int), 1, fp);
        printf("e: %ld\n", e);
    
        fread(&s, sizeof(S), 1, fp);
        printf("a: %f\n", s.a);
        printf("s: %ld\n", s.e);
    
        fclose(fp);
    
        printf("... done\n");
    
        return 0;
    }
    
    
  • Grazie mille!!
    Però spostando il puntatore di due caselle non torna, cosa che accade se lo sposto solo di una. Ciò significa che, dopo aver letto un numero di byte, il puntatore va direttamente alla casella successiva?
  • Guarda che è esadecimale ... tra 48 e 50 non ci sono 2 byte ma 8 byte ...
Devi accedere o registrarti per scrivere nel forum
28 risposte