SDL applikation frisst speicher ohne ende

D

djtraumwelt

Foren As
hallo erstmal.
ich hab mir (wiedermal) einen rauchtimer programmiert. mit SDL, SDL_ttf und SDL_image. das ganze unter windows (bitte nicht schlagen).

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <SDL/SDL_image.h>
#include <time.h>

int zeit;
double min=1;
int offzeit=0;
SDL_TimerID timer;

Uint32 haupt_funk (Uint32 intervall, void *parameter)
{
  if (offzeit == 0) {
   zeit--;
  }
  min += 0.01666666666666666666667;
  return intervall;
}

#ifdef main
#undef main
#endif

int main(int argc, char *argv[])
{
    if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0 )
    {
       fprintf(stderr, "SDL konnte nicht initialisiert werden:  %s\n",
         SDL_GetError());
       exit(1);
    }
 int anzahl=0;
 int val=3600;
 int quit=0;
 int weiter=0;
 double qte=0;
 int y=50;
 int minuten;
 FILE *fp;

 TTF_Font *font, *sfont;
 SDL_Color color = {0,0,0,0};
 SDL_Surface *text_to_grafik;
 char text[100];

 SDL_Event event;
 SDL_Surface *display;
 SDL_Rect drect, srect;

 Uint32 colorkey;
 SDL_Surface *image;
 image = IMG_Load("zig.jpg");
 colorkey = SDL_MapRGB(image->format, 0, 0, 0);
 SDL_SetColorKey(image, SDL_SRCCOLORKEY, colorkey);              
 SDL_WM_SetIcon(image,NULL);

 display = SDL_SetVideoMode( 800, 200, 0, SDL_SWSURFACE );
 zeit = 3600;
 timer = SDL_AddTimer (1000, haupt_funk, NULL);

 TTF_Init();
 font=TTF_OpenFont("segoeprb.ttf",16);
 sfont=TTF_OpenFont("segoeprb.ttf",8);

 fp=fopen("timer.dat","rb");
 if (fread (&minuten, 4, 1, fp) == 1) {
  min = (double) (minuten / 60);
  fread (&zeit,4,1,fp);
  fread (&anzahl,4,1,fp);
  fread (&val,4,1,fp);
  fread (&y,4,1,fp);
 }
 fclose(fp);

 drect.x=0;
 drect.y=50;
 drect.w=800;
 drect.h=150;
 SDL_FillRect(display, &drect, SDL_MapRGB(display->format, 90, 90, 90));
 SDL_UpdateRects(display,1,&drect);

  quit = 0;
  while( quit == 0 )
  {
   while( SDL_PollEvent( &event ) )
   {
    switch( event.type )
    {
      case SDL_KEYDOWN:
        if (event.key.keysym.sym == SDLK_q)
        {
         quit = 1;
         break;
        }
      case SDL_QUIT:
        quit = 1;
        break;
      case SDL_MOUSEBUTTONDOWN:
        if (event.button.button == SDL_BUTTON_RIGHT) {
         val = (val - zeit + val) / 2;
         zeit = 0;
        }
    }
   }
   SDL_Delay(100);
 qte = (double) (anzahl / (min / 60));
 sprintf(text,"%d in %d noch %d",anzahl,(int) min,zeit);
 SDL_WM_SetCaption(text,text);
 drect.x=0;
 drect.y=0;
 drect.w=800;
 drect.h=50;
 SDL_FillRect(display, &drect, SDL_MapRGB(display->format, 250, 190, 0));

 sprintf(text,"Bisher %d Zigaretten in %d Minuten geraucht.",anzahl,(int) min);
 text_to_grafik = TTF_RenderText_Solid(font, text, color);
 drect.x = 0;
 drect.y = 0;
 drect.w = 800;
 drect.h = 25;
 srect.x = 0;
 srect.y = 0;
 srect.w = 800;
 srect.h = 25;
 SDL_BlitSurface(text_to_grafik, &srect, display, &drect);

 sprintf(text,"Intervall: %d Sekunden (%d min)/ noch: %d Sekunden (%d min).",val,(int) (val / 60),zeit,(int) (zeit / 60));
 text_to_grafik = TTF_RenderText_Solid(font, text, color);
 drect.x = 0;
 drect.y = 25;
 drect.w = 800;
 drect.h = 25;
 srect.x = 0;
 srect.y = 0;
 srect.w = 800;
 srect.h = 25;
 SDL_BlitSurface(text_to_grafik, &srect, display, &drect);

 drect.x = 0;
 drect.y = 0;
 drect.w = 800;
 drect.h = 50;
 SDL_UpdateRects(display,1,&drect);

 if (zeit <= 0) {
  sprintf(text,"Jetzt rauchen!");
  SDL_WM_SetCaption(text,text);
  val += 100;
  zeit += val;
  anzahl++;
  offzeit=1;
 drect.x=0;
 drect.y=0;
 drect.w=800;
 drect.h=50;
 SDL_FillRect(display, &drect, SDL_MapRGB(display->format, 50, 230, 0));

 sprintf(text,"Klicken zum rauchen!");
 text_to_grafik = TTF_RenderText_Solid(font, text, color);
 drect.x = 0;
 drect.y = 12;
 drect.w = 800;
 drect.h = 25;
 srect.x = 0;
 srect.y = 0;
 srect.w = 800;
 srect.h = 25;
 SDL_BlitSurface(text_to_grafik, &srect, display, &drect);

 drect.x = 0;
 drect.y = 0;
 drect.w = 800;
 drect.h = 50;
 SDL_UpdateRects(display,1,&drect);

  weiter=0;
  while(weiter == 0) {
   while(SDL_PollEvent(&event)) {
    if (event.type == SDL_MOUSEBUTTONDOWN) {
     if (event.button.button == SDL_BUTTON_LEFT) {
      weiter=1;
      offzeit=0;
      y += 10;

 sprintf(text,"%d. Minute: %d. Zigarette an. Bisherige Qutoe von %f Zigaretten pro Stunde.",(int) min,anzahl,qte);
 text_to_grafik = TTF_RenderText_Solid(sfont, text, color);
 drect.x = 0;
 drect.y = y;
 drect.w = 800;
 drect.h = 10;
 srect.x = 0;
 srect.y = 0;
 srect.w = 800;
 srect.h = 10;
 SDL_BlitSurface(text_to_grafik, &srect, display, &drect);

 drect.x = 0;
 drect.y = y;
 drect.w = 800;
 drect.h = 10;
 SDL_UpdateRects(display,1,&drect);

 if (y == 180) {
  y=170;
  drect.x=0;
  drect.y=50;
  drect.w=800;
  drect.h=140;
  srect.x=0;
  srect.y=60;
  srect.w=800;
  srect.h=140;
  SDL_BlitSurface(display, &srect, display, &drect);
  drect.h=150;
  SDL_UpdateRects(display,1,&drect);
 }
     }
    }
   }
   SDL_Delay(100);
  }
 }

  }

 fp=fopen("timer.dat","wb");
 minuten = (int) (min * 60);
 fwrite (&minuten,4,1,fp);
 fwrite (&zeit,4,1,fp);
 fwrite (&anzahl,4,1,fp);
 fwrite (&val,4,1,fp);
 fwrite (&y,4,1,fp);
 fclose(fp);

 TTF_CloseFont(font);
 TTF_CloseFont(sfont);
 TTF_Quit();
 SDL_RemoveTimer(timer);
 SDL_FreeSurface(text_to_grafik);
 SDL_Quit();

 return 0;
}

