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

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

1

31.05.2012, 19:33

SFML sf::Text Bug

Hi Leute,

Ich hab mir ein Inventar für ein 2D-Game gecodet, wollte wieder etwas hinzufügen und bin dabei auf diesen Bug gestoßen:
Wenn ich mir einen sf::Text in der Item-Klasse mache und ihn zeichnen will crashed das Game!
Der Debugger sagt dazu folgendes: Zugriffsverletzung beim Lesen an Position 0x01000070.

Ich hab mich auch schon etwas schlau gemacht und bin auf diese Seite gestoßen: https://github.com/LaurentGomila/SFML/issues/59 , wo drinnensteht, dass es ein bekannter Bug ist und er wegen dem DefaultFont auftritt.
Als fix soll man einfach ein eigenes Font benutzen, hat aber bei mir auch nichts geholfen.

Komisch außerdem ist, dass ich schon viele sf::Text im Code habe und alle ohne Probleme funktionieren. Vielleicht hängt es ja auch damit zusammen, dass ich eine std::list für die Items verwende. Ich hab alles ausprobiert, was ich so als Lösung gefunden hab (zB. den String als Referenz übergeben, den Text jeden Frame neu erstellen, usw...)

Hier noch die komplette Item-Klasse, die beim Rendern (Game->Draw(NumberText); ) den Crash verursacht.
Item.h: http://codepad.org/e4vsycV1

Item.cpp: http://codepad.org/U8ddn42S

Habt/kennt ihr auch diesen Bug und wisst ihr vielleicht wie man ihn doch umgehen kann? Oder hab ich etwas anderes falsch gemacht, was garnichts mit SFML zu tun hat?

MfG Geheim!

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

2

31.05.2012, 20:01

Der Code sieht soweit unverdächtig aus, womöglich woanders ein Schreiben über Array-Grenzen. Der SFML Bug führt "nur" zu einem Crash beim Beenden des Programms, das kann nicht die Ursache sein.
Ein Hinweis noch: Benutze lieber die setFont und setText Methoden von sf::Text, statt ihn jedesmal neu zu konstruieren und zuzuweisen. Das sollte aber nicht die Fehlerursache sein; falls doch hast du einen weiteren SFML-Bug gefunden. :)

EDIT: Ich sehe gerade, dass bei dir sf::String schon sf::Text heißt, die Methodennamen aber noch großgeschrieben sind. Vielleicht solltest du mal updaten (es werden/wurden oft Bugs gefixt). Das GitHub Repository hast du ja schon gefunden.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

31.05.2012, 20:11

Likest du die SFML als dll oder als statische Library?

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

4

31.05.2012, 20:13

Das mit dem Array hab ich schon überprüft und daran liegt es (leider) nicht. Lieber wärs mir eh, wenns nur beim Programmende crashen würde.
Und das mit dem neu erstellen war mein letzter Versuch den Crash zu verhindern, was auch nicht funktioniert hat (Update ist sonst eh leer)

Jap ich hab zurzeit noch die ältere Version, hilft ja jetzt eh nichts mehr, ich werd mir mal die neueste Version besorgen.
Ich melde mich dann wieder, ob sich etwas geändert hat.

@dot: Ich linke es statisch.

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

5

31.05.2012, 23:14

So hab alles auf die neueste Version geupdatet und jetz auch statt statisch die dll´s verlinkt ;)
Leider funktioniert es immer noch nicht...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

31.05.2012, 23:15

Was genau meinst du mit "statisch die dll's verlinkt"?

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

7

31.05.2012, 23:19

Likest du die SFML als dll oder als statische Library?

Als dll, das mein ich ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

31.05.2012, 23:21

Das kann afaik potentielle Probleme bereiten wenn du nicht ganz genau weißt was du tust, da die SFML offenbar z.B. std::string Objekte über die dll Grenze reicht. Damit das funktioniert, solltest du die SFML selbst kompilieren und aufpassen dass du die richtige Runtime linkest bzw. generell aufpassen dass du sowohl in deinem SFML Kompilat als auch in deiner Anwendung den gleichen Compiler und die gleichen Flags verwendest etc. (d.h. du wirst zwei Versionen der dll für Debug und Release brauchen und musst darauf achten dass auch immer die richtigen verwendet werden usw.)

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

9

31.05.2012, 23:30

Hab ich alles gemacht. Mit CMake, jeweils 2 mal für Debug und Release
und auch extra darauf geachtet dass es für die jeweilige Version ist und
auch dass es nicht 2 mal dasselbe Flag ist. Auch hab ich alles mit demselben Compiler gemacht. Es crashed schon wenn ich nur
einen leeren sf::Text erstelle und ihn zeichnen will. Aber nur bei der
Item-Klasse. Ich hab andere Klassen mit sf::Text, wo alles Problemlos
funktoniert.

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

10

02.06.2012, 00:17

Hi ich bins nochmal,

Ich hab wieder etwas rumprobiert und bin zu folgendem gekommen:

C-/C++-Quelltext

1
2
3
4
5
6
7
void Item::Update(sf::Clock &Clock, std::stringstream &stream)
{
    //Stream bekommt die Anzahl der Items und lässt es dann als Text erscheinen
    stream.str("");
    stream<<Number;
    NumberText.setString("");           //Solang nichts drinnen ist, funktioniert das setzen
}


Sobald aber ein x-Beliebig großer String gesetzt wird, crashed es schon beim setzen!

Danach hab ich probiert ihn jedesmal neu zu erstellen:

C-/C++-Quelltext

1
2
3
4
5
6
7
void Item::Update(sf::Clock &Clock, std::stringstream &stream)
{
    //Stream bekommt die Anzahl der Items und lässt es dann als Text erscheinen
    stream.str("");
    stream<<Number;
    NumberText = sf::Text("", MyFont, 12);      //Das setzen funktioniert immer
}


Diesmal kann man jeden String übergeben und es crashed noch nicht. Wenn der String leer ist, crashed es nicht, wenn man es rendert, wenn irgendetwas drinnen ist crashed es wieder...

Der Debugger sagt dazu: Unbehandelte Ausnahme bei 0x100101e6 (sfml-graphics-d-2.dll)
Es wird unterbrochen bei der Datei "xtree" in der Zeile 1264: _Nodeptr _Pnode = _Root();

Ich weiß leider nicht mehr weiter, würde aber gerne wieder weiterarbeiten :hmm:

MfG Geheim!

Werbeanzeige