<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Absturz beim einfügen eines Listenelements]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich versuche mich gerade an meinem ersten Spiel mit DirectX. Es soll ein Tetris Clone werden. Bisher hatte auch alles soweit nach Plan geklappt. Jetzt bin ich aber an dem Punkt angekommen, bei dem die Steine im Feld liegen bleiben sollen. Das versuche ich mit einer Liste zu realisieren. D.h., wenn eine komletter Tetrisstein auf dem Boden (oder später anderen Steinen) aufkommt, werden die einzelnen Steine in eine Liste gespeichert und der TetrisStein wird zerstört, damit ein Neuer runterregnen kann. Soweit so gut ... ich habe jetzt also eine Liste für die Steine geschreiben:</p>
<pre><code class="language-cpp">#pragma once
#include &quot;EinzelStein.h&quot;
#include &quot;Feld.h&quot;
#include &lt;ddraw.h&gt;

class SteinListe {
private:
	class Knoten {
	private:
		EinzelStein* Stein;
		Knoten* Next;

	public:
		Knoten() {
			Next  = NULL;
		}

		~Knoten();

		void SetNext(Knoten* kn) {
			Next = kn;
		}

		Knoten* GetNext() {
			return Next;
		}

		bool HasNext() {
			if (Next != NULL)
				return TRUE;
			else
				return FALSE;
		}

		void SetStein(EinzelStein* _Stein) {
			Stein = _Stein;
		}

		EinzelStein* GetStein() {
			return Stein;
		}
	};

	Feld* Spielfeld;

	Knoten* Head;
	Knoten* End;

public:
	SteinListe(Feld* _Spielfeld);
	~SteinListe(void);

	void Add(EinzelStein* _Stein);
	void Delete(int x, int y);

	void Draw(LPDIRECTDRAWSURFACE7 lpDDSurface);
};
</code></pre>
<p>Sobald ich jetzt Head oder End einen Knoten zuweise (wenn der erste Tetrisstein auf dem Boden aufkommt), bleibt das Programm hängen. Ich weiss durch den Debugger auch genau, an welcher Stelle. In der Add-Funktion:</p>
<pre><code class="language-cpp">void SteinListe::Add(EinzelStein* _Stein) {
	Knoten* kn;
	kn = new Knoten();
	kn-&gt;SetStein(_Stein);

	if (Head == NULL) {
		Head = End = kn;
	}
	else {
		End-&gt;SetNext(kn);
		End = End-&gt;GetNext();
	}
}
</code></pre>
<p>Sobald ich den IF-Block weg mach läuft alles Prima, außer dass die Steine auf dem Boden liegen bleiben. Es stürzt übrigens auch ab, wenn ich statt dem IF-Block nur</p>
<pre><code>Head = kn;
</code></pre>
<p>schreibe.</p>
<p>Ich habe jetzt schon öfters mit Listen gearbeitet und auch mal die lauffähigen Versionen mit dieser hier verglichen. Ich kann aber keinen Unterschied feststellen. Ich verstehe einfach nicht, wieso das nicht läuft.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/198536/absturz-beim-einfügen-eines-listenelements</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 08:46:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/198536.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Nov 2007 13:52:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Absturz beim einfügen eines Listenelements on Thu, 22 Nov 2007 13:52:50 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich versuche mich gerade an meinem ersten Spiel mit DirectX. Es soll ein Tetris Clone werden. Bisher hatte auch alles soweit nach Plan geklappt. Jetzt bin ich aber an dem Punkt angekommen, bei dem die Steine im Feld liegen bleiben sollen. Das versuche ich mit einer Liste zu realisieren. D.h., wenn eine komletter Tetrisstein auf dem Boden (oder später anderen Steinen) aufkommt, werden die einzelnen Steine in eine Liste gespeichert und der TetrisStein wird zerstört, damit ein Neuer runterregnen kann. Soweit so gut ... ich habe jetzt also eine Liste für die Steine geschreiben:</p>
<pre><code class="language-cpp">#pragma once
#include &quot;EinzelStein.h&quot;
#include &quot;Feld.h&quot;
#include &lt;ddraw.h&gt;

class SteinListe {
private:
	class Knoten {
	private:
		EinzelStein* Stein;
		Knoten* Next;

	public:
		Knoten() {
			Next  = NULL;
		}

		~Knoten();

		void SetNext(Knoten* kn) {
			Next = kn;
		}

		Knoten* GetNext() {
			return Next;
		}

		bool HasNext() {
			if (Next != NULL)
				return TRUE;
			else
				return FALSE;
		}

		void SetStein(EinzelStein* _Stein) {
			Stein = _Stein;
		}

