[fpc-other] SDL TimerCallback crash with Linux

sascha-zimmermann at arcor.de sascha-zimmermann at arcor.de
Thu Jun 1 18:03:32 CEST 2006


Hi there,

I am developing a small game with FreePascal (FP for short) and SDL. While trying to support multiple platforms
I ran into a problem with SDL_AddTimer. I reduced my code to the core problem (see below) to find out what's wrong.

In Win32 the executables (FP and C) run as expected. But when I compile the same code under Linux only the C binary
will run while the FP binary crashes at the first call to the timer callback function:

Starting...
SDL_AddTimer: Success!
Waiting 8 seconds...
An unhandled exception occurred at $08055A31 :
Exception : Unknown Run-Time error : 202
  $08055A31
  $08048472
  $40036544
  $4006638A
  $4003615B
  $400638CF
  $400B9E51

I am using FreePascal 2.0.2 with SDL 1.2.10 (i.e. libSDL-1.2.so.0.7.3) on Debian.
Using JEDI-SDLv1.0 or SDL4FreePascal leads to same crash.

Any help appreciated.

Sascha


//------------------------------------------------------------------------------
// C code
//------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include "SDL/SDL.h"

Uint32 timer_func(Uint32 interval, void *parameter)
{
  printf ("timer interval: %d ms\n", interval);
  return (interval-1000);
}

int main (void) 
{
  SDL_TimerID MyTimer;

  printf("Starting...\n");
  
  if (SDL_Init(SDL_INIT_TIMER) < 0)
  {
      printf("Kann SDL nicht initialisieren: %s\n", SDL_GetError());
      exit(1);
  }
  atexit(SDL_Quit);

  // Now add timer
  MyTimer = SDL_AddTimer(3000, timer_func, NULL);
  if (MyTimer == NULL)
  {
      printf("SDL_AddTimer: Error!\n");
      exit(1);
  }
  atexit(SDL_Quit);
  printf ("SDL_AddTimer: Success!\n");

  // just wait
  printf("Waiting 8 seconds...\n");
  SDL_Delay( 8000 );
 
  // Release
  SDL_Quit;
  printf("ByeBye ;)\n");
  
  return(0);
}

//------------------------------------------------------------------------------
// PASCAL code
//------------------------------------------------------------------------------
program timer;

{$mode objfpc}

uses
  sysutils,
  sdl_timer, sdl_types, // SDL4FP //
  sdl;

var
  //JEDI//_Timer: PSDL_TimerID;
  _Timer: SDL_TimerID; // SDL4FP //

function timer_func(Interval: Uint32; Param: Pointer): Uint32; cdecl;
begin
  Writeln('timer interval: ' + IntToStr(Interval) + ' ms');
  Result := Interval-1000;
end;

begin
  Writeln('Starting...');
  
  // Init SDL and timer
  if SDL_Init(SDL_INIT_TIMER) < 0 then
  begin
    Writeln('SDL_Init: Error!');
    Exit;
  end;
  
  // Now add timer
  _Timer := SDL_AddTimer( 3000, @timer_func, nil );
  if _Timer = nil then
  begin
    Writeln('SDL_AddTimer: Error!');
    Exit;
  end;
  Writeln('SDL_AddTimer: Success!');
  
  // just wait
  Writeln('Waiting 8 seconds...');
  SDL_Delay( 8 * 1000 );
 
  // Release
  SDL_Quit;
  WriteLn('ByeBye ;)');
end.



Viel oder wenig? Schnell oder langsam? Unbegrenzt surfen + telefonieren
ohne Zeit- und Volumenbegrenzung? DAS TOP ANGEBOT JETZT bei Arcor: günstig
und schnell mit DSL - das All-Inclusive-Paket für clevere Doppel-Sparer,
nur  44,85 €  inkl. DSL- und ISDN-Grundgebühr!
http://www.arcor.de/rd/emf-dsl-2


More information about the fpc-other mailing list