funktioniert soweit ganz gut, nur dass eben, während das programm läuft, mein arbeitsspeicher immer voller und voller wird, bis der ganze pc nicht mehr reagiert. wenn ich das programm aus mache, dann dauerts ne weile bis der speicher wieder freigeräumt ist und danach läuft alles wieder. wenn ich mir im taskmanager die timer.exe anschaue, dann kann ich richtig dabei zusehen, wie die MBs immer mehr werden. warum?

wer das ganze mal unter linux compilieren will, der braucht nur die oben genannten sdl bibliotheken macht folgenden code raus:
Code:
#ifdef main
#undef main
#endif
und compiliert mit:
Code:
gcc `sdl-config --cflags --libs` timer.c -o timer -lSDL_ttf -lSDL_image
 
Zuletzt bearbeitet:
Hi,

funktioniert soweit ganz gut, nur dass eben, während das programm läuft, mein arbeitsspeicher immer voller und voller wird, bis der ganze pc nicht mehr reagiert. wenn ich das programm aus mache, dann dauerts ne weile bis der speicher wieder freigeräumt ist und danach läuft alles wieder.

klingt nach einem klassischem Fall von memory leak, oder? ;)
Aber gut, das weisst du sicher selbst. Ich kenne die SDL ueberhaupt nicht, und habe eigentlich auch keine grosse Lust jetzt deinen Code zu debuggen. Aber was mir auf Anhieb als Moeglichkeit einfallen wuerde, vor allem wenn du selber nirgendwo Speicher zuweist, dass eine Funktion der SDL die du benutzt eventuell Speicher zuweist, den du in deinem Programm wieder freigeben muesstest, das aber nicht tust.
Das kommt in manchen APIs vor. D.h. wenn du weisst dass du selber nichts an memory management in deinem Code machst, wuerde ich mal die Doku der externen Funktionen die du benutzt dahingehend durchsuchen.
Und falls du doch irgendwo selber Speicher reservierst, natuerlich erstmal gucken ob du auch dran gedacht hast den Speicher wieder freizugeben.