		EinzelStein* GetStein() {
			return Stein;
		}
	};

	Feld* Spielfeld;

	Knoten* Head;
	Knoten* End;

public:
	SteinListe(Feld* _Spielfeld);
	~SteinListe(void);

	void Add(EinzelStein* _Stein);
	void Delete(int x, int y);

	void Draw(LPDIRECTDRAWSURFACE7 lpDDSurface);
};
</code></pre>
<p>Sobald ich jetzt Head oder End einen Knoten zuweise (wenn der erste Tetrisstein auf dem Boden aufkommt), bleibt das Programm hängen. Ich weiss durch den Debugger auch genau, an welcher Stelle. In der Add-Funktion:</p>
<pre><code class="language-cpp">void SteinListe::Add(EinzelStein* _Stein) {
	Knoten* kn;
	kn = new Knoten();
	kn-&gt;SetStein(_Stein);

	if (Head == NULL) {
		Head = End = kn;
	}
	else {
		End-&gt;SetNext(kn);
		End = End-&gt;GetNext();
	}
}
</code></pre>
<p>Sobald ich den IF-Block weg mach läuft alles Prima, außer dass die Steine auf dem Boden liegen bleiben. Es stürzt übrigens auch ab, wenn ich statt dem IF-Block nur</p>
<pre><code>Head = kn;
</code></pre>
<p>schreibe.</p>
<p>Ich habe jetzt schon öfters mit Listen gearbeitet und auch mal die lauffähigen Versionen mit dieser hier verglichen. Ich kann aber keinen Unterschied feststellen. Ich verstehe einfach nicht, wieso das nicht läuft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408174</guid><dc:creator><![CDATA[Grendel]]></dc:creator><pubDate>Thu, 22 Nov 2007 13:52:50 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim einfügen eines Listenelements on Thu, 22 Nov 2007 13:58:01 GMT]]></title><description><![CDATA[<p>Kannst du mal den Konstruktor der Liste zeigen? Ich hoffe doch, du hast dort Head mit einem brauchbaren Wert initialisiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408177</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 22 Nov 2007 13:58:01 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim einfügen eines Listenelements on Thu, 22 Nov 2007 14:02:05 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">SteinListe::SteinListe(Feld* _Spielfeld) {
	Head = End = NULL;
	Spielfeld = _Spielfeld;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1408182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408182</guid><dc:creator><![CDATA[Grendel]]></dc:creator><pubDate>Thu, 22 Nov 2007 14:02:05 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim einfügen eines Listenelements on Thu, 22 Nov 2007 14:42:34 GMT]]></title><description><![CDATA[<p>Ich habe mal Screenshots von den Debuggermeldungen gemacht ...</p>
<p><a href="http://www.bilder-hochladen.net/files/4s4s-1-jpg.html" rel="nofollow">http://www.bilder-hochladen.net/files/4s4s-1-jpg.html</a><br />
<a href="http://www.bilder-hochladen.net/files/4s4s-2-jpg.html" rel="nofollow">http://www.bilder-hochladen.net/files/4s4s-2-jpg.html</a></p>
<p>... vielleicht hilft das ja weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408215</guid><dc:creator><![CDATA[Grendel]]></dc:creator><pubDate>Thu, 22 Nov 2007 14:42:34 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim einfügen eines Listenelements on Thu, 22 Nov 2007 14:51:05 GMT]]></title><description><![CDATA[<p>Sehe ich das richtig, this ist 0x0000? Wie hast du denn deine Steinliste angelegt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408223</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 22 Nov 2007 14:51:05 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim einfügen eines Listenelements on Thu, 22 Nov 2007 14:53:52 GMT]]></title><description><![CDATA[<p>Hier ist ein kurzer Auschnitt meiner MainFunktion, in der die Liste angelegt wird:</p>
<pre><code class="language-cpp">Feld* Spielfeld;
VollStein* MainStein;
SteinListe* Liste;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	hWnd = CreateMainWindow(hInstance);

	if (hWnd == 0){
		MessageBox(0, &quot;Fenster konnte nicht erzeugt werde&quot;, &quot;Fehler&quot;, MB_OK);
		return 0;
	}

	if (!ddc.Init(hWnd)) {
		MessageBox(hWnd, &quot;Fehler beim initialisieren von DirectDraw&quot;, &quot;Fehler&quot;, MB_OK);
		return 0;
	}

	Spielfeld = new Feld(10, 10, 8, 13, 35);
	MainStein = new VollStein(3, CalcColor(rand()%256, rand()%256, rand()%256), Spielfeld, Liste);
	Liste = new SteinListe(Spielfeld);

	ZeroGame();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1408225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408225</guid><dc:creator><![CDATA[Grendel]]></dc:creator><pubDate>Thu, 22 Nov 2007 14:53:52 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim einfügen eines Listenelements on Thu, 22 Nov 2007 14:59:55 GMT]]></title><description><![CDATA[<p>Und wer ruft das Add() auf? Hoffentlich nicht der Konstruktor von MainStein (wenn der durchlaufen wird, existiert deine Liste noch gar nicht).</p>
<p>PS: Du wirfst sehr viel mit Zeigern um dich - ich hoffe, dir ist klar, daß du auch alles wieder freigeben mußt, was du mit new angefordert hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408231</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 22 Nov 2007 14:59:55 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim einfügen eines Listenelements on Thu, 22 Nov 2007 16:29:34 GMT]]></title><description><![CDATA[<p>Das Add() wird zwar in MainStein aufgerufen, aber nicht im Konstruktor. Sondern, wenn der Stein auf den &quot;Boden&quot; trifft. Zu dem Zeitpunkt ist die Liste schon längst da.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408311</guid><dc:creator><![CDATA[Grendel]]></dc:creator><pubDate>Thu, 22 Nov 2007 16:29:34 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim einfügen eines Listenelements on Thu, 22 Nov 2007 16:45:20 GMT]]></title><description><![CDATA[<p>Hier ist der Code vom MainStein, der bei case: DOWN die Funktion Release() aufruft, in welcher dann die Stein mit Add() hinzugefügt werden:</p>
<pre><code class="language-cpp">void VollStein::Move(int d) {
	bool admission = TRUE;

	switch (d) {
		case LEFT:
			if (KollisionsTest(PosX-1, PosY) == 1) {
				PosX--;
				for (int i = 0; i &lt; 4; i++) Stein[i]-&gt;SetPos(PosX + SteinPos[i].x, PosY + SteinPos[i].y);
			}
			break;

		case RIGHT:
			if (KollisionsTest(PosX+1, PosY) == 1) {
				PosX++;
				for (int i = 0; i &lt; 4; i++) Stein[i]-&gt;SetPos(PosX + SteinPos[i].x, PosY + SteinPos[i].y);
			}
			break;

		case DOWN:
			if (KollisionsTest(PosX, PosY+1) == 1) {
				PosY++;
				for (int i = 0; i &lt; 4; i++) Stein[i]-&gt;SetPos(PosX + SteinPos[i].x, PosY + SteinPos[i].y);
			}
			else
				Release();

			break;
	}
}
</code></pre>
<p>Hier werden die Steine dann zur Liste hinzugefügt.</p>
<pre><code class="language-cpp">void VollStein::Release() {
	for (int i = 0; i &lt; 4; i++) Liste-&gt;Add(Stein[i]);

	Released = TRUE;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1408326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408326</guid><dc:creator><![CDATA[Grendel]]></dc:creator><pubDate>Thu, 22 Nov 2007 16:45:20 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim einfügen eines Listenelements on Thu, 22 Nov 2007 16:51:02 GMT]]></title><description><![CDATA[<p>Ich hab den Fehler gefunden!</p>
<p>Grendel schrieb:</p>
<blockquote>
<p>ich habe jetzt also eine Liste für die Steine geschreiben:</p>
</blockquote>
<p>Diesen Code solltest du in</p>
<pre><code class="language-cpp">#include &lt;list&gt;

typedef std::list&lt;EinzelStein*&gt; SteinListe;
</code></pre>
<p>umändern.</p>
<p>Und falls du doch ganz unbedingt noch andere, nicht-listige Sachen in deiner Liste brauchst:</p>
<pre><code class="language-cpp">#include &lt;list&gt;

class SteinListe
{
public:
  // dein Kram hier

private:
  std::list&lt;EinzelStein*&gt; steine_;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1408332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408332</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Thu, 22 Nov 2007 16:51:02 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz beim einfügen eines Listenelements on Thu, 22 Nov 2007 19:59:39 GMT]]></title><description><![CDATA[<p>Ok, vielen Dank für die Hilfe! Allerdings habe ich keine Ahnung, worum es in dem Code geht. In dem Buch, was ich durchgearbeitet habe, steht nichts brauchbares drin und ehrlich gesagt, kapier ich immernoch nicht so ganz, wie der Fehler verursacht wird. Gibt es dazu vielleicht Tutorials (oder besser noch Bücher), die Du mir empfehlen kannst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408449</guid><dc:creator><![CDATA[Grendel]]></dc:creator><pubDate>Thu, 22 Nov 2007 19:59:39 GMT</pubDate></item></channel></rss>