Kann nicht auf surface->pixels zugreifen


HEP

Member
Joined
Dec 25, 2006
Messages
188
Ich stehe kurz davor eine erste Version von einem Heretic-Port für GP2X fertigzustellen. Es fehlt nur noch die Steuerung und ich muss folgendes Problem lösen, was mich irgendwie ratlos macht: Und zwar kann ich nicht auf den pixels member meines SDL_Surface für den screen (was bei SetVideoMode() zurückgegeben wird) zugreifen. Das komische ist, dass kein Fehler von irgendeiner SDL-Funktion zurückgegeben wird, der Debugger aber direkt nach dem Aufruf bereits "...out of bounds" sagt, wenn ich den Wert ausgeben möchte. Lasse ich dann weiterlaufen wird beim ersten Screen-Refresh, wenn auf das Surface zugegriffen wird, ein Segmentation Fault ausgelöst. :( Ich habe es sogar mit und ohne SDL_LockSurface() versucht, einmal mit SDL_HWSURFACE | SDL_FULLSCREEN und einmal mit SDL_SWSURFACE und einmal habe ich sogar ein weiteres Surface als Zwischenspeicher genommen, weil ich dachte, dass das screen-Surface vielleicht eine Besonderheit hat und keinen Direktzugriff unterstützt. Alles ist erfolglos. Es ist als wenn ein Fehler in SDL selbst wäre, aber ich glaube ich habe wohl eher etwas ganz simples übersehen. Bitte helft mir, denn wenn ich den Screen-Refresh auskommentiere kann ich schon den Sound im Menü und wenn die Demo abläuft hören! :)
 
Ich versteh das einfach nicht. Da muss irgendwas beim SDL schief laufen. Vielleicht kann ja einer was mit den Debug-Information anfangen:
Code:
Single stepping until exit from function SDL_SetVideoMode,
which has no line number information.
SDL_GP2X: Setting video mode 320x240 8 bpp, flags=20000000
SDL_GP2X: FreeHWSurfaces
SDL_GP2X: InitHWSurfaces 0x40835c00, 5161984
SDL_GP2X: Screen bucket 0x22ab4c
SDL_GP2X: First free bucket 0x22b5c8 (size = 5161984)
SDL_GP2X: Creating cursor 16x16
SDL_GP2X: Allocated WMcursor @ 0x22b9f8 (32)
SDL_GP2X: SurfaceManager allocating 256 bytes
SDL_GP2X: SurfaceManager adding new free bucket of 5161728 bytes @ 0x22ba10
SDL_GP2X: SurfaceManager allocated 256 bytes at 0x40835c00
I_InitGraphics () at .\i_sdl.c:321
321     .\i_sdl.c: No such file or directory.
        in .\i_sdl.c
(gdb) p *sdl_screen
$1 = {flags = 2684354592, format = 0x22ba88, w = 320, h = 240, pitch = 320,
  pixels = 0xbed00000, offset = 34, hwdata = 0x0, clip_rect = {x = 0, y = 0,
    w = 0, h = 320}, unused1 = 240, locked = 0, map = 0xead80000,
  format_version = 196643, refcount = 65536}
(gdb) p ((byte*)sdl_screen->pixels)[0]
Cannot access memory at address 0xbed00000
Übrigens habe ich danach schon den nächsten komischen Fehler und zwar ändert sich die Adresse von einer globalen Variable (maketic) plötzlich. Das kann doch nur durch einen Buffer Overrun passieren, oder? Gibt es irgendwelche Sachen, die man beim portieren beachten muss?
 
Ich habe das Problem gelöst. Es war ein Alignment bzw. struct-packaging Problem. Die Datenstrukturen von Heretic erfordern ein packen, aber SDL funktioniert dann nicht mehr. Ich habe jetzt also statt -fpack-struct zu verwenden die structs einzeln mit __attribute__ ((packed)) gekennzeichnet die es erfordern. Es wundert mich allerdings, dass da niemand drauf gekommen ist und ich hier einen Monolog führe, denn ich nehme an das Problem gibt es bei der Portierung von fast jedem DOS-Spiel. Naja, vielleicht haben einfach nicht die richtigen Leute hier reingeschaut.
 
Back
Top