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

Gelöschter Benutzer

unregistriert

11

03.12.2013, 15:31

nein, kommt doch keine fehlermeldung, hatte damals die falsche dll benutzt, bzw. es kommt ne fehlermeldung, aber halt die von ganz am Anfang.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

12

03.12.2013, 16:02

Dann guck mal was SDL_GetError dazu sagt. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Gelöschter Benutzer

unregistriert

13

03.12.2013, 17:33

SDL_GetError(); sagt nichts, es verhält sich ruhig :)

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

14

03.12.2013, 17:44

Und du hast bereits geprüft, ob m_font null ist beim zeichnen?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Gelöschter Benutzer

unregistriert

15

03.12.2013, 18:03

naja, wenn ich z. B. m_font per cout ausgeben möchte, kommt dort der Fehler. Und im Konstruktor (siehe letzter Code) würde ja eine Fehlermeldung ausgegeben werden, wenn m_font = 0.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

16

03.12.2013, 18:18

Dann prüf doch einfach mal, ob m_font == NULL ist. ;)
In zeichneText:

C-/C++-Quelltext

1
2
if (m_font == NULL)
    std::cout << "m_font is null" << std::endl;
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

03.12.2013, 18:22

Das hatte er vorher drin und hat es auf meinen Post hin durch nullptr ersetzt. NULL ist Windows-Definition-Kram, aber kein C++ Standard.
Es kann außerdem nicht null sein, wenn es im Konstruktor und nur dort gesetzt wird.
Ich schlage vor er benutzt mal einen Debugger und geht das Zeile für Zeile durch bis es kracht. Der Fehler kann ja sonstwo sein.

Ich persönlich finde es ja bedenklich, dass er erst TTF_OpenFont macht und danach dann TTF_Init. Das stimmt doch sicher nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

18

03.12.2013, 18:25

1. Du rufst TTF_OpenFont vor TTF_Init auf. Laut Doku muss es andersrum sein.
2. Falls der Konstruktor fehlschlägt, macht das Objekt keine Sinn => wirf eine Exception
3. Dein Font wird nicht mehr freigegeben


Dann prüf doch einfach mal, ob m_font == NULL ist. ;)

C-/C++-Quelltext

1
2
if (m_font == NULL)
    std::cout << "m_font is null" << std::endl;

Thema NULL wurde bereits erwähnt. Der Test sollte allerdings weder mit == NULL noch mit == nullptr erfolgen. Zeiger können implizit in bool konvertiert werden - nullptr entspricht false, alles andere true - also if(!m_font) { */ Fehler */ }.

EDIT: Zu langsam
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Gelöschter Benutzer

unregistriert

19

03.12.2013, 19:56

Vielen Dank für eure Antworten! Leider ist der Fehler immer noch da, hier erstmal wieder der Code, danach die Erklärung:

C-/C++-Quelltext

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
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <SDL_ttf.h>
#include "Font.hpp"
#include "Framework.hpp"

using namespace std;

//Konstruktor
CFont::CFont()
{
    //Initialisierung: SDL_ttf
    if(TTF_Init() == -1 )
    {
        cout << "SDL_ttf konnte nicht initialisiert werden!" << endl;
        cout << "Fehlermeldung:"<< SDL_GetError() << endl;
    }
    //Schriftart laden
    m_font = TTF_OpenFont("Data\\FreeSans.ttf", 30);
    if(!m_font)
    {
       cout << "Konnte Schriftart nicht laden!" << endl;
       cout << "Fehlermeldung: " << TTF_GetError() << endl;
    }
}

//Destruktor
CFont::~CFont()
{
}//Desktruktor

//zeichneText: Text auf das Surface schreiben
void CFont::zeichneText(char cText[])
{
    SDL_Color textColor = {0, 0, 0};
    SDL_Surface *NewText;
    NewText = TTF_RenderText_Solid (m_font, cText, textColor); //<-Hier kracht es
    SDL_BlitSurface (NewText, NULL, g_pFramework->GetScreen (), NULL);
    SDL_FreeSurface(NewText);
}//zeichneText

@Steef: TTF_OpenFont und TTF_Init wurden vertauscht :) Was ist eine "Exception"? Wie kann ich die m_font freigeben?

20

03.12.2013, 19:58

Außerdem kannst du den Text noch auf gültigkeit prüfen, also ob überhaupt etwas in deiner cText Variable drin steht. Das kann meines Wissens auch zum Absturz führen. Auch wenn das hier nicht der Fall zu sein scheint.

Werbeanzeige