C: byte di padding

di il
28 risposte

28 Risposte - Pagina 2

  • Re: C: byte di padding

    E' da correggere solo la prima parte ... devi indicare la variabile che usi per la struttura passandola per indirizzo
  • Re: C: byte di padding

    Quindi, nel caso di struct struttura s, devo scrivere &s? Grazie a tutti per la disponibilità!
  • Re: C: byte di padding

    Scusatemi, ma ancora non mi torna
  • Re: C: byte di padding

    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;}
    
    
    
    
  • Re: C: byte di padding

    
    #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;
      }
    
    
  • Re: C: byte di padding

    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...???
  • Re: C: byte di padding

    Non ho scritto le funzioni, scusate, Ho messo fseek(fp, 2, 1) dopo c3 e c4
  • Re: C: byte di padding

    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.
  • Re: C: byte di padding

    Quindi va di 8 in 8? Non di 4 in 4?
  • Re: C: byte di padding

    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.
  • Re: C: byte di padding

    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
  • Re: C: byte 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;
    }
    
    
  • Re: C: byte di padding

    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?
  • Re: C: byte di padding

    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