<?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[list literator not decrementable]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in Folge eines Tutorials einen Code geschrieben welcher sich mit einem kleinen Spiel in der Kommandozeile von Windows beschäftigt. Hierfür werden Sprites erstellt und auch gelöscht wenn sie von einem &quot;Feuerball&quot; welcher von dem &quot;Helden&quot; geschossen wird getroffen werden.</p>
<p>Hierfür habe ich folgenden Code Abschnitt in der update(); Funktion:</p>
<pre><code class="language-cpp">for (Iter = npc.begin(); Iter != npc.end(); Iter++)
	{
		(*Iter)-&gt;idleUpdate();

		if ((*Iter)-&gt;isAlive() == false)
		{
		Sprite *temp = *Iter;

		Iter--;
		delete temp;
		npc.remove(temp);

		}

	}
</code></pre>
<p>Er prüft hierbei immer in der Zeit in der &quot;nichts&quot; passiert, ob der Sprite noch am Leben ist (isAlive()) und falls nicht, löscht er diesen, damit nicht unnötiger Speicher belegt wird.</p>
<p>Es befinden sich 3 Gegner in dem level.<br />
Während der Laufzeit kommt, meistens nach dem ersten Gegner, sobald ein Feuerball auf den 2ten Gegner trifft folgende Fehlermeldung:</p>
<p>&quot;list literator not decrementable&quot;</p>
<p>Ich weiß auch schon ungefähr warum dieser Fehler auftrifft, konnte jedoch bisher noch keine funktionierende Umgehung zustande bringen.</p>
<p>Falls noch weitere Code benötigt wird, bitte sagen.</p>
<p>Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/247755/list-literator-not-decrementable</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 10:59:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247755.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Aug 2009 00:33:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to list literator not decrementable on Sat, 15 Aug 2009 00:33:28 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in Folge eines Tutorials einen Code geschrieben welcher sich mit einem kleinen Spiel in der Kommandozeile von Windows beschäftigt. Hierfür werden Sprites erstellt und auch gelöscht wenn sie von einem &quot;Feuerball&quot; welcher von dem &quot;Helden&quot; geschossen wird getroffen werden.</p>
<p>Hierfür habe ich folgenden Code Abschnitt in der update(); Funktion:</p>
<pre><code class="language-cpp">for (Iter = npc.begin(); Iter != npc.end(); Iter++)
	{
		(*Iter)-&gt;idleUpdate();

		if ((*Iter)-&gt;isAlive() == false)
		{
		Sprite *temp = *Iter;

		Iter--;
		delete temp;
		npc.remove(temp);

		}

	}
</code></pre>
<p>Er prüft hierbei immer in der Zeit in der &quot;nichts&quot; passiert, ob der Sprite noch am Leben ist (isAlive()) und falls nicht, löscht er diesen, damit nicht unnötiger Speicher belegt wird.</p>
<p>Es befinden sich 3 Gegner in dem level.<br />
Während der Laufzeit kommt, meistens nach dem ersten Gegner, sobald ein Feuerball auf den 2ten Gegner trifft folgende Fehlermeldung:</p>
<p>&quot;list literator not decrementable&quot;</p>
<p>Ich weiß auch schon ungefähr warum dieser Fehler auftrifft, konnte jedoch bisher noch keine funktionierende Umgehung zustande bringen.</p>
<p>Falls noch weitere Code benötigt wird, bitte sagen.</p>
<p>Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1761150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761150</guid><dc:creator><![CDATA[puelo]]></dc:creator><pubDate>Sat, 15 Aug 2009 00:33:28 GMT</pubDate></item><item><title><![CDATA[Reply to list literator not decrementable on Sat, 15 Aug 2009 00:45:12 GMT]]></title><description><![CDATA[<p>Das Dekrementieren des <code>begin()</code> -Iterators führt zu undefiniertem Verhalten. Das Weiteriterieren, nachdem Elemente aus dem Container gelöscht wurden, unter Umständen auch. Was ist das für ein Container, der eine <code>remove()</code> -Methode hat? Oder hast du dich nur verschrieben und meinst <code>erase()</code> ?</p>
<p>Statt deines Vorgehens solltest du den Rückgabewert von <code>erase()</code> nutzen, um einen gültigen Iterator zu erhalten. Oder gleich Algorithmen wie <code>std::remove_if()</code> verwenden - Beschreibung steht auf <a href="http://www.cplusplus.com" rel="nofollow">www.cplusplus.com</a>. Noch einige andere Dinge:</p>
<ul>
<li><code>Iter++</code> ist langsamer als <code>++Iter</code> , da hierfür eine Kopie erstellt wird.</li>
<li>Boolsche Bedingungen muss man nicht explizit auf <code>true</code> oder <code>false</code> prüfen, es reicht, wenn du <code>if (Bedingung)</code> oder <code>if (!Bedingung)</code> schreibst.</li>
<li>Willst du wirklich Zeiger im Container speichern und den Speicher selbst verwalten? Da können schneller Fehler (insbesondere Memory Leaks) entstehen, als du vielleicht annimmst. Speichere wenn möglich direkt Objekte statt Zeigern. Eine Alternative wären Boosts Pointer-Container.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1761153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761153</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 15 Aug 2009 00:45:12 GMT</pubDate></item><item><title><![CDATA[Reply to list literator not decrementable on Sat, 15 Aug 2009 11:54:16 GMT]]></title><description><![CDATA[<p>Habs jetzt etwas anders gelöst:</p>
<pre><code class="language-cpp">std::list&lt; Sprite * &gt;::iterator Iter = npc.begin();
std::list&lt; Sprite * &gt;::iterator end  = npc.end();

	while (Iter != npc.end())
	{
		(*Iter)-&gt;idleUpdate();

		Sprite *temp = *Iter;

		if ((*Iter)-&gt;isAlive())
		{
		++Iter;
		}
		else
		{
		delete (temp);
		Iter = npc.erase(Iter);

		}

	}
</code></pre>
<p>Glaube auch nicht, dass das die optimalste Lösung ist, aber es funktioniert erstmal. Danke für die Hilfe Nexus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1761303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1761303</guid><dc:creator><![CDATA[puelo]]></dc:creator><pubDate>Sat, 15 Aug 2009 11:54:16 GMT</pubDate></item></channel></rss>