SDL applikation frisst speicher ohne ende

Dieses Thema im Forum "C/C++" wurde erstellt von djtraumwelt, 12.04.2008.

  1. #1 djtraumwelt, 12.04.2008
    Zuletzt bearbeitet: 12.04.2008
    djtraumwelt

    djtraumwelt Foren As

    Dabei seit:
    21.09.2006
    Beiträge:
    78
    Zustimmungen:
    0
    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bytepool, 12.04.2008
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    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
     
  4. Ticha

    Ticha Linux Missionar

    Dabei seit:
    21.07.2006
    Beiträge:
    814
    Zustimmungen:
    0
    also wenn ich mich recht entsinne, reserviert SDL in fast jeder Funktion speicher. den musst du natrülch auch wieder freigeben
     
  5. musiKk

    musiKk Dr. Strangelove

    Dabei seit:
    30.07.2006
    Beiträge:
    264
    Zustimmungen:
    0
    Ort:
    Leipzig
    Ansonsten mal mit valgrind nach leaks und sonstigen Ungereimtheiten suchen.
     
  6. #5 djtraumwelt, 13.04.2008
    djtraumwelt

    djtraumwelt Foren As

    Dabei seit:
    21.09.2006
    Beiträge:
    78
    Zustimmungen:
    0
    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.
     
  7. #6 Herr Nilsson, 13.04.2008
    Zuletzt bearbeitet: 13.04.2008
    Herr Nilsson

    Herr Nilsson Eroberer

    Dabei seit:
    21.03.2008
    Beiträge:
    62
    Zustimmungen:
    0
    Ort:
    Dortmund
    Ich würde diesen Tip auch geben:
    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ß?
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  9. #7 bytepool, 13.04.2008
    Zuletzt bearbeitet: 13.04.2008
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    ich habe spasseshalber grad mal die Funktion gegoogelt die Herr Nilsson da hervorhebt, und ich wuerde sagen dein Problem wurde sehr genau diagnostiziert:
    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
     
  10. #8 djtraumwelt, 13.04.2008
    djtraumwelt

    djtraumwelt Foren As

    Dabei seit:
    21.09.2006
    Beiträge:
    78
    Zustimmungen:
    0
    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;
    }
    
     
Thema:

SDL applikation frisst speicher ohne ende

Die Seite wird geladen...

SDL applikation frisst speicher ohne ende - Ähnliche Themen

  1. Mako Server: schneller Web- und Applikationenserver für lahme Rechner

    Mako Server: schneller Web- und Applikationenserver für lahme Rechner: Real Time Logic hat mit dem Mako Server einen leichtgewichtigen Applikationen- und Webserver entwickelt, der auch auf weniger gut ausgestatteten...
  2. Ubuntu startet Applikationswettbewerb

    Ubuntu startet Applikationswettbewerb: Das Ubuntu-Projekt hat eine Programmierwettbewerb gestartet. Gesucht werden neu konzipierte Anwendungen, die binnen einer Zeitperiode von drei...
  3. Gnome 3.2 führt Web-Applikationen ein

    Gnome 3.2 führt Web-Applikationen ein: Bereits die kommende Version der freien Desktop-Umgebung Gnome soll eine Möglichkeit bringen, oft benutzte Webseiten in Form von Web-Anwendungen...
  4. Nach diversen Package-Updates geht Java-Applikation nicht mehr

    Nach diversen Package-Updates geht Java-Applikation nicht mehr: Hallo, ich hab von einem Kollegen die Administration eines Debian-Lenny-Servers übernommen. Der Kollege hatte dort zu Beginn das von uns...
  5. Core - Applikationszuweisung

    Core - Applikationszuweisung: Moin, Ich würde gerne herausfinden welche/wieviele Cores ein Prozess belegt/nutzt. Ist es möglich herauszufinden wieviele cores ein Prozess...