anfänger hat probleme mit globalen variablen
-
Trantüte schrieb:
ich hab leider kein debugger
aber ich schätze mal das wird nichts bringen weil der compiler es ohne probleme kompiliert.
Natürlich bringt das uU was, weil du den Debugger ja zur Laufzeit betreibst.
Trantüte schrieb:
zum thema debugger kannt du mir einen empfehlen un dgibt es sowas eventuell kostnlos?
Beim Dev-C++ ist zB einer dabei (gdb), ist in der aktuellen Version der IDE sogar benutzbar. Wenn du einen richtig genialen Debugger suchst, dann solltest du dir mal VC++ Express 2005 anschaun. Über die kostenlose Beta IDE gibts mehr als genug Threads hier im Forum.
-
der debugger bringt daher nichts weil ich ja schon weiß wo der fehler passiert nämlich wenn er verscuht das globale objekt der klasse adresse namens eins initialisieren will.
mfg david
-
-
NATÜRLICH bringt er was.. er ist zur LAUFZEIT...
er hält an, wenn ein fehler ist..
tipp: haltepunkte
-
Hallo
und der Debugger zeigt dir die tatsächlichen Werte der Variablen und Zeiger an.
bis bald
akari
-
Trantüte schrieb:
der debugger bringt daher nichts weil ich ja schon weiß wo der fehler passiert nämlich wenn er verscuht das globale objekt der klasse adresse namens eins initialisieren will
Und jetzt lässt du deinen Debugger auf den adresse ctor los, gehst jede Codezeile Schritt für Schritt durch und schon siehst du mehr.
Trantüte schrieb:
hab noch vergessen zu fragen ob der vc++ express 2005 auf deutsch is?
nee, ist englisch
-
hab mal nach dem vc++ express 2005 geschaut aber nicht so das passende gefunden.
bei einer homepage konnte man ihn zwar downloaden allerdings ist der wohl 60 mb gross und ich hab nur ein 56k modem
.
dann konnte man ihn auch per cd bestellen da konnte man aber wieder nicht deutschland als land auswählen.
kannst mir nen link posten oder nen anderen (möglichst deutschen) debugger empfehlen?
mfg david
-
Ja, VC++ express 2005 ist knapp 70MB, dazu kommen nochmal 25MB .NET Framework 2.0, was du auch brauchst. Ist mit 'nem Modem schon etwas heftig, dafür bekommst du aber auch 'ne klasse IDE.
Wie gesagt, es gibt dann noch den gdb. der ist zB bei Dev-C++ dabei. Welche IDE bzw welchen Compiler benutzt du denn?Wenn du keinen brauchbaren Debugger findest, dann gibt es auch noch 'ne andere Möglichkeit. Du baust dir selbst 'ne Art Mini-Debugger. Dazu baust du in deinen Code (in deinem Bsp wäre ein Anfang im adresse ctor sinnvoll) Zeile für Zeile Ausgaben in eine Log-Datei ein. Das sieht dann zB so aus
log("1"); foo(); log("2"); bar(); log("3"); baz(); log("4"); //...
Wenn dann in deiner Log-Datei zB folgendes steht
1
2dann weisst du, dass dir in bar() das Programm abgestürzt ist. Dann gehst du halt zu bar() und machst dort genau das gleiche. Solange bis du die Codezeile mit dem Fehler exakt kennst.
-
Ich hab ein ähnliches Problem.
Mein Programm ist ungefähr so strukturiert:
#includes ifdefs defines Datentypen Vorwärtsdefinitionen aller implementierten Funktionen globale Variablen implementation der Funktionen
bei den globalen Variablen steht
bool g_wireframe = false;
und in einer der Funktionen (Keypressed Behandlung) mach ich folgendes:
switch (key){ ... case 'w': case 'W': g_wireframe != g_wireframe; if (g_wireframe) glPolygoneMode(GL_FRONT_AND_BACK,GL_LINE); else glPolygoneMode(GL_FRONT_AND_BACK,GL_FILL); break; ... }
Leider wird anscheinend g_wireframe niemals geändert, bzw. OpenGL ändert niemals den PolygoneMode (was nur an der Variable hängen kann. Da bin ich mir sicher).
Da ich anscheinend net qualifiziert genug bin mein Visual Studio an der Stelle zum halten zu bringen (bin eigentlich Delpher, da geht sowas mit einem klick) gibts für mich nur 2 Möglichkeiten:
1. Die behandlung von "w" wird niemals erreicht oder
2. Die Breakpoints gehen net.Für ersteres spricht, das der Compiler mal was von Seiteneffekt erwartet gefaselt hat (jetzt net mehr). Für zweites spricht, dass ein Breakpoint in einer immer wieder aufgerufenen Funktion niemals anspringt.
Könnt ihr mir weiterhelfen? Danke
-
Kev schrieb:
Leider wird anscheinend g_wireframe niemals geändert
LOL. Nun das liegt daran, dass es die logische Negation (!) nicht als Assignment Operator gibt. Wird es auch nicht geben, da dies schon der Operator für die Prüfung auf Ungleichheit ist. Du willst wahrscheinlich eher sowas
g_wireframe = !g_wireframe;
-
Ja habe ich heute auch raus gefunden. Danke trotzdem.
-
ich benutze nen borland compiler. ich mach das dann per hand im dos modus geb ich dann bcc32 -tWC quelldatei.cpp ein. ;o)
der dev bla ist sicherlich auch english oda?
mfg david
ps: zu meinem problem was eigentlich der grund dieses threads ist, weiß ich schon bei welcher codezeile er sich aufhängt. und das habe ich durch auskommentieren herausgefunden. er kann einfach nicht diese globale instanz der klasse "adresse" anlegen.
-
Trantüte schrieb:
der dev bla ist sicherlich auch english oda?
Du meinst Dev-C++? Nein, das ist auch deutsch. Ist aber nur die IDE, der mitgelieferte Compiler ist GCC (MinGW Port).
Trantüte schrieb:
ps: zu meinem problem was eigentlich der grund dieses threads ist, weiß ich schon bei welcher codezeile er sich aufhängt. und das habe ich durch auskommentieren herausgefunden. er kann einfach nicht diese globale instanz der klasse "adresse" anlegen.
Das ist aber zu ungenau für eine konkrete Fehleranalyse, da musst du schon im ctor weiter analysieren.
Wenn es nicht allzu viel Code ist, dann kannst du den auch mal komplett hier reinstellen. Ich bin mir sicher, da wird sich schon jemand finden, der das mal analysiert. Besser wäre es aber schon, wenn du das selbst hinbekommst. Dann weisst du auch beim nächsten mal, was zu machen ist.
-
@groove schau mal auf seite eins diese threads, da ist der gesamte code. helfen konnte mir aber trotzdem niemand
mfg david
-
Hallo,
ich habe den Thread jetzt nur kurz überflogen: wie es scheint hat noch keiner
auf das hier vorhande "Nicht-Garantierte-Initialisierungsreihenfolge-von-globalen-Objekten-in-verschiedenen-ÜEs"-Problem hingewiesen.Hast du mal geprüft, ob dein Compiler die richtigen Tricks (z.B. Schwartz-Counter o.ä.) verwendet um zu garantieren, dass seine globalen iostream-Objekte (cout usw.) auch rechtzeitig erzeugt bzw. nicht frühzeitig zerstört werden? Ansonsten schreibst du in deinem globalen Objekt womöglich in ein nicht existentes cout-Objekt.
Zum Testen kannst du einfach mal die cout-Anweisung im Ctor/Dtor durch entsprechende printf-Anweisungen ersetzen.