[SDL] Getpixel mit 64bit FPC?

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: Kubuntu 22.04 (FPC 3.2.2) / Win11 Pro (FPC 3.2.2) / macOS Ventura (FPC 3.2.2)
CPU-Target: x86/x64
Kontaktdaten:

[SDL] Getpixel mit 64bit FPC?

Beitrag von Cybermonkey342 »

Hallo,

ich möchte gerne die getpixel Funktion von JEDI-SDL benutzen. http://jedi-sdl.pascalgamedevelopment.com/html_docs/guidevideo.html#AEN90 Das funktioniert auch einwandfrei unter Win32 und Linux 32Bit. Wenn ich nun aber die Funktion unter Kubuntu 64bit kompilieren möchte, erhalte ich folgende Warnung:
Conversion between ordinals and pointers are not portable

Naja, soweit so gut, immerhin erhalte ich ein Programm, das aber leider nicht funktioniert und abstürzt.
EAccessViolation : Access violation
$0000000000431BE0
$0000000000431A21
$0000000000411D6E

Ich ging mal auf die Suche und habe folgendes festgestellt:
FPC currently uses 32 bits (4 bytes) for integers, whether the machine is a 32-bit or 64-bit machine. This will cause code expecting an integer and a pointer to be the same size to fail as a 64-bit machine uses 64-bit pointers. To allow you to write portable code, the FPC system unit introduces the types PtrInt and PtrUInt which are signed and unsigned integer data types with the same size as a pointer.

So, die fragliche Zeile sieht bei JEDI-SDL so aus:

Code: Alles auswählen

p := Pointer(Uint32(surface_.pixels) + y * surface_.pitch + x * bpp);

(hier kommt zumindest die Warnung, also nehme ich an, dass hier der Wurm drin ist).
Gibt es nun eine Möglichkeit, dass mein 64Bit FPC mir das korrekt übersetzt (type cast o.ä.)? (PtrInt und PtrUInt habe ich schon probiert.)
Mit besten Grüßen,
Cybermonkey

Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: Kubuntu 22.04 (FPC 3.2.2) / Win11 Pro (FPC 3.2.2) / macOS Ventura (FPC 3.2.2)
CPU-Target: x86/x64
Kontaktdaten:

Re: [SDL] Getpixel mit 64bit FPC? [gelöst]

Beitrag von Cybermonkey342 »

Hallo,

ich wollte nur kurz die Lösung des Problems bekannt geben, auf die ich nach längerer Zeit gestoßen bin. Danke auch an Matthias vom FPC-meets-SDL-Forum.
Ich benutze die SDL_getpixel Funktion aus der Unit sdlutils.pas von JEDI SDL. Die folgende Zeile lässt ein Programm auf einem 64Bit System abbrechen:

Code: Alles auswählen

p := Pointer( Uint32( SrcSurface.pixels ) + UInt32( y ) * SrcSurface.pitch + UInt32( x ) *  bpp );

Diese Zeile einfach ändern in

Code: Alles auswählen

p := Pointer( PtrUInt( SrcSurface.pixels ) + UInt32( y ) * SrcSurface.pitch + UInt32( x ) *    bpp );

und dann funktioniert es. (War eigentlich einfach, ich habe auch mit PtrUInt herumexperimentiert, aber an den falschen Stellen ...)
Mit besten Grüßen,
Cybermonkey

Antworten