Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

1

09.03.2008, 19:57

Fehler bei SDL_ttf

Hallo,

ich hab in mein neues projekt sdl_ttf eingebunden und verwendet, doch jetzt kommt immer wenn beim spiel der teil, wo schrift erscheinen soll, aufgerufen wird, folgende meldung:

Quellcode

1
2
Fatal signal: Segmentation Fault (SDL Parachute Deployed)
Press any key to continue


ich kenn die meldung und weiß, dass ein zeiger auf falschen zeiger zugreift oder so.

hier ist mal der relevante Code:

Game.h

Quellcode

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
#ifndef GAME_H
#define GAME_H

#include "Asteroid.h"
#include "Player.h"
#include <SDL_ttf.h>

class CGame
{
  public:
         CGame ();
         Quit ();

  private:
   void CheckPoints (int m_Points);

        int m_Points                            // Punkte
   SDL_Surface *m_pScreen;         // Screen
    TTF_Font *m_pFont;              // SchriftFont
    SDL_Surface *m_pSText;          // ScreenText
   SDL_Rect dstTextKoordinaten;    // Koordinaten
    SDL_Color clrBlack;             // Farbe
};

#endif



Game.cpp, CGame ()

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Konstruktor
//
// Aufgabe: Allgemeine Initialisierungen
//
CGame::CGame ()
{
 
  m_pScreen = NULL;         
  m_pFont = NULL;             
  m_pSText = NULL;
           


} // Konstruktor



Game.cpp, Quit

Quellcode

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
// Quit
//
// Aufgabe: Instanzen freigeben
//
void CGame::Quit ()
{

  // Screen freigeben
  if (m_pScreen != NULL)
  {
    delete (m_pScreen);
    m_pScreen = NULL;
  }

  // Font freigeben
  if (m_pFont != NULL)
  {
    delete (m_pFont);
    m_pFont = NULL;
  }

  // Screentext freigeben
  if (m_pSText != NULL)
  {
    delete (m_pSText);
    m_pSText = NULL;
  }

} // Quit


GAme.cpp, CheckPoints

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// CheckPoints
//
// Aufgabe: Punktestand aktualisieren
//
void CGame::CheckPoints (int m_Points)
{
    TTF_Init();
    m_pFont = TTF_OpenFont("Arial.ttf",18);    //Beim ersten Parameter die Schriftart einsetzen, der Zweite ist die Schriftgrösse
   SDL_Color clrBlack = {0, 0, 0};
    m_pSText = TTF_RenderText_Solid(m_pFont, "Text", clrBlack);
    SDL_Rect dstTextKoordinaten = {200, 300, 0, 0};
   

    //dann in der Hauptschleife
    SDL_BlitSurface(m_pSText, NULL, m_pScreen, &dstTextKoordinaten);

    //und dann zu guter Letzt noch
    SDL_FreeSurface(m_pSText);

}



wieso kommt da ein fehler? ich hab doch alle zeiger richtig geNuLLt und auch wieder freigegeben.

und es kommen außerdem diese beiden warnungen:

Quellcode

1
c:\dokumente und einstellungen\eigene dateien\projekte\projekte\möp\game.cpp(210) : warning C4150: Loeschen eines Zeigers auf den undefinierten Typ '_TTF_Font'; Destruktor wurde nicht aufgerufen


wenn ich draufklicke, kommt hier ein pfeil:

Quellcode

1
2
3
4
5
6
// Font freigeben
  if (m_pFont != NULL)
  {
    delete (m_pFont);
    m_pFont = NULL;
  }


vor dem delete.

darunter kommt diese meldung:

Quellcode

1
c:\dokumente und einstellungen\eigene dateien\projekte\projekte\sdl_ttf-2.0.9\include\sdl_ttf.h(80) : Siehe Deklaration von '_TTF_Font'

wenn ich da doppelklicke, komm ich in diese zeile von SDL_ttf.h:

Quellcode

1
2
/* The internal structure containing font information */
typedef struct _TTF_Font TTF_Font;


könnt ihr mir helfen?

vielen dank im voraus,

mfg Gon

2

09.03.2008, 20:21

delete 0 ist definiert.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

3

10.03.2008, 19:08

und?

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

4

10.03.2008, 19:50

... und deswegen kannste statt if (X != NULL) ... einfach direkt delete X; X = NULL; schreiben. Zu deinem eigentlichen Problem hat Deviloper glaub ich nix geschrieben :roll:

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

5

10.03.2008, 20:51

Zitat von »"Deviloper"«

delete 0 ist definiert.


