Suche 16Bit Integer



  • Hallo,

    ich schreibe einen Delphi Code in C++ um. Dabei benötige ich einen Ersatz für den
    Datentyp "smallint" = 16bit Integer. Wenn ich "short" nehme, mach C++ einen
    32bit Integer daraus.
    Welchen Typ muß ich für einen 16bit Integer nehmen?

    Gruß Mario



  • Hallo

    Also bei meinem BCB 5 ist sizeof(short) = 2, d.h. 16bit.

    Ein int16 wird von meinem Builder jedenfalls nicht unterstützt, aber du kannst ja den WORD-Typ aus der WinAPI benutzen, der auf 2 Byte definiert.

    bis bald
    akari



  • Das Problem muss doch wo anders liegen.

    Ich habe folgende Struktur:

    #pragma pack(8)
      typedef struct {   // { K = Kreis, Kreisbogen; Größe: 44 Hex:2C }
        double y,x;
        double we,ws;  // { Endwinkel, Startwinkel }
        short int lb,lt;
        double r;      // { Radius }
      } RCaddyCircle;
    

    Diese Soll im Speicher so abgelegt werden:

    RCaddyCircle = { 100.0, 100.0, 360.0, 0.0, 0, 0, 10.0};
    

    Daraus sollte folgender Speicherauszug werden:

    y  = 00 00 00 00 00 00 59 40
    x  = 00 00 00 00 00 00 59 40
    we = 00 00 00 00 00 80 76 40
    ws = 00 00 00 00 00 00 00 00
    lb = 00 00
    lt = 00 00
    r  = 00 00 00 00 00 00 24 40
    

    Aber es wird so

    y  = 00 00 00 00 00 00 59 40
    x  = 00 00 00 00 00 00 59 40
    we = 00 00 00 00 00 80 76 40
    ws = 00 00 00 00 00 00 00 00
    lb = 00 00 00 00
    lt = 00 00 00 00
    r  = 00 00 00 00 00 00 24 40
    

    ersetze ich "lb" und "lt" in der Struktur durch ein einfaches "char"

    #pragma pack(8)
      typedef struct { // { K = Kreis, Kreisbogen; Größe: 44 Hex:2C }
        double y,x;
        double we,ws;  // { Endwinkel, Startwinkel }
        char t;        // short int lb,lt;
        double r;      // { Radius }
      } RCaddyCircle;
    

    wird im Speicher daraus:

    y  = 00 00 00 00 00 00 59 40
    x  = 00 00 00 00 00 00 59 40
    we = 00 00 00 00 00 80 76 40
    ws = 00 00 00 00 00 00 00 00
    t  = 00 00 00 00 00 00 00 00
    r  = 00 00 00 00 00 00 24 40
    

    ich benutze Cpp Builder 6

    WARUM?



  • Hallo

    Na weil du mit dem pragma(8) dem Compiler sagst das alles an 8 Byte ausgerichtet werden soll. Also füllt er den Speicher der Struktur so auf das die Gesamtbelegung bei einem Vielfachen von 8 liegt. Dein gewünschtes Layout hat aber 44 Byte, was nicht durch 8 teilbar ist.

    Und warum du zwei shorts (2x16bit) durch ein char (1x8bit) ersetzen willst ist mir unklar.

    bis bald
    akari



  • akari schrieb:

    Hallo
    Na weil du mit dem pragma(8) dem Compiler sagst das alles an 8 Byte ausgerichtet..

    Weil im Pascal-Code ein "RCaddyCircle = packed record" steht und ich irgendwo
    einmal gelesen hatte daß das im BCB einem "#pragma pack(8)" entsprechen soll.
    sch.... Fehlinfo.
    Da aber "#pragma pack(8)" Default ist, hat ein weglassen nichts gebracht, aber
    "#pragma pack(1)" bringt das gewünschte Ergebnis. 👍

    Und warum du zwei shorts (2x16bit) durch ein char (1x8bit) ersetzen willst ist mir unklar.

    ... War einfach nur ein Test, weil ich so eine Ahnung in Richtung "Ausrichten und Auffüllen" hatte.

    Vielen Dank
    Mario



  • Hallo

    Ach und noch eine Anmerkung : Diese Struct-Definition ist alter C-Stil

    typedef struct {...
      } RCaddyCircle;
    

    In C++ reicht das hier völlig aus :

    struct RCaddyCircle {...
      };
    

    bis bald
    akari



  • akari schrieb:

    Ein int16 wird von meinem Builder jedenfalls nicht unterstützt, ...

    Der Typ heißt ja auch __int16 🙂
    Den gibt es auch schon beim BCB5


Anmelden zum Antworten