You are not logged in.

  • Login

1

Wednesday, August 20th 2008, 1:58pm

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.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Part of : CSurface.cpp
bool CSurface::OnTextDraw(SDL_Surface* Surf_Dest, int X, int Y, int r, int g, int b, int size,char* text) {

	if(TTF_Init()==-1) return false;
	SDL_Rect DestR;
     	SDL_Color color={r,g,b};
     	TTF_Font 	*font;
	SDL_Surface 	*Surf_Text;

	font = TTF_OpenFont("Arial.ttf",size);
	TTF_SetFontStyle(font, 1);		// BOLD = 1

     	Surf_Text=TTF_RenderText_Solid(font,text,color);
	DestR.x = X;
	DestR.y = Y;
     	SDL_BlitSurface(Surf_Text,NULL,Surf_Dest,&DestR);
     	SDL_Flip(Surf_Dest);
	TTF_Quit();
	return true;
}


... 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 :

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//CSurface.h
//==============================================================================
// Surface functions
//==============================================================================
#ifndef _CSURFACE_H_
    #define _CSURFACE_H_

#include <SDL.h>
#include <SDL/SDL_ttf.h>

//==============================================================================
class CSurface {

	public:
		CSurface();

	public:
		static SDL_Surface* OnLoad(char* File);

		static bool OnDraw(SDL_Surface* Surf_Dest, SDL_Surface* Surf_Src, int X, int Y);

		static bool OnDraw(SDL_Surface* Surf_Dest, SDL_Surface* Surf_Src, int X, int Y, int X2, int Y2, int W, int H);

		static bool OnTextDraw(SDL_Surface* Surf_Dest, int X, int Y, int r, int g, int b, int size,char* text);
};

//==============================================================================

#endif


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ß

This post has been edited 1 times, last edit by "pok3r_72" (Aug 20th 2008, 2:47pm)


2

Wednesday, August 20th 2008, 2:11pm

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

3

Wednesday, August 20th 2008, 2:26pm

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)

4

Wednesday, August 20th 2008, 2:44pm

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 :

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool CSurface::OnTextDraw(SDL_Surface* Surf_Dest, int X, int Y, int r, int g, int b, int size,char* text) {

	if(TTF_Init()==-1) return false;
	SDL_Rect DestR;
     	SDL_Color color={r,g,b};
     	TTF_Font 	*font;
	SDL_Surface 	*Surf_Text;

	font = TTF_OpenFont("Arial.ttf",size);
	TTF_SetFontStyle(font, 1);		// BOLD = 1

     	Surf_Text=TTF_RenderText_Solid(font,text,color);
	DestR.x = X;
	DestR.y = Y;
     	SDL_BlitSurface(Surf_Text,NULL,Surf_Dest,&DestR);
     	SDL_Flip(Surf_Dest);
	TTF_CloseFont(font);		// <- Nicht vergessen den Zeichsatz wieder freizugeben
	TTF_Quit();
	return true;
}


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

[CLOSED - SOLVED]

5

Wednesday, August 20th 2008, 4:20pm

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.

Similar threads

Social bookmarks