Du solltest doch wissen, dass ein Anfänger damit erstmal gar nix anfangen kann ;)

6

10.03.2008, 21:31

(1) Angucken: TTF_CloseFont (so sagt google.de wenn ich nach deinem Problem suche)
(2) CGame::Quit => Warum kein einfacher Destruktor für CGame?
(3) Initialisierungsliste
(4) TTF_Init in CGame - {c-tor} (Konstruktor)
(5) TTF_Quit in ~CGame - {d-tor} (Destruktor)

Und das alles ergibt sich aus einmal Suchmaschine nutzen! (okay vllt. nur das TTF_CloseFont, aber egal :D)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

7

11.03.2008, 15:32

OK, danke.
Ich hab jetzt die Fehlenden Funktionen hinzugefügt, es geht aber immer noch nicht. Es bricht aber nicht mehr ab, sondern erst wenn man das Spiel beendet steht in der Konsole der oben genannte Fehler. Außerdem hab ich
das mit dem delete geändert, die warnungen kommen aber immernoch.

Es ist doch egal, welchen destruktor ich benutze, oder?

Hier der Code:

CGame::CGame

Quellcode

1
2
3
4
5
6
 m_pScreen = NULL;         
  m_pFont = NULL;             
  m_pSText = NULL;
            
  TTF_Init();
  


CGame::Init

Quellcode

1
2
3
4
5
6
7
8
9
// Font laden
  m_pFont = TTF_OpenFont("Data/comic.ttf",18);    //Beim ersten Parameter die Schriftart einsetzen, der Zweite ist die Schriftgrösse
 
  // 0 Punkte
  m_Points = 0;

SDL_Color clrBlack = {0, 0, 0}; // Farbe der Schrift
   
    SDL_Rect dstTextKoordinaten = {200, 300, 0, 0}; // Koordinaten des Texts


CGAme::Quit

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Screen freigeben
  if (m_pScreen != NULL)
  {
    delete (m_pScreen);
    m_pScreen = NULL;
  }

  // Font freigeben
  delete (m_pFont);
  m_pFont = NULL;

  // Screentext freigeben
  if (m_pSText != NULL)
  {
    delete (m_pSText);
    m_pSText = NULL;
  }

  SDL_FreeSurface(m_pSText);

  TTF_CloseFont(m_pFont); 

  TTF_Quit();


CGame::CheckPoints

Quellcode

1
2
3
4
5
6
7
8
9
10
11
// CheckPoints
//
// Aufgabe: Punktestand aktualisieren
//
void CGame::CheckPoints (int m_Points)
{
    m_pSText = TTF_RenderText_Solid(m_pFont, "Dein Text", clrBlack); // Text rendern

    //dann in der Hauptschleife
    SDL_BlitSurface(m_pSText, NULL, m_pScreen, &dstTextKoordinaten);
}

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

8

11.03.2008, 15:58

Jetzt gehts :D :D :D
Ich hab nur vergessen, in CGAme::Init das hier zu schreiben:

Quellcode

1
2
3
4
5
// Screen initialisieren
  m_pScreen = new SDL_Surface;

  // ScreenText initialisieren
  m_pSText = new SDL_Surface;

Und bei dem delete Font, des hab ich einfach weggelassen. :D

Danke an alle, die mir geholfen haben. :D

Jetzt hab ich noch eine Frage:
Da ich ja will, dass die Punktzahl dargestellt wird, die sich ja immer ändert,
weiß ich aber nicht, wie man das macht? (ich weiß der satz ist bullshit, aber ihr wisst doch was ich meine) ;)

geht das vielleicht mit so platzhaltern, wie auch in printf?
so:

Quellcode

1
printf ("Punkte: %i", Punkte);


mfg Gon

9

11.03.2008, 16:36

Du könntest dir mit sprintf einen String zusammenbasteln, den du dann ausgibst. ich weiß aber nicht ob das eine besonders gute Lösung ist... :?

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

10

11.03.2008, 16:50

ich habs jetzt so gemacht:
(m_Score = const char* und m_Points ein int)

Quellcode

1
2
3
    m_Score = printf ("Punkte: %i", m_Points);

    m_pSText = TTF_RenderText_Solid(m_pFont, m_Score, clrBlack); // Text rendern


Es kommt folgende Meldung:

Quellcode

1
c:\dokumente und einstellungen\eigene dateien\projekte\projekte\möp\game.cpp(751) : error C2664: 'sprintf' : Konvertierung des Parameters 2 von 'int' in 'const char *' nicht moeglich

Werbeanzeige