Pointerarithmetik

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Pointerarithmetik

Beitrag von Heinrich Wolf »

Hallo,

ich brauche die Teil-Länge eines record. Wie krieg ich das warnungsfrei compiliert?

Code: Alles auswählen

type
  tExifHeader       = packed record
    SOIMarker       : Byte;
    SOI             : Byte;
    App1Marker      : Byte;
    App1            : Byte;
    App1Length      : Word;     { SwapWord nötig }
    Exif            : Array[0 .. 4] of char;
    Null            : Byte;     { 0 }
    ByteAlign       : Array[0 .. 1] of char;
    TagMark         : Word;     { evtl SwapWord     nötig je nach ByteAlign }
    IFD0Offset      : LongWord; { evtl SwapLongWord nötig je nach ByteAlign }
    IFD0EntryCount  : Word;     { evtl SwapWord     nötig je nach ByteAlign }
  end;
 
var
  Header : tExifHeader;
  Offset : LongWord;
begin
  Offset := LongWord(@Header.ByteAlign) - LongWord(@Header); // hier gibt es zwei Warnungen für den Cast
end;
int64 statt LongWord macht es eher schlechter. Gibt es in fpc 2.5.1 ein unsigned int64?

Vielen Dank im Voraus
Heiner

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Pointerarithmetik

Beitrag von Heinrich Wolf »

unsigned int64 ist QWord. Aber damit geht die Warnung auch nicht weg:
Warning: Conversion between ordinals and pointers is not portable

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Pointerarithmetik

Beitrag von MAC »

meinst du mit teil-länge , die anzahl an byte die der Record verbraucht ???

wie z.B

Code: Alles auswählen

Form1.Caption:= InttoStr(sizeof(integer));    
// oder bei dir
Form1.Caption:= InttoStr(sizeof(tExifHeader));

Code: Alles auswählen

Signatur := nil;

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Pointerarithmetik

Beitrag von Christian »

Der Record hat doch soweit ich seh keine Datentypen die in ihren längen variieren oder ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Pointerarithmetik

Beitrag von Teekeks »

Sonst ginge ja auch packed nicht :)

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Pointerarithmetik

Beitrag von Heinrich Wolf »

Hallo,

danke erst mal für die Kommentare.

Ja, ich meine die Länge in Bytes. Der Offset soll die Byte Position von ByteAlign innerhalb des record sein. Wenn ich sizeof() verwenden würde, müsste ich alle relevanten record Datenfelder aufsummieren. Das geht schief, wenn ich ein Datenfeld vergesse. Wenn ich Datenfelder einfüge oder lösche, muss ich auch die Addition ändern.

Heiner

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Pointerarithmetik

Beitrag von indianer-frank »

Genau für solche Sachen gibt es den Typ PtrUInt, also:

Code: Alles auswählen

Offset := PtrUInt(@Header.ByteAlign) - PtrUInt(@Header);
Vergleiche FPC RTL-Doku:
PtrUInt = DWord;

PtrUInt is an unsigned integer type which has always the same size as a pointer. When using integers which will be cast to pointers and vice versa, use this type, never the regular Cardinal type.

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Pointerarithmetik

Beitrag von Heinrich Wolf »

Vielen Dank!

PtrUInt kannte ich noch nicht. Das ist genau das, was ich brauche.

Heiner

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Pointerarithmetik

Beitrag von Heinrich Wolf »

Hmm,

mit PtrUInt kommt immer noch dieselbe Warnung, obwohl PtrUInt genau für diesen Zweck gedacht ist. Es gibt einen Bug Report dazu, der abgeschmettert wurde, was m.E. unverständlich ist. Da hätte es keinen PtrUInt Datentyp gebraucht. QWord oder LongWord hätte es auch getan.
http://bugs.freepascal.org/view.php?id=19582

Heiner

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Pointerarithmetik

Beitrag von indianer-frank »

Heinrich Wolf hat geschrieben:Hmm,

mit PtrUInt kommt immer noch dieselbe Warnung, obwohl PtrUInt genau für diesen Zweck gedacht ist. Es gibt einen Bug Report dazu...
Da kommen keine Warnungen sondern Hints (wie auch im Bugreport beschrieben). Hints schalte ich (im Gegensatz zu Warnungen) normalerweise aus.

Antworten