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!
[geschlossen] C++, Array grenzen, for-schleifen, Fehler beim aufruf von printf
Hallo ihr Lieben Forumsleute,
hier bin ich mal wieder seit langem mit einem Problem.
Für Denkanstöße oder ähnliches wäre ich euch sehr dankbar.
Verwendete Compiler:
- Visual Stduio 2012
- MinGW + CodeBlocks
Für mein Spiel Spacecraft habe ich eine Möglichkeit gesucht um ein Skalarfeld, oder ein Feld von Blöcken (ähnlich Minecraft) organischer darzustellen,
als einfach nur Blöcke zu rendern. Ich bin auf den Marching Cube Algorithmus gestoßen, sowie auf einen der sich Surface Nets nennt.
Der letztere scheint mir besser für mein Vorhaben geeignet zu sein, weswegen ich versucht habe eine Javascript Implementierung davon
(https://github.com/mikolalysenko/mikolal…/surfacenets.js) nach C++ zu portieren.
Grundsätzlich funktioniert meine Implementierung auch... manchmal. Es zeigt ein Donut und eine Kugel an, die aus einem Skalarfeld generiert wurden mit den minimal dafür notwendigen Vertices
Es sieht bei mir genauso aus, wie bei der webGL Demo von der oben genannten Implementierung.
(Ich verwende auch den gleichen Algorithmus wie mikolalysenko für die Generierung der Testdaten)
Dennoch stürzt mein Programm öfter ab, wenn ich versuche es zu debuggen (mit Visual Studio) dann springt er in eine Unterfunktion die von printf aufgerufen wird.
Das nächste printf das ich aufrufe, nachdem ich das Surfacenets fertig generiert habe.
Im Algorithmus der aus mehreren verschachtelten for-Schleifen besteht prüfe ich vor jedem Array-Zugriff ob der Index gültig ist.
Habt ihr Ideen, Denkanstöße in welche Richtung ich noch suchen könnte um den Fehler ausfindig zu machen?
Vielleicht ist auch mein C++ etwas eingeschlafen, da ich seit ca. 1 Jahr sehr viel mit Lua-Script arbeite.
Liebe Grüße
das programmierende Einhorn
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann
Man verkauft die Erde nicht, auf der die Menschen wandeln.
- Indianerweisheiten
Ich bin auch ein einhornimmond
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DarioFrodo« (08.03.2014, 10:25)
kleiner Tipp: Da unten ist der CallStack zu sehen. Ich würde Dir raten da mal nach unten zu scrollen, bis Du Code von Dir findest. Und dort dann fixen.
Da stehen nur Aufrufe drin, mit denen ich nichts zu tun habe und am Ende steht das hier: Die von Visual Studio maximal unterstützte Stapelrahmenanzahl wurde überschritten.
Die Aufrufe die man im Screenshot sehen kann wiederholen sich im Aufrufstack.
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann
Man verkauft die Erde nicht, auf der die Menschen wandeln.
Hm, also ich hab einfach mal nach "Stack Frame" gegooglet und dann kam das dabei raus: http://www.a-m-i.de/tips/stack/stack.php .
Vielleicht hilft dir der Link weiter (er geht ziemlich ins technische und auf wirklich maschinennahe Ebene, aber das kann bei C++ ja schon mal passieren ) .
Im Abschnitt "Aufrufkonventionen" wird auch einmal "printf()" erwähnt und dass die variable Parameterliste besonders an dieser Funktion ist (vielleicht liegt da ja ein Knackpunkt).
Ob die Seite jetzt konkret bei dem Problem hilft oder nicht weiß ich nicht und um die Uhrzeit bin ich da auch nicht mehr so fähig das zu beurteilen. Vielleicht können da die Experten eher helfen . Aber 'nen Blick is' es ja zumidnest mal wert und auch so interessant zu lesen .
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon
Wenn man nach dem Fehler nicht mehr zurück kommt, muss man sich von vorne rantasten. Breakpoint setzen und durchsteppen. Mit conditional Breakpoints kommt man auch bei Schleifen mit vielen Iterationen ganz gut zum Übeltäter.
@bennichamp danke, ich habe mal reingeschaut, meine Vermutung das ich irgendwo in ein nicht mehr reserviertes Array schreibe verstärkt sich dadurch noch.
@Steef am Anfang hatte ich sogar einen std::stack benutzt, aber da dort der Fehler schon beim aufrufen der stack.push funktion aufgetreten ist, habe ich die Stacks durch einfache C-Arrays ersetzt.
@Tobiking Das habe ich gemacht, ich habe mich bis ans Ende der Schleifen vorangetastet, ohne Fehler. Dann kam ein printf (mit nem simplen "Hallo\n" drin) und da schlug dann der Debugger an.
Vielleicht wird an irgendeiner Stelle ein Dekonstruktor meiner Objekte aufgerufen, wo ich es nicht erwarte, das werde ich jetzt mal durchprüfen.
Vielen Dank für eure Hilfe so weit
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann
Man verkauft die Erde nicht, auf der die Menschen wandeln.