Segment fault - SDL_TTF [solved]

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Segment fault - SDL_TTF [solved]

    Hallo zusammen,

    ich schreibe gerade eine PokerEngine (C/C++) und komme bei dem folgenden Problem nicht weiter:

    Für die Engine benutze ich die SDL Bibliothek welche ja an sich wunderbar funktioniert. Nun wollte ich natürlich auch die SDL_TTF benutzen um Text auf einfache Art und weise darstellen zu können.

    Quellcode

    1. //Part of : CSurface.cpp
    2. bool CSurface::OnTextDraw(SDL_Surface* Surf_Dest, int X, int Y, int r, int g, int b, int size,char* text) {
    3. if(TTF_Init()==-1) return false;
    4. SDL_Rect DestR;
    5. SDL_Color color={r,g,b};
    6. TTF_Font *font;
    7. SDL_Surface *Surf_Text;
    8. font = TTF_OpenFont("Arial.ttf",size);
    9. TTF_SetFontStyle(font, 1); // BOLD = 1
    10. Surf_Text=TTF_RenderText_Solid(font,text,color);
    11. DestR.x = X;
    12. DestR.y = Y;
    13. SDL_BlitSurface(Surf_Text,NULL,Surf_Dest,&DestR);
    14. SDL_Flip(Surf_Dest);
    15. TTF_Quit();
    16. return true;
    17. }
    Alles anzeigen


    ... kompiliert & ausgeführt wird mir auch der Text angezeigt - nur nach etwa 10 sek. bricht die Anwendung mit "Segment fault" ab.
    Die Funktion CSurface::OnTextDraw wird aus einer anderen Klasse (CApp -> render()) aufgerufen. Dies funktioniert auch gut, da in der CSurface Klasse auch die Routinen für das Anzeigen der Bitmaps implementiert sind :

    C-Quellcode

    1. //CSurface.h
    2. //==============================================================================
    3. // Surface functions
    4. //==============================================================================
    5. #ifndef _CSURFACE_H_
    6. #define _CSURFACE_H_
    7. #include <SDL.h>
    8. #include <SDL/SDL_ttf.h>
    9. //==============================================================================
    10. class CSurface {
    11. public:
    12. CSurface();
    13. public:
    14. static SDL_Surface* OnLoad(char* File);
    15. static bool OnDraw(SDL_Surface* Surf_Dest, SDL_Surface* Surf_Src, int X, int Y);
    16. static bool OnDraw(SDL_Surface* Surf_Dest, SDL_Surface* Surf_Src, int X, int Y, int X2, int Y2, int W, int H);
    17. static bool OnTextDraw(SDL_Surface* Surf_Dest, int X, int Y, int r, int g, int b, int size,char* text);
    18. };
    19. //==============================================================================
    20. #endif
    Alles anzeigen


    Vielleicht kann mir jemand von Euch bei meinem "Hänger" helfen, da mir derzeit keine Lösung dafür einfällt.
    Wie schon oben gesagt - es muss an der Funktion CSurface::OnTextDraw liegen, da ohne Textdarstellung alles sauber läuft.....

    Gruß

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von pok3r_72 ()

  • Hallo, ich kann dir zwar nicht direkt helfen, aber ich würde das ganze mal durch den Debugger jagen. Das könnte was bringen. Du musst halt irgendwie raus kriegen, wo das Programm abstürzt. Speicherzugriff ist falsch etc. So was bekommst du aber mit dem Debugger relativ schnell raus
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert, der letzte Netzknoten kommerzialisiert, die letzte Newsgroup moderiert wird, werdet Ihr merken, dass man mit Geld allein nicht programmieren kann.
  • erstmal danke für die schnelle Antwort.
    Ja mit dem Debugger ist so eine Sache .... leider!

    Ich benutze zum Editieren des Quellcodes KDevelop (wg. Codevervollständigung) und das kompilieren übernimmt die Konsole via Makefile, da ich das ganze "gerödel" um den Projekt Aufbau von KDevelop nicht möchte - was wiederum dazu führt, daß ich den integrierten Debugger nicht benutzen kann.
    Von der Konsole aus habe ich noch nicht mit debuggern gearbeitet, was aber wohl schnellstens nachgeholt werden muss. (Debian Umsteiger)
  • Ok, hab mir ddd installiert und siehe da - wie sollte es auch anders sein - Freigabe von Ressourcen ....
    So nun nur der Vollständigkeit halber für alle die ebenfalls mit SDL / TTF arbeiten der funktionierende Quellcode :

    Quellcode

    1. bool CSurface::OnTextDraw(SDL_Surface* Surf_Dest, int X, int Y, int r, int g, int b, int size,char* text) {
    2. if(TTF_Init()==-1) return false;
    3. SDL_Rect DestR;
    4. SDL_Color color={r,g,b};
    5. TTF_Font *font;
    6. SDL_Surface *Surf_Text;
    7. font = TTF_OpenFont("Arial.ttf",size);
    8. TTF_SetFontStyle(font, 1); // BOLD = 1
    9. Surf_Text=TTF_RenderText_Solid(font,text,color);
    10. DestR.x = X;
    11. DestR.y = Y;
    12. SDL_BlitSurface(Surf_Text,NULL,Surf_Dest,&DestR);
    13. SDL_Flip(Surf_Dest);
    14. TTF_CloseFont(font); // <- Nicht vergessen den Zeichsatz wieder freizugeben
    15. TTF_Quit();
    16. return true;
    17. }
    Alles anzeigen


    und dank an JFox für den "Popotritt .... bzgl. ddd" :)

    [CLOSED - SOLVED]
  • Habe ich doch gar nicht mal so schlecht geraten :)

    Aber ich bin auch nicht so ein Fan von KDevelop, da bei mir die Syntaxverfollständigung irgendwie nicht will. Ich verwende Eclipse mit gdb.
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert, der letzte Netzknoten kommerzialisiert, die letzte Newsgroup moderiert wird, werdet Ihr merken, dass man mit Geld allein nicht programmieren kann.