Probleme mit neuem Typ



  • Hallo!

    Ich arbeite auf einer Datei (OS: Taschenrechner Texas Instr. 200, Compiler :TIGCC) mittels eines Arrays char file[].

    Ich habe einen neuen Datentyp namens HSC erstellt.

    typedef struct hsc
      {
      	unsigned char name[12];
      	unsigned short int punkte;
      } HSC;
    

    Diesen verwende ich sozusagen als "Lochraster" um im Speicher(in der Datei) Daten immer auf die richtige Stelle platzieren zu können.
    Nun es es so: Auf Stellen 0-11 befindet sich der String name samt String-Beender '\0'. (Gibts für das '\0' einen "Fachausdruck"?)
    Auf den Stellen 12-13 müsste sich der int punkte befinden.(2 bytes auf dem Taschenrechner).
    Nun ist es aber so: Der Integer befindetsich auf Stelle 14, also auf (int)file[13]!!! Der Typ HSC braucht aber nur 14 byte laut sizeof() [12byte string+2 byte int]. Der int punkte müsste auf (int)file[12] zu finden zu sein!

    Was hats da???

    Grüße,
    Harri



  • struct werden (damit sie besser adressiert werden können) häufig durch den Compiler auf "ganze" Bytes aufgefüllt. Damit du auf punkte zugreifen kannst, als wären
    sie in deinem array, erweitere dein struct um zwei padding-bytes.

    typedef struct hsc
      {
          unsigned char name[12];
          unsigned short int punkte;
          char padding1;
          char padding2;
      } HSC;
    

    Aber warum greifst du nicht einfach direkt auf punkte zu?

    Edit:

    typedef struct hsc
      {
          unsigned char name[12];
          unsigned short int punkte;
          char padding1;
          char padding2;
      } HSC;
    
    int main(int argc, char** argv)
    {
         hsc h;
    
         h.punkte = 0x0A02;
    
         printf("%d %d", h.name[12], h.name[13]); // Ausgabe 2 10
    
         return 0;
    }
    


  • Danke für die AW.

    Mit dem padding chars gehts leider auch nicht.
    Was mich ja verwundert, ist, dass das struct(ohne paddings) eine Länge von 14 hat und trotzdem erst im 14. Byte mit der Zahl beginnt. Es wird also 1 Byte vor der Zahl ausgelassen!?

    Ich glaube ich werde mal bei den Compilerentwicklern nachfragen, vielleicht wissen die warum das so ist.

    In dem Fall kann ich leider nicht mittels struct zugreifen, ich muss es eben byte-weise machen.

    Grüße,
    Harri



  • Warum keine padding-Bytes?

    Ansonsten noch Alternativen:
    Schau mal in deine Compiler-Doku nach, wie man die Speicherung von structs
    beeinflussen kann.
    Wenn du Byteweise auf deinen unsigned short zugreifen willst, geht noch folgendes:

    union my_union {
      unsigned short s;
      unsigned char c[2];
    }
    
    union foo;
    foo.s = 0x0A02;
    unsigned char x = foo.c[0];
    unsigned char y = foo.c[1];
    

    Oder benutz einfach Bitshifts.



  • <<Warum keine padding-Bytes? >>

    Doch, hab ich eh verwendet, aber es hat nicht funktioniert.

    Ich werds mir am WE nochmal genauer ansehen.
    Ich hab außerdem jetzt einen Weg gefunden, wie ich es doch direkt über das struct machen kann.

    Aber interessieren würds mich trotzdem warum der int auf der falschen Stelle zu finden ist! Sollte ich beim Compilerentwickler erfragen, werd ichs natürlich hierher schreiben.

    Grüße,
    Harri



  • warum liest du dann nich einfach 14 bytes als char array ein...und verarbeitest die letzten beiden ausserhalb mit ner union und nem short....

    bye

    tt



  • So hätts funktioniert:

    *(unsigned int*)(file+12)
    

    Zuerst dereferenzieren, und erst dann casten und darauf zeigen.

    Grüße,
    Harri


Anmelden zum Antworten