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

DarioFrodo

Treue Seele

  • »DarioFrodo« ist der Autor dieses Themas

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

1

07.03.2014, 20:36

[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.

Ein Screenshot aus dem Debugger:

(Link)


Projekt als Zip-Archiv zum download

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)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

07.03.2014, 21:12

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.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DarioFrodo

Treue Seele

  • »DarioFrodo« ist der Autor dieses Themas

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

3

07.03.2014, 21:40

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.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

4

08.03.2014, 00:40

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 :P ) .
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 ;) .

Grüße Benjamin

5

08.03.2014, 01:09

Wenn C++, dann richtig. Benutze std::vector und std::array.

C-/C++-Quelltext

1
2
3
mIndexBuffer = new int(mIndexBufferSize);
//...
mIndexBuffer[m] = vertexCursor;
"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

Tobiking

1x Rätselkönig

  • Private Nachricht senden

6

08.03.2014, 07:23

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.

DarioFrodo

Treue Seele

  • »DarioFrodo« ist der Autor dieses Themas

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

7

08.03.2014, 07:35

@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.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

DarioFrodo

Treue Seele

  • »DarioFrodo« ist der Autor dieses Themas

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

8

08.03.2014, 08:22

Okay, ich habe den Fehler gefunden..
ich hatte geschrieben:

C-/C++-Quelltext

1
mIndexBuffer = new int(mIndexBufferSize);

anstatt

C-/C++-Quelltext

1
mIndexBuffer = new int[mIndexBufferSize];


Mit ersterem Aufruf erstelle ich ein int mit dem Wert mIndexBufferSize mit dem 2. Aufruf erstelle ich ein int Array mit mIndexBufferSize Elementen.
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 ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

08.03.2014, 08:37

Mit std::vector<int> wäre das schneller aufgefallen. ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige