Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
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:
Beitrag
von Heinrich Wolf » Do 28. Jul 2011, 22:41
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:
Beitrag
von Heinrich Wolf » Do 28. Jul 2011, 22:52
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
Beitrag
von MAC » Do 28. Jul 2011, 23:04
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));
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:
Beitrag
von Christian » Do 28. Jul 2011, 23:14
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
Beitrag
von Teekeks » Do 28. Jul 2011, 23:49
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:
Beitrag
von Heinrich Wolf » Fr 29. Jul 2011, 09:42
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
Beitrag
von indianer-frank » Fr 29. Jul 2011, 10:09
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:
Beitrag
von Heinrich Wolf » Fr 29. Jul 2011, 12:05
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:
Beitrag
von Heinrich Wolf » Fr 29. Jul 2011, 12:54
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
Beitrag
von indianer-frank » Fr 29. Jul 2011, 13:28
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.