Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   I wonder why (https://www.delphipraxis.net/161789-i-wonder-why.html)

ATS3788 20. Jul 2011 22:28

I wonder why
 
Delphi-Quellcode:
type
  SCSI_PASS_THROUGH_DIRECT = record
    Length             : Word;
    ScsiStatus         : Byte;
    PathId             : Byte;
    TargetId           : Byte;
    Lun                : Byte;
    CdbLength          : Byte;
    SenseInfoLength    : Byte;
    DataIn             : Byte;
    DataTransferLength : ULONG;
    TimeOutValue       : ULONG;
    DataBuffer         : Pointer;
    SenseInfoOffset    : ULONG;
    Cdb                : Array[0..15] of Byte;
  end;

  SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER = record
    Spt     : SCSI_PASS_THROUGH_DIRECT;
    Filler  : ULONG;
    SenseBuf : Array[0..31] of Byte;
  end;

var
a : Konstanten.SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER; //// 77 byte sizeof
b : Laufwerke.SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER; //// 80 byte sife of
Nun sitze ich hier und frage mich, verstehe ich nichts mehr
bei SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER
sizeof sollte 77 byte rauskommen was für die Anwendung
leider falsch ist es sollten 80 byte sein.

die Version a ist in einer externen unit
die Version b ist in der Version von delphi praxis
wo ich leider die Referenz nicht mehr finde

die frage wo kommen die 3 byte unterschied her.

ps

ich hoffe ich bin verständlich
ich bin gefrustet und nicht mehr ganz nüchtern

Uwe Raabe 20. Jul 2011 22:41

AW: I wonder why
 
Die ersten acht Felder im SCSI_PASS_THROUGH_DIRECT belegen zusammen 9 Byte. Wenn das Align auf 4 Byte gestellt ist, wird der nachfolgende ULONG auf die nächste 4-Byte-Grenze gesetzt (= 12). Das sind deine zusätzlichen 3 Byte.

Mit der Direktive {$A4} wird der record 80 Byte haben, während er mit {$A1} 77 Byte hat.

himitsu 20. Jul 2011 22:46

AW: I wonder why
 
Tipp/Suchworte:
Data Alignment / Speicherausrichtung
packed record



Damit wirst'e hier im Forum und sonstwo im Netz alles finden.

http://de.wikipedia.org/wiki/Speicherausrichtung

fkerber 20. Jul 2011 22:51

AW: I wonder why
 
Hi,

wähle bitte für deinen Thread auch noch einen Titel, an dem man zumindest erahnen kann, worum es geht.


LG, Frederic

EWeiss 21. Jul 2011 05:04

AW: I wonder why
 
Vielleicht ein Wonderwoman Thread ? :)

gruss

ATS3788 23. Jul 2011 08:05

AW: I wonder why
 
Wow ihr seit gut Danke.
Ganz verstanden habe ich das nicht.
Muss mir das mal in aller Ruhe anschauen.:stupid:

PS

Ihr habt ja recht nur ich dachte dafür gibt es eh
keine Antwort und ich war angeschwippst

himitsu 23. Jul 2011 08:11

AW: I wonder why
 
Zitat:

Zitat von ATS3788 (Beitrag 1113127)
nur ich dachte dafür gibt es eh keine Antwort und ich war angeschwippst

Das mußt du doch langsam gemerkt haben ... wir haben auf alles eine Antwort.
(nur auf einige Fragen, wie z.B. nach dem Sinn des Lebens, behalten wir Die für uns :twisted:)

don't drink and prog

ATS3788 23. Jul 2011 12:37

Data Alignment / Speicherausrichtung /packed record
 
Zitat:

Mit der Direktive {$A4} wird der record 80 Byte haben, während er mit {$A1} 77 Byte hat.
OK {$A1} ist ein packed Record

Ich verstehe noch nicht ganz wie man auf die Compiler
Direktiven kommt. Kann ich das wo nachlesen.

ATS3788 23. Jul 2011 12:39

AW: I wonder why
 
Zitat:

Anmerkungen

Die Direktive $A steuert die Ausrichtung von Feldern in Record-Typen und Klassenstrukturen.

Im Status {$A1} oder {$A-} werden Felder nicht ausgerichtet. Alle Records und Klassenstrukturen werden gepackt.

Im Status {$A2} werden die ohne den Bezeichner packed deklarierten Felder in Record-Typen und die Felder in Klassenstrukturen auf Wortgrenzen ausgerichtet.

Im Status {$A4} werden die ohne den Bezeichner packed deklarierten Felder in Record-Typen und die Felder in Klassenstrukturen auf Doppelwortgrenzen ausgerichtet.

Im Status {$A8} oder {$A+} werden die ohne den Bezeichner packed deklarierten Felder in Record-Typen und die Felder in Klassenstrukturen auf Vierfachwortgrenzen ausgerichtet.

Die Ausrichtung von Feldern in Record-Typen wird in der Delphi-Sprachreferenz beschrieben.

Variablen und typisierte Konstanten werden unabhängig von der Direktive $A immer für einen optimalen Zugriff ausgerichtet. Der Status {$A8} beschleunigt die Ausführung.
OK habe es jetzt verstanden Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz