structs und alignment



  • hy there

    folgendes, ich habe ein struct mit 3x 2byte variablen und 2x 4byte variablen, was zusammen eine gesamtgröße von 14 byte macht...der compiler vergrößert das aber auf 16 (wegen 4byte alignment), nun möchte ich die struktur in einem lesedurchgang auffüllen (sprich nur ein fread mit sizeof(die struktur)...was genau passiert dann? ich lese doch 2 bytes zu weit oder?

    bye

    tt



  • Ich vermute das es schief geht, er wird 16 Byte lesen.

    Wenn du die Daten vorher mit Fwrite - selber Compiler selbes Alignment- geschreiben hasst, sollte es aber kein Problem seín da er dann auch 16 byte schreibt.
    Wenn du die 2 Byte einsparen willst bleibt dir nichts anders übrig als die Sachen Itemweise 3*2Byte und 2 * 4 Byte zu schreiben und zu lesen.

    Wenn die Daten von einem anderen Compiler, oder mit anderem Alignment geschrieben werden, weist du nicht wie sie angelegt werden, und fällst voraussichtlich auf den Bauch. Da nicht bekannt ist an welcher Stelle das Alignment setzt.
    2 möglche Beispile für Alignment:
    W1,W2,W3,Align,DW1,DW2
    W1,W2,W3,DW1,DW2,Align

    Für solche Interface ist es besser die Datenstruktur zu definieren als sich auf Compiler zu verlassen, frei nach dem Motto ein Datensatz im File sieht wie folgt aus:
    W1,W2,W3,DW1,DW2
    Die Datensätze folgen unmittelbar aufeinander.
    Die Daten sind im Little oder Big Endian Format geschrieben.

    Vielleicht kannst du unter leichten Perfomance Verlusten auch eine packed struct benutzen, lies das mal in der Hilfe des Compilers nach



  • ja nee, es ging ums einlesen eines bitmap headers 🙂 ich seh immer haufenweise tutoriale wo die das in einem rutsch einlesen die scheinen nie probs damit zu haben 😉 ausser mir *gg* naja ich geh lieber auf nummer sicher und lese das itemweise ein 🙂 soviel performance geht ja nich verloren...is bloß ein header, die bilddaten les ich auf einmal :)und die machen ja den größten anteil an den bilddaten aus 🙂

    thx for help

    bye there

    tt


Anmelden zum Antworten