Strukturgröße XE10 !=



  • Hallo zusammen,

    ich habe hier wieder lustiges RAD Studio 10 Phänomen. Ich möchte die member einer Struktur platzsparend auf Byte-Grenzen ausrichten und steuere das per Pragma Anweisung.

    #pragma option push -a1             // nur einkommentiert für CG2007
    #pragma option push -fpack-struct=1 // nur einkommentiert für Studio 10
    
    struct S
    {
       char  DummyC;
       short DummyS;
    };
    #pragma option pop
    
    int main()
    {
       int i = sizeof( Test );
    }
    

    Obiger Code liefert unter dem Codegear RAD Studio 2007 für i das Ergebnis 3 zurück, für das RAD Studio 10 (CLANG Toolchain bcc32c) allerdings 4.
    Im übrigen ist das RAD Studio 10 durch nichts dazu zu überreden, irgendwas auf Bytegrenzen auszurichten.

    Hat da jemand ne Idee?

    Edit:
    Mit #pragma pack( push,1) und #pragma pack( pop ) funktionierts. Dämlich,dass der Compiler #pragma Anweisung kommentarlos schluckt, die er anscheinend nicht versteht. Ich frage mich langsam wirklich, ob und was bei Embarcadero getestet wird. Wenn man alle 6 Monate ein neues Major Release auf den Markt wirft scheint für Tests nicht mehr viel Zeit zu bleiben.



  • Probiers mal mit #pragma pack(1)
    Aber wozu soll das gut sein?



  • Das kommt aus einer Zeit, wo 50MB Festplatten noch groß waren. Wir haben ein Dateiformat, das Strukturen blockweise in Dateien schreibt und auch heute wieder gelesen werden möchten.



  • DocShoe schrieb:

    .... Dämlich,dass der Compiler #pragma Anweisung kommentarlos schluckt, die er anscheinend nicht versteht. Ich frage mich langsam wirklich, ob und was bei Embarcadero getestet wird. Wenn man alle 6 Monate ein neues Major Release auf den Markt wirft scheint für Tests nicht mehr viel Zeit zu bleiben.

    http://www2.informatik.uni-halle.de/lehre/c/c_pragma.html

    Zitat:
    "Ein Pragma weist den Compiler an, die durch die Pragma-Direktive bezeichnete (implementationsspezifische) Operation auszuführen.
    Ihm nicht bekannte Pragmas sollte der Präprozessor ignorieren. "



  • DocShoe schrieb:

    Dämlich,dass der Compiler #pragma Anweisung kommentarlos schluckt, die er anscheinend nicht versteht.

    Wie Burkhi dachte ich, das wäre bei #pragma-Anweisungen normal. Versuche mal, -WEverything zu übergeben, dann solltest du eine Warnung sehen. (Jetzt mal angenommen, daß bcc32c dasselbe CLI wie Clang hat.)



  • Seltsam... ich könnte schwören, ich hätte mal Fehlermeldungen wie "Unbekannte #pragma Anweisung ..." bekommen. Naja, egal.
    Verbessern tut das meinen Eindruck Embarcadero allerdings nicht. Wir arbeiten jetzt seit drei Wochen mit dem RAD Studio 10 und haben schon zwei dicke Bugs gefunden, bei denen wir uns fragen, wie die unbemerkt geblieben sind.
    Die Ausrichtung auf Byte-Grenzen hat früher zumindest per #pragma push -a1 funktioniert, aber die einzige Möglichkeit beim BCC32c geht über die #pragma pack Anweisung. Die Einstellungen im Projekt werden ignoriert, genauso wie die in der Hilfe beschriebenen #pragma Anweisungen -a1 bzw. -fpack-struct=1 .



  • Meine ganzen Consolenanwendungen vom XE6 werden fehlerfrei vom 10er kompiliert, laufen auch auf dem Dev System -> auf anderen Systemen als Standalone = instant crash. Wieder im XE 6 als Standalone kompiliert, auf anderen Systemen alles top. Die Standalone EXE, mit dem XE10 kompiliert, ist auch gute 400kb kleiner. Also scheint der Bugfix vom Update 1 wohl nicht in allen Fällen zu helfen. Morgen werde ich mal die Borland Memory Management dll mitkopieren und mal sehen obs geht...dann kann ich wenigstens einen gescheiten Bugreport im EDN posten.

    In Summe, totales Schrottrelease salopp gesagt.


Log in to reply