Eigenen Datentypen mit selbstdefinierter Speichergröße ist das möglich?



  • Hallo, ist es möglich in ansi C einen eigenen binären Datentypen zu entwerfen und eine feste Größe zu definieren?

    Die Standardtypen haben ja ihre fest vorgegebene Größe, aber wenn ich Beispielsweise eine Mischung aus long long und long haben möchte, (48Bit) ist das dann möglich?



  • feste groesse ist immer etwas doof, weil es ja alignment probleme gibt wo man gerne ein paar padding bytes eingepackt bekommt.

    aber lies dir mal das durch: http://www.cs.cf.ac.uk/Dave/C/node13.html - den abschnitt über bitfields. das ist uU genau das was du willst.



  • Hm, ich hab genau heute in nem Buch über assembler gelesen, wie das mit Strukturen in C aussieht.

    Das mit den Bitfeldern würde funktionieren, wenn der compiler diese nicht null-bytes "paddet" also füllt. Dies wird gemacht, damit du schneller darauf zugreifen kannst.

    Ich glaub da gibts einige Compilerabhängige befehle, wie man das abstellen kann. Ein beispiel (nicht von mir, sondern direkt aus dem Buch)

    http://www.drpaulcarter.com/pcasm/pcasm-book-pdf.zip schrieb:

    #define MS OR BORLAND (defined( BORLANDC ) \
                                 || defined ( MSC VER)) 
     
    #if MS OR BORLAND 
    # pragma pack(push)
    # pragma pack(1)
    #endif
    
    struct SCSI read cmd {
    
       unsigned opcode : 8;
       unsigned lba msb : 5;
       unsigned logical unit : 3; 
       unsigned lba mid : 8;  /* middle bits */
       unsigned lba lsb : 8;
       unsigned transfer length : 8;
       unsigned control : 8;
     }
    
     #if defined ( GNUC )
          attribute (( packed))
     #endif
     ;
    
     #if MS OR BORLAND
     # pragma pack(pop)
     #endif
    

    Das Buch ist übrigens auch für nicht Assembler- programmierer zu empfehlen. Da wird einem einiges Klar was man nur durch C alleine nur schwer lernt.



  • Hallo, danke für die Information. Das mit den Paddingbytes ist ja so, dass man versucht auf eine gerade Startadresse zu kommen, aber wieso ist es denn langsamer wenn die Startadresse ungerade ist?



  • jeschki schrieb:

    ...aber wieso ist es denn langsamer wenn die Startadresse ungerade ist?

    angenommen du hast einen reinen 32-bitter und möchtest auf eine ungerade adresse zugreifen:

    char c = *(char*)3;
    

    würde der compiler das 1:1 übersetzen, könnte das einen 'bus error' auslösen, weil die cpu 4-byte aligned arbeitet.
    deshalb erzeugt ein c-compiler für diese cpu code, der 4 bytes (in einem zugriff) von adresse 0 liest und sich das ergebnis zurechtshiftet. das kostet etwas zeit.
    anderer fall - die maschinensprache deines 32 bitters erlaubt es tatsächlich, bytes von ungeraden adressen lesen. hierbei werden trotzdem 4 bytes eingelesen, aber die shifterei passiert im prozessor selber, was einige wenige taktzyklen länger dauern kann, als zugriffe auf 4-bytes aligned adressen.
    🙂



  • Eigener Datentyp selbstdefinierter Speichergröße:

    typedef char MyType[100];

    Typ: MyType
    Größe: 100 Byte



  • Ja das ist richtig, aber ein Feld ist immer noch 8 Bit groß, wenn mir Beispielsweise 1 Bit reichen würde... Und bei der Variante besteht doch meines Wissens auch das Problem mit den Paddingbytes?!



  • jeschki schrieb:

    Ja das ist richtig, aber ein Feld ist immer noch 8 Bit groß, wenn mir Beispielsweise 1 Bit reichen würde... Und bei der Variante besteht doch meines Wissens auch das Problem mit den Paddingbytes?!

    Datentypen unter einem Byte wirst du nicht anlegen können (jedenfalls nicht elemantar).


Anmelden zum Antworten