Konstuktor initialiert Werte falsch?
-
Wenn es eine Compilerkonfiguration gibt, in der eine Funktion fehlerhaftes Verhalten produziert, ist sie fehlerhaft. Diese Sichtweise solltest du dir schnellstmöglich angewöhnen, sonst bringst du es höchstens zum Webdesigner.
Undefinierter Speicher im Zusammenhang mit der Verwendung eines Singletons -- es ist ohne Codebeispiel, das den Fehler reproduziert (hint, hint) natürlich unmöglich, den Fehler mit Bestimmtheit zu finden, aber ich rate jetzt mal wild:
Passiert dieser ganze Kram, bevor main betreten wird? In diesem Fall könnte es sein, dass du dir ein static initialisation order fiasco gebaut hast. Das läuft dann so:
Globales Objekt A benötigt zur Initialisation globales Objekt B. Globales Objekt B ist zu diesem Zeitpunkt aber noch nicht initialisiert, also macht die Initialisierung des globalen Objektes A Unfug.
Da die Reihenfolge, in der globale Objekte initialisiert werden, nicht bis ins kleinste Detail geregelt ist, können sich verschiedene Compilerkonfigurationen hier voneinander unterscheiden - womöglich wird in der Debug-Version zunächst Objekt B, in der Release-Version aber Objekt A zuerst gebaut. Das kann dann passieren, wenn Objekte A und B sich in verschiedenen Übersetzungseinheiten befinden, sonst garantiert der Standard die Abarbeitung von oben nach unten.
Man muss hier natürlich peinlich auf die Vermeidung von Zirkelbezügen achten, ansonsten lässt sich das ganze Problem umgehen, indem man das Objekt in eine Funktion verpackt:
// Statt // // singleton instance; // // ... // // instance.do_something(); singleton &instance() { static singleton self; return self; } ... instance().do_something();Allerdings muss man auch hier etwas aufpassen: Die Zerstörungsreihenfolge ist ähnlich komplex vorhersagbar. Es ist mitunter problematisch, wenn globale Objekte sich gegenseitig in ihren Destruktoren benutzen.
Dies ist natürlich nur einer der Gründe, warum Singletons eine Anti-Pattern sind. Gibt es irgendeinen wirklichen Grund, das ganze als Singleton zu behandeln anstatt als normale Klasse?
Übrigens, nur am Rande: Das englische Wort für Höhe ist "height", nicht "hight".
-
Hatte die letzten 2 Tage kein Internet -.-
Aber ich entdeck echt nix und wüsste auch nicht wie weit ich den code kürzen müsste damits nachstellbar ist
Ich hab hier jetzt mal das ganze Projekt hochgeladen (Compiler: Microsoft Visual C++ 2010 Express):
https://rapidshare.com/files/1087224170/Coingame.zipUm es zu compilieren musst du dir noch die SFML 1.6 laden und in C:/ abspeichern:
http://sfml-dev.org/download.phpVielleicht verstehst dus ja

-
SMFL 1.6 finde ich nur für VS2005 und VS2008.
-
seldon schrieb:
[...] Codebeispiel, das den Fehler reproduziert (hint, hint) [...]
Ich darf das um "minimales" ergänzen?

-
Also bei mir funktionierts mit der 1.6 für 2008.
Glaubst du daran könnt's liegen dass der Debugmodus nicht läuft?@Swordfish: Wie gesagt ich weiß nicht wie viel ihr braucht um das ganze nachzustellen weil ich nicht genau weiß wo der Fehler auftritt.
Ich fand die Losung jetzt ganz elegant weil ihr ja trotzdem mit 3 Klicks alles nachstellen könnt
-
greece57 schrieb:
Also bei mir funktionierts mit der 1.6 für 2008.
Absturz bei Debug und falsche Werte bei Release nennst du "funktionieren"?
greece57 schrieb:
Glaubst du daran könnt's liegen dass der Debugmodus nicht läuft?
Ja.
-
greece57 schrieb:
Wie gesagt ich weiß nicht wie viel ihr braucht um das ganze nachzustellen [...]
DU sollst es soweit wie möglich kürzen daß bei minimaler Codemenge der Fehler reproduzierbar bleibt.

-
Absturz in Debug reproduzierbar mit
#include "SFML/Graphics.hpp" int main() { sf::String sftext; }Ziemlich sicher, dass es an der falschen Version von SFML liegt.
-
Projekteigenschaften -> Konfigurationseigenschaften -> Allgemein -> Plattformtoolset -> v90 einstellen, dann benutzt der im Backend den 2008er-Compiler, und es müsste mit Bibliotheken für vc2008 funktionieren.
Die in VC2010 neuen Features gibt es dann allerdings natürlich nicht.
-
Einfach die neueste Version selbst kompilieren, da sind VS Projekte bei, das ist wirklich nicht schwer.
-
Ok dh ich habe einfach nur die falsche sfml Version benutzt und deswegen is dieser koomische "Fehler" aufgetretten?
Gut dann danke an alle! Werde es mit dem selbst kompilieren versuchen