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

1

07.09.2010, 18:28

SDL_TTF Zugriffsfehler

Hi,
ich progge gerade mal wieder mit SDL_TTF, aber jetzt tritt ein Fehler auf zu dem ich einfach keine Lösung finde.

Unbehandelte Ausnahme bei 0x67b8406f
0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000010.


bei


C-/C++-Quelltext

1
m_ptext = TTF_RenderText_Solid(m_pfont,mssinteger.str().c_str(),color);



Es gibt bereits einige Einträge dazu in diesem Forum, von denen alle darauf hinauslaufen, dass m_pfont 0 ist. Bei mir ist das aber nicht so. ?(

Auch sehr merkwürdig ist, dass der Fehler erst beim zweiten Aufruf auftritt.
Was soll ich tun ??

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

07.09.2010, 18:34

Zeig doch mal bitte den ganzen Code, dann kann man vielleicht eher sehen, woran es liegt. Zur Zeit ist unklar, welchen Wert welche Variablen haben und wo/wie sie diesen Wert erhalten, evtl. liegt ja auch dort dein Fehler :o
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

3

07.09.2010, 18:59

Der ist dummerweise schon sehr lang geworden,weil auch die TTF funktioniert hat, bevor ich die Schriftart geändert hab (ist im richtigen Ordner ;) ), aber die wichtigen Teile schick ich mal rüber.

main.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
g_pframework->m_pFont = TTF_OpenFont("FreeSans.ttf",30);
if(!g_pframework->m_pFont)
{
    cout << "Konnte Font File nicht öffnen!" << endl;
    quitSDL();
    return 1;
}
...


game.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
int Cgame::run()
{
    while(brum == true)
    {
        processevents();
        update();
        render();
    }
    return 0;
}


Beim zweiten write_ text tritt der Fehler auf

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
int Cgame::render()
{
    Ctext text;
    text.write_text(0,0,0,"Würfel1");
    text.render(20,75);


    text.write_text(0,0,0,"Würfel2");

    text.render(80,75);
    text.quit();
}


text.hpp & .cpp

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#ifndef TEXT_HPP
#define TEXT_HPP

#include "framework.hpp"

using namespace std;

class Ctext
{
    public:
        Ctext();

        void quit();
        void write_text(int size,int R,int G,int B,const char text[]);
        void write_int(int size,int R,int G,int B,int integer);
        void Render (int xpos,int ypos);

    private:
        SDL_Surface *m_pScreen;
        SDL_Surface *m_pText;
        SDL_Rect m_Rect;
        SDL_Color mcolor;
        TTF_Font* mfont;
        int msize;
        stringstream mssinteger;
};

#endif


//text.cpp






#include "text.hpp"

Ctext::Ctext()
{
    // Zeiger auf Screen holen
    m_pScreen = g_pFramework->m_pScreen;
    mfont = g_pFramework->m_pFont;
}

void Ctext::quit()
{
    TTF_CloseFont (mfont);

    // Surface freigeben
    SDL_FreeSurface (m_pText);
    m_pText = NULL;
}

void Ctext::write_text(int size,int R,int G,int B,const char text[])
{
    msize = size;
    mcolor.r = R;
    mcolor.g = G;
    mcolor.b = B;
    m_pText = TTF_RenderText_Solid(mfont,text,mcolor);
}

void Ctext::write_int(int size,int R,int G,int B,int integer)
{
    msize = size;
    mcolor.r = R;
    mcolor.g = G;
    mcolor.b = B;

    mssinteger.clear();
    mssinteger.str ("");
    mssinteger << integer;

    m_pText = TTF_RenderText_Solid(mfont,mssinteger.str().c_str(),mcolor);
}

void Ctext::Render (int xpos,int ypos)
{
    m_Rect.x = xpos;
    m_Rect.y = ypos;

    // Text rendern
    SDL_BlitSurface (m_pText, NULL, m_pScreen, &m_Rect);

}


Die letzten beiden sind komplett vom Rest nur wichtige Ausschnitte

4

07.09.2010, 19:32

Fehlt beim Aufruf von Ctext::write_text() nicht ein Parameter? :huh:

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

07.09.2010, 19:42

Aye, er übergibt den string zu früh.
Du übergibst nur 3 integer, anstatt 4, nämlich size, r und g aber statt bei b einen integer zu setzen übergibst du hier schon den string. Oder seh' ich das falsch? :D
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

6

07.09.2010, 19:47

oh sorry, hab den ersten Parameter gelöscht, weil er eh nichts bewirkt, es aber in der Text Datei vergessen

Würde aber sowieso einen compiler fehler geben, aber den gibts ja nicht

7

07.09.2010, 19:58

Hm...Stürzt das Programm, wenn du nur jeweils ein Ctext::write_text() und Ctext::render() hast, dann dafür im zweiten Frame, also beim zweiten Aufruf der CGame::render() ab? Wenn nicht würde ich in der Ctext-Klasse die Fehlersuche beginnen.

8

08.09.2010, 13:31

Ja beim zweiten Frame stürzt es ab.
Eigentlich unterteilt meine Render-Funktion nach gamestates und im start-gamestate wird sowieso nur eine überschrift gerendert

9

08.09.2010, 14:06

Ich seh gerade, dass du in Ctext::quit() TTF_CloseFont() aufrufst. Diese Funktion gibt die Ctext::mfont frei, die wiederum nicht der Klasse "gehört" sondern auf g_pFramework->m_pFont zeigt. Wenn du sie also nicht jeden Frame neu lädst, ist es klar, dass es beim 2. Mal einen Fehler gibt.

--> Kommentiere in Ctext::quit() mal die TTF_CloseFont(...)-Zeile aus, oder kommentier den ganzen Ctext::quit() Aufruf aus, und teste.

10

08.09.2010, 14:37

OK, danke, es funktioniert :D
aber warum zeigt mfont in diesem Fall im Debugger immer dasselbe an??

Werbeanzeige