Edit:
Hast du mal geguckt ob du unter Linux das selbe Problem hast? Muesste ja eigentlich, aber nur so spasseshalber ;)

mfg,
bytepool
 
also wenn ich mich recht entsinne, reserviert SDL in fast jeder Funktion speicher. den musst du natrülch auch wieder freigeben
 
also erstmal ja, ich habe das selbe problem unter linux auch. und nein, ich verwende keinen speicher selber, den ich nicht wieder freigebe, das ist schon der speicher von den SDL funktionen. ich weiß nur nicht, ob ich wirklich speicher freigeben soll, wenn ich diesen speicher doch noch brauche. warum hängt der immer mehr speicher hintendran, anstatt, so wie gewollt, den alten speicherinhalt durch den neuen zu ersetzen? Da kenn ich mich jetzt in SDL zu wenig aus um da selber klar zukommen. ich werd mal auf libsdl.org nachschauen, ob ich was finde, aber wäre trotzdem geil, wenn ihr weiterhin versuchen könntet, mein problem zu supporten. ich hab übrigens noch andere anwendungen mit SDL geschrieben und bei allen das gleiche problem.
 
Ich würde diesen Tip auch geben:
Ansonsten mal mit valgrind nach leaks und sonstigen Ungereimtheiten suchen.
Valgrind ist ein Debugger für Speicherprobleme; was Du Dir da mal genauer anschauen solltest, heißt glaube ich "leak-check" oder so ähnlich.

SDL kenne ich auch nicht, und ich habe Deinen Code nur mal schnell überflogen. Auf den ersten Blick sieht mir das hier verdächtig aus (im übrigen wäre es einfacher, Deinen Code zu lesen, wenn Du die Klammern vernünftig eingerückt hättest):

text_to_grafik = TTF_RenderText_Solid(sfont, text, color);

"text_to_grafik" wurde als Zeiger initialisiert und "TTF_RenderText_Solid" legt wohl den Speicherbereich an, auf den dieser Zeiger zeigt.

Du benutzt das "TTF_RenderText_Solid" in einer Schleife, und vermutlich wird bei jedem Durchgang jedesmal neuer Speicher angefordert. Jetzt sollte man aber unbenutzten Speicher wieder freigeben.

Wo geschieht das bei Dir?

Steht nicht in der Doku, ob und wie man diesen Speicher wieder freigeben muß?
 
Zuletzt bearbeitet:
Hi,

ich habe spasseshalber grad mal die Funktion gegoogelt die Herr Nilsson da hervorhebt, und ich wuerde sagen dein Problem wurde sehr genau diagnostiziert:
http://jcatki.no-ip.org:8080/SDL_ttf/SDL_ttf_36.html schrieb:
3.4.1 TTF_RenderText_Solid
[...]
Render the LATIN1 encoded text using font with fg color onto a new surface, using the Solid mode (see section Solid). The caller (you!) is responsible for freeing any returned surface.

warum hängt der immer mehr speicher hintendran, anstatt, so wie gewollt, den alten speicherinhalt durch den neuen zu ersetzen?
Weil das nur von dir gewollt ist, aber scheinbar nicht von den API Entwicklern. Wie gesagt, es steht doch in der Doku der Funktionen wann du Speicher wieder freigeben musst, und wann nicht.

