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

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

11

13.02.2011, 12:05

Ok danke^^ Ich hab das mal so gemacht, wie du meintest (

C-/C++-Quelltext

1
 SchriftLinks.Surface                    = TTF_RenderText_Solid(Font, "0" + IntToStr(PointsLeftPlayer), textColor); 
) und bei mir kommt dann der Fehler:

Zitat

|148|error: cannot convert 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >' to 'const char*' for argument '2' to 'SDL_Surface* TTF_RenderText_Solid(TTF_Font*, const char*, SDL_Color)'|

Was soll ich denn jetzt ändern?^^
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

12

13.02.2011, 13:32

Du musst offensichtlich ein const char* übergeben. Also probierst du entweder mal:

C-/C++-Quelltext

1
2
std::string score = "Der Text" + IntToStr(Punkte);
SchriftLinks.Surface = TTF_RenderText_Solid(Font, score.c_str(), textColor);


Wenn du es unbedingt in einer Zeile lassen willst, kannst du auch das probieren(hab es jetzt aber nicht getestet)

C-/C++-Quelltext

1
SchriftLinks.Surface = TTF_RenderText_Solid(Font, ("Text" + IntToStr(var)).c_str(), textColor);

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

13

13.02.2011, 14:25

Ok, ich habs jetzt geschaft! :D

Vielen dank für eure Hilfe!



Mit freundlichen Grüßen

Jawaiica'
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

14

18.02.2011, 19:55

Moin,

ich hab nochmal eine Frage an euch und zwar, wieso mir wieder der memory aus geht... hier erstmal der Link: http://codepad.org/NXB7psEN

Ich suche schon sehr lange nach einer Lösung aber ich finde sie einfach nicht =( Das Spiel hört bei mir nach ~120 Sekunden auf und wenn ich die log öffne, dann krieg ich halt den selben Fehler, den ich ja schon einmal hatte. =/
Ich habe irgendwie das Gefühl, dass es am unteren Teil meiner While-schleife liegt, nur ich weiß nicht, wie ich das beheben soll =(

P.s.: Sorry für die Unordnung, ich wollte den Code eh nochmal ein bisschen abändern, nachdem der Fehler weg ist.
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

15

18.02.2011, 20:01

Dokumentation SDL_ttf: TTF_RenderText_Solid

Zitat

Returns: a pointer to a new SDL_Surface. NULL is returned on errors.
Hier entstehen also massig Memoryleaks! Bei jedem Schleifendurchgang erzeugst du eine neue Surface (mit Text) und überschreibst immer den Zeiger.
Einmal die Funktion aufrufen (außerhalb der Schleife) und dann in der Schleife die Surface nur rendern (wie gewohnt).

Beziehungsweise, wenn sich ja der Text ändern soll, dann solltest du vorher die alte Surface freigeben.

Gruß
SaRu_

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

16

18.02.2011, 20:03

vielleicht solltest du die sfml verwenden. dort wird kein speicher reserviert, den man selbst wieder freigeben muss, wenn man kein new verwendet.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

17

18.02.2011, 21:50

Hmm ich hab jetzt nicht ganz verstanden, wie ich das machen soll, wenn der Text geändert wird. Ich hab jetzt die Fonts vor die Schleife gepackt nur wie gebe ich das Surface frei? Ich hab es mit SDL_FreeSurface() versucht und mit = NULL; aber es geht irgendwie nicht =(

edit: Sorry ich glaub jetzt geht es^^

edit2: Oder auch nicht... Hier so hab ich das mal gemacht ( in der while schleife ) : http://codepad.org/CC9nEff2
aber da geht es auch nach ner Zeit weg..
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Jawaiica« (18.02.2011, 22:00)


18

18.02.2011, 22:25

Ich bin mir nicht sicher ob du das "Freigeben" richtig verstanden hast:

Das hier ist kein "Freigeben":

C-/C++-Quelltext

1
2
3
4
5
6
//Surface frei geben
        SchriftLinks.Surface                    = NULL;
        SchriftRechts.Surface                   = NULL;
        Timer.Surface                           = NULL;
        Timer2.Surface                          = NULL;
        Richtung.Surface                        = NULL;


Du setzt lediglich die Zeiger auf die Surfaces alle NULL (löschst also praktisch die Zeiger). Die Objekte die auf dem Heap allerdings erzeugt wurden und auf die diese Zeiger gezeigt haben, die bestehen weiterhin. Genau so entsteht ja eine Memoryleak. Also setze niemals einen Zeiger gleich NULL, wenn du dir nicht sicher bist, dass das Objekt auf das er zeigt freigegeben / gelöscht wurde (mit delete).

Dieses Freigeben bei Surfaces übernimmt bei der SDL die von dir schon angesprochene Funktion SDL_FreeSurface(). Es ist auch sicher, dieser Funktion einen NULL-Pointer zu übergeben, dann geschieht einfach gar nichts. Also sollte das hier durchaus funktionieren:

C-/C++-Quelltext

1
2
SDL_FreeSurface(Schrift.Surface);
Schrift.Surface                    = TTF_RenderText_Solid(Font,        ("Irgendwas"            ,   textColor);


Gruß
SaRu_

Jawaiica

Treue Seele

  • »Jawaiica« ist der Autor dieses Themas

Beiträge: 134

Wohnort: Hannover

Beruf: Student

  • Private Nachricht senden

19

19.02.2011, 14:02

Hallo,

danke erst einmal, ich hatte das anscheinend falsch gemacht jedenfalls geht das jetzt, nur ich habe immer noch ein Memoryleak und ich weiß auch schon genau wo, nur ich weiß nicht, wie ich das beheben soll. Hier erstmal der Codeabschnitt:

http://codepad.org/2oYRVBd0


Der soll nur bezwecken, dass wenn die Zeit kleiner als 0.5 ist, zwei Surfaces ausgeblendet werden. Ich dachte, ich schaffe das so, aber naja, so führt das zu einem Absturz nach ~2 min.
Hat jemand von euch eine Idee, wie ich die beiden Surfaces ausblenden könnte, ohne ein Memoryleak zu produzieren?

MfG


Jawaiica'
"Die Sekunde ist die Dauer von 9 192 631 770 Perioden der Strahlung, die dem Übergang zwischen den beiden Hyperfeinstrukturniveaus des Grundzustandes des Atoms Caesium 133 entspricht."

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

20

19.02.2011, 14:14

du musst speicher den du reservierst wieder freigeben. wenn du etwas ausblenden willst zeichnest du es einfach nicht und TTF_RenderText_Solid solltest du wie IMG_Load einmal aufrufen und so lange nutzen bis du es nichtmehr brauchst und dann freigeben. d.h. raus aus der hauptschleife damit.

schau dir nochmal dein buch an...


stell dir vor du würdest eine wohnung mieten(speicher für bilder und strings reservieren) in der du wohnst(zeichnen). normalerweise mietet man die wohnung, schreibt sich die adresse auf und übernachtet dort bis man auszieht. du suchst dir jeden tag eine neue wohnung, schreibst dir aber die neue adresse auf, kündigst die alte nicht und wirfst die adresse aus dem fenster und übernachtest dort ein mal und suchst dir wieder ne neue wohnung. wenn du dich entschließt offiziell umzuziehen(oder zu sterben, weils besser zum beenden des programms passt) und kündigst du die aktuelle wohnung.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (19.02.2011, 14:23)


Werbeanzeige