<edit>
Ach, ich glaube ich verstehe grade erst was du meinst, und ich denke du hast das Prinzip von Pointern noch nicht begriffen. Der Pointer zeigt lediglich auf einen bestimmten Bereich im Speicher. Du bist als Programmierer dafuer verantwortlich dass der Speicher initialisiert wurde, und du bist auch dafuer verantwortlich dass der entsprechende Speicher wieder freigegeben wird. Wenn du jetzt Speicher reservierst, was du ueber die SDL Funktionen tust, und dem Pointer dann einen neuen Wert zuweist, wird lediglich der int Wert des Pointers, d.h. die Adresse auf die er zeigt, ueberschrieben. Aber der Speicher auf den der Pointer zeigte bleibt natuerlich weiterhin reserviert, aber da kein Pointer mehr auf den entsprechenden Speicher zeigt, ist dieser nutzlos geworden, und du hast ein Speicherleck.
In Sprachen mit Garbage Collection waere das jetzt das Zeichen fuer den Garbage Collector dafuer zu sorgen dass der entsprechende Speicher wieder freigegeben wird. Python arbeitet z.B. mit solchen Referenzen und merkt sich wieviele Objekte auf den entsprechenden Speicher zeigen.
In C und C++ hast du jetzt aber ein Problem, weil du nie wieder an diesen Speicher rankommst, und ihn auch nicht mehr freigeben kannst.
Das sollte dein Problem vielleicht deutlicher machen. ;)
</edit>

Das was Herr Nilsson da hervorgehoben hat, ist ein klassisches Beispiel fuer ein Speicherleck .
Ich habe ein wenig das Gefuehl, dass du noch nie mit Memory Management zu tun hattest. Ich wuerde dir vielleicht raten dich da mal ein bisschen einzuarbeiten. Ich habe auch erst vor kurzem mit ernster C++ Programmierung angefangen, und habe auch so 1 - 2 Wochen gebraucht, bis ich ein Gespuehr dafuer hatte, wann man wofuer neuen Speicher anfordern muss, und wann man den wieder freigeben muss.
Am Anfang fand ich den ganzen Pointer und Memory Kram ziemlich verwirrend, aber irgendwann hat's dann Klick gemacht, und es wurde ziemlich logisch. ;)

Konkret wirst du also nochmal deinen Code durchgehen muessen, und jede der SDL Funktionen ueberpruefen, ob sie Speicher reserviert, und wenn ja, zum geeigneten Zeitpunkt wieder freigeben. Achso, oder vielleicht wie schon vorgeschlagen mit valgrind, geht eventuell schneller. ;)

mfg,
bytepool
 
Zuletzt bearbeitet:
uiuiui, soviel mühe und genaue erörterung für mein simples problem... jetzt weiß ich wieder warum mir dieses forum hier so ans herz gewachsen ist, ihr seid echt alle die besten, das muss mal gesagt werden.

jedenfall habe ich einfach mal n bissl mit SDL_FreeSurface rumprobiert und wenn ich einfach nach jeder operation mit einem Surface SDL_FreeSurface mache, dann ist das problem gelöst: der taskmanager zeigt mir eine konstante größe für den speicher der timer.exe an und keine wachsende größe. jetzt verbraucht mein rauchtimer nur noch rund 2 MB anstatt 600 MB nach ner halben stunde laufen.

ja, ich bin auch nach 2 jahren, die ich jetzt mit linux und dementsprechend auch mit c verbracht hab, immernoch ein blutiger anfänger, der von so vielen dingen keine ahnung hat. wie man zum beispiel mit einem ftp server kommuniziert, da werde ich wohl demnächst auch mal eine frage hier posten, die mir in einem anderen forum nur ungenügend beantwortet wurde.

nachfolgend nochmal der aktuelle code, für alle die sowas wichtiges, wie einen rauchtimer unbedingt haben wollen:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <SDL/SDL_image.h>
#include <time.h>

int zeit;
double min=1;
int offzeit=0;
SDL_TimerID timer;

Uint32 haupt_funk (Uint32 intervall, void *parameter)
{
  if (offzeit == 0) {
   zeit--;
  }
  min += 0.01666666666666666666667;
  return intervall;
}

#ifdef main
#undef main
#endif

int main(int argc, char *argv[])
{
    if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0 )
    {
       fprintf(stderr, "SDL konnte nicht initialisiert werden:  %s\n",
         SDL_GetError());
       exit(1);
    }
 int anzahl=0;
 int val=3600;
 int quit=0;
 int weiter=0;
 double qte=0;
 int y=50;
 int minuten;
 int plus;
 FILE *fp;
 time_t stime;

 TTF_Font *font, *sfont;
 SDL_Color color = {0,0,0,0};
 SDL_Surface *text_to_grafik;
 text_to_grafik=SDL_CreateRGBSurface(SDL_SWSURFACE|SDL_PREALLOC,800,25,32,0,0,0,0);
 char text[200];

 SDL_Event event;
 SDL_Surface *display;
 display=SDL_CreateRGBSurface(SDL_SWSURFACE|SDL_PREALLOC,800,200,32,0,0,0,0);
 SDL_Rect drect, srect;

 Uint32 colorkey;
 SDL_Surface *image;
 image=SDL_CreateRGBSurface(SDL_SWSURFACE|SDL_PREALLOC,32,32,32,0,0,0,0);
 image = IMG_Load("zig.jpg");
 colorkey = SDL_MapRGB(image->format, 0, 0, 0);
 SDL_SetColorKey(image, SDL_SRCCOLORKEY, colorkey);              
 SDL_WM_SetIcon(image,NULL);

 display = SDL_SetVideoMode( 800, 200, 0, SDL_SWSURFACE );
 zeit = 3600;
 timer = SDL_AddTimer (1000, haupt_funk, NULL);

 TTF_Init();
 font=TTF_OpenFont("segoeprb.ttf",16);
 sfont=TTF_OpenFont("segoeprb.ttf",10);

 fp=fopen("timer.dat","rb");
 if (fread (&minuten, 4, 1, fp) == 1) {
  fread (&zeit,4,1,fp);
  fread (&anzahl,4,1,fp);
  fread (&val,4,1,fp);
  fread (&stime,4,1,fp);
  min = (double) ((minuten + (time(NULL) - stime)) / 60);
  zeit = zeit - (time(NULL) - stime);
  if (zeit < 0) {
   zeit = 0;
  }
 }
 fclose(fp);

  drect.x=0;
  drect.y=50;
  drect.w=800;
  drect.h=150;
  SDL_FillRect(display, &drect, SDL_MapRGB(display->format, 90, 90, 90));
  SDL_FreeSurface(display);
  SDL_UpdateRect(display,0,0,0,0);
  SDL_FreeSurface(display);


  quit = 0;
  while( quit == 0 )
  {
   while( SDL_PollEvent( &event ) )
   {
    switch( event.type )
    {
      case SDL_KEYDOWN:
        if (event.key.keysym.sym == SDLK_q)
        {
         quit = 1;
         break;
        }
      case SDL_QUIT:
        quit = 1;
        break;
      case SDL_MOUSEBUTTONDOWN:
        if (event.button.button == SDL_BUTTON_RIGHT) {
         val = (val - zeit + val) / 2;
         zeit = 0;
        }
        if (event.button.button == SDL_BUTTON_WHEELUP) {
         val += 10;
         zeit += 10;
        }
        if (event.button.button == SDL_BUTTON_WHEELDOWN) {
         val -= 10;
         if (val < 1) {
          val = 1;
         }
         zeit -= 10;
         if (zeit < 1) {
          zeit = 1;
         }
        }
    }
   }
   SDL_Delay(100);
 qte = (double) (anzahl / (min / 60));
 sprintf(text,"%d/%d-%d",anzahl,(int) (min / 60),zeit);
 SDL_WM_SetCaption(text,text);
 drect.x=0;
 drect.y=0;
 drect.w=800;
 drect.h=50;
 SDL_FillRect(display, &drect, SDL_MapRGB(display->format, 250, 190, 0));
 SDL_FreeSurface(display);

 sprintf(text,"Bisher %d Zigaretten in %d Minuten (%d Stunden) geraucht.",anzahl,(int) min,(int) (min / 60));
 text_to_grafik = TTF_RenderText_Solid(font, text, color);
 drect.x = 0;
 drect.y = 0;
 drect.w = 800;
 drect.h = 25;
 srect.x = 0;
 srect.y = 0;
 srect.w = 800;
 srect.h = 25;
 SDL_BlitSurface(text_to_grafik, &srect, display, &drect);
 SDL_FreeSurface(text_to_grafik);
 SDL_FreeSurface(display);

 sprintf(text,"Intervall: %d Sekunden (%d min) / noch: %d Sekunden (%d min).",val,(int) (val / 60),zeit,(int) (zeit / 60));
 text_to_grafik = TTF_RenderText_Solid(font, text, color);
 drect.x = 0;
 drect.y = 25;
 drect.w = 800;
 drect.h = 25;
 srect.x = 0;
 srect.y = 0;
 srect.w = 800;
 srect.h = 25;
 SDL_BlitSurface(text_to_grafik, &srect, display, &drect);
 SDL_FreeSurface(text_to_grafik);
 SDL_FreeSurface(display);

 drect.x = 0;
 drect.y = 0;
 drect.w = 800;
 drect.h = 50;
 SDL_UpdateRect(display,0,0,0,0);
 SDL_FreeSurface(display);

 if (zeit <= 0) {
  sprintf(text,"Jetzt rauchen!");
  SDL_WM_SetCaption(text,text);
  val += 100;
  zeit += val;
  anzahl++;
  offzeit=1;
  plus=1;

  weiter=0;
  while(weiter == 0) {
   while(SDL_PollEvent(&event)) {
    if (event.type == SDL_MOUSEBUTTONDOWN) {
     if (event.button.button == SDL_BUTTON_LEFT) {
      weiter=1;
      offzeit=0;
      y += 15;
      plus--;
      anzahl += plus;

 if (qte == 0)
  qte=1;
 sprintf(text,"%d. Minute: %d. Zigarette an. Bisherige Qutoe von %f Zigaretten pro Stunde, entspricht einer Zigarette in %d Minuten.",(int) min,anzahl,qte,(int) (60 / qte));
 text_to_grafik = TTF_RenderText_Solid(sfont, text, color);
 drect.x = 0;
 drect.y = y;
 drect.w = 800;
 drect.h = 15;
 srect.x = 0;
 srect.y = 0;
 srect.w = 800;
 srect.h = 15;
 SDL_BlitSurface(text_to_grafik, &srect, display, &drect);
 SDL_FreeSurface(text_to_grafik);
 SDL_FreeSurface(display);

 drect.x = 0;
 drect.y = y;
 drect.w = 800;
 drect.h = 15;
 SDL_UpdateRect(display,0,0,0,0);
 SDL_FreeSurface(display);

 if (y == 185) {
  y=170;
  drect.x=0;
  drect.y=50;
  drect.w=800;
  drect.h=140;
  srect.x=0;
  srect.y=60;
  srect.w=800;
  srect.h=140;
  SDL_BlitSurface(display, &srect, display, &drect);
  SDL_FreeSurface(display);
  drect.h=150;
  SDL_UpdateRect(display,0,0,0,0);
  SDL_FreeSurface(display);
 }
     }
     if (event.button.button == SDL_BUTTON_WHEELUP) {
      plus++;
     }
     if (event.button.button == SDL_BUTTON_WHEELDOWN) {
      plus--;
      if (plus < 1) {
       plus=1;
      }
     }
    }
   }
   SDL_Delay(100);
 drect.x=0;
 drect.y=0;
 drect.w=800;
 drect.h=50;
 SDL_FillRect(display, &drect, SDL_MapRGB(display->format, 50, 230, 0));
 SDL_FreeSurface(display);

 sprintf(text,"Klicken um %d Zigaretten zu verbuchen!",plus);
 text_to_grafik = TTF_RenderText_Solid(font, text, color);
 drect.x = 0;
 drect.y = 12;
 drect.w = 800;
 drect.h = 25;
 srect.x = 0;
 srect.y = 0;
 srect.w = 800;
 srect.h = 25;
 SDL_BlitSurface(text_to_grafik, &srect, display, &drect);
 SDL_FreeSurface(text_to_grafik);
 SDL_FreeSurface(display);

 drect.x = 0;
 drect.y = 0;
 drect.w = 800;
 drect.h = 50;
 SDL_UpdateRect(display,0,0,0,0);
 SDL_FreeSurface(display);

  }
 }

  }

 fp=fopen("timer.dat","wb");
 minuten = (int) (min * 60);
 fwrite (&minuten,4,1,fp);
 fwrite (&zeit,4,1,fp);
 fwrite (&anzahl,4,1,fp);
 fwrite (&val,4,1,fp);
 stime=time(NULL);
 fwrite (&stime,4,1,fp);
 fclose(fp);

 TTF_CloseFont(font);
 TTF_CloseFont(sfont);
 TTF_Quit();
 SDL_RemoveTimer(timer);
 SDL_FreeSurface(text_to_grafik);
 SDL_Quit();

 return 0;
}
 

Ähnliche Themen

Shellskript - Fehler in Cron

NagiosGrapher 1.7.1 funktioniert nicht

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

[PHP] Autologin-Funktion

XFCE freezes at startup

Zurück
Oben