<?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[std::map und Rekursion]]></title><description><![CDATA[<p>Hallo!<br />
Ich versuche eine map rekursiv zu füllen, aber das klappt leider nicht.<br />
Die Signatur meiner Methode sieht folgendermaßen aus:</p>
<pre><code>void MyClass::fillMap(const char* dir, map&lt;char*,myVal*&gt;* _map);
</code></pre>
<p>Ich plane jetzt damit rekursiv durch die directories zu klappern, und bestimmte Teile bestimmter Files einzulesen, welche in der Map abgelegt werden. Mein Code sieht so aus:</p>
<pre><code>void MyClass::fillMap(const char* dir, map&lt;char*,myVal*&gt;* _map)
{
	DIR* pDir;
	dirent* dp;
	string sCurDir = dir;
	string sCurFile;
      myVal* values = new myVal();

	if(sCurDir.rfind(&quot;/&quot;) == sCurDir.length()-1)
	{
		sCurDir = sCurDir.substr(0,sCurDir.length()-1);
	}

	string::size_type pos = sCurDir.rfind(&quot;/&quot;);
	string sCurKey = sCurDir.substr(pos+1,sCurDir.length()-1);

	printf(&quot;Entering: %s\n&quot;,sCurDir.c_str());

	pDir = opendir(sCurDir.c_str());
	while((dp = readdir(pDir)) != NULL)
	{
		if(dp-&gt;d_type == DT_DIR)
		{
			if(strcmp(dp-&gt;d_name,&quot;.&quot;) &amp;&amp; strcmp(dp-&gt;d_name,&quot;..&quot;))
			{
				sCurDir += &quot;/&quot;;
				sCurDir += dp-&gt;d_name;
				fillMap(curDir.c_str(),_map);
                        sCurDir = dir;

			}
		}
		else if(dp-&gt;d_type == DT_REG)
		{
			sCurFile = sCurDir;
			sCurFile += &quot;/&quot;;
			sCurFile += dp-&gt;d_name; 
			myVal = loadValue(sCurFile);
			//printf(&quot;file: %s\n&quot;,sCurFile.c_str());
		}
	} 
	(void)closedir(pDir); 

	printf(&quot;INSERTING!\n&quot;);
	_map-&gt;insert(make_pair((char*)sCurKey.c_str(),myVal));
	printf(&quot;key: %s,size: %i\n&quot;,sCurKey.c_str(),_map-&gt;size());

      /*nur zum testen*/
	map&lt;char*,CSprite*&gt;::iterator it;
	for(it = _map-&gt;begin(); it != _map-&gt;end(); it++)
	{
		printf(&quot;%s\n&quot;,it-&gt;first);
	}
	return;
}
</code></pre>
<p>Eigentlich sollte jetzt jede Value mit dem Verzeichnis-Namen als Key in der Map abgelegt sein. Doch nur der letzte Verzeichnisname ist am Ende als Key enthalten, und dann noch 2Mal irgendwelcher Garbage. Insgesamt werden jedoch 16 Inserts gemacht (sind ja auch 16 directories). Was mache ich denn nur falsch?</p>
<p>Wäre nett wenn mir jemand helfen könnte,<br />
Bye!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/131256/std-map-und-rekursion</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 02:38:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/131256.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 Jan 2006 06:41:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::map und Rekursion on Mon, 02 Jan 2006 06:41:34 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich versuche eine map rekursiv zu füllen, aber das klappt leider nicht.<br />
Die Signatur meiner Methode sieht folgendermaßen aus:</p>
<pre><code>void MyClass::fillMap(const char* dir, map&lt;char*,myVal*&gt;* _map);
</code></pre>
<p>Ich plane jetzt damit rekursiv durch die directories zu klappern, und bestimmte Teile bestimmter Files einzulesen, welche in der Map abgelegt werden. Mein Code sieht so aus:</p>
<pre><code>void MyClass::fillMap(const char* dir, map&lt;char*,myVal*&gt;* _map)
{
	DIR* pDir;
	dirent* dp;
	string sCurDir = dir;
	string sCurFile;
      myVal* values = new myVal();

	if(sCurDir.rfind(&quot;/&quot;) == sCurDir.length()-1)
	{
		sCurDir = sCurDir.substr(0,sCurDir.length()-1);
	}

	string::size_type pos = sCurDir.rfind(&quot;/&quot;);
	string sCurKey = sCurDir.substr(pos+1,sCurDir.length()-1);

	printf(&quot;Entering: %s\n&quot;,sCurDir.c_str());

	pDir = opendir(sCurDir.c_str());
	while((dp = readdir(pDir)) != NULL)
	{
		if(dp-&gt;d_type == DT_DIR)
		{
			if(strcmp(dp-&gt;d_name,&quot;.&quot;) &amp;&amp; strcmp(dp-&gt;d_name,&quot;..&quot;))
			{
				sCurDir += &quot;/&quot;;
				sCurDir += dp-&gt;d_name;
				fillMap(curDir.c_str(),_map);
                        sCurDir = dir;

			}
		}
		else if(dp-&gt;d_type == DT_REG)
		{
			sCurFile = sCurDir;
			sCurFile += &quot;/&quot;;
			sCurFile += dp-&gt;d_name; 
			myVal = loadValue(sCurFile);
			//printf(&quot;file: %s\n&quot;,sCurFile.c_str());
		}
	} 
	(void)closedir(pDir); 

	printf(&quot;INSERTING!\n&quot;);
	_map-&gt;insert(make_pair((char*)sCurKey.c_str(),myVal));
	printf(&quot;key: %s,size: %i\n&quot;,sCurKey.c_str(),_map-&gt;size());

      /*nur zum testen*/
	map&lt;char*,CSprite*&gt;::iterator it;
	for(it = _map-&gt;begin(); it != _map-&gt;end(); it++)
	{
		printf(&quot;%s\n&quot;,it-&gt;first);
	}
	return;
}
</code></pre>
<p>Eigentlich sollte jetzt jede Value mit dem Verzeichnis-Namen als Key in der Map abgelegt sein. Doch nur der letzte Verzeichnisname ist am Ende als Key enthalten, und dann noch 2Mal irgendwelcher Garbage. Insgesamt werden jedoch 16 Inserts gemacht (sind ja auch 16 directories). Was mache ich denn nur falsch?</p>
<p>Wäre nett wenn mir jemand helfen könnte,<br />
Bye!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/954427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/954427</guid><dc:creator><![CDATA[Cow]]></dc:creator><pubDate>Mon, 02 Jan 2006 06:41:34 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Rekursion on Mon, 02 Jan 2006 07:09:11 GMT]]></title><description><![CDATA[<p>Habs nur mal überflogen, aber ein Hinweis: du speicherts in deiner std::map einen Zeiger auf ein char-Feld. Erstmal tust du einfach das const wegcasten, das ist kein feiner Stil, und zweitens solltest du die Güktigkeit der Variablen beachten.</p>
<p>Dein sCurKey ist nur in der Funktion gültig. Nach dem Verlassen der Funktion wird der std::string zerstört, du merkst dir in der std::map also einen Zeiger auf ungültigen Speicher, ich vermute mal, dass daher dein Müll kommt.</p>
<pre><code class="language-cpp">map&lt;std::string,myVal*&gt;
</code></pre>
<p>Das wäre besser.<br />
Bei myVal habe ich jetz nicht geschaut, auch hier musst du drauf achten, dass du einen Zeiger speicherst und der Speicherbereich auch wirklich noch gültig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/954437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/954437</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 02 Jan 2006 07:09:11 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Rekursion on Mon, 02 Jan 2006 09:12:34 GMT]]></title><description><![CDATA[<p>Danke für deine rasche Antwort, Pellaeon! Ich habe jetzt alle keys in der map, so wie sie gebraucht werden. Allerdings bekomm ich jetzt Seg-Faults beim Zugriff auf die Pointer von myVal; Das sollten aber zwingend Pointer sein, Objekte kommen nicht in Frage. Wie kann ich denn sicher gehen, dass die Pointer auch nach dem Aufruf der Methode wirklich noch existieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/954496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/954496</guid><dc:creator><![CDATA[Cow]]></dc:creator><pubDate>Mon, 02 Jan 2006 09:12:34 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Rekursion on Mon, 02 Jan 2006 09:40:51 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">_map-&gt;insert(make_pair((char*)sCurKey.c_str(),myVal));
</code></pre>
<p>myVal ist doch der Name des Types und nicht die Variable oder?</p>
<pre><code class="language-cpp">myVal* values = new myVal();
</code></pre>
<p>also müsstest du ja values reinhauen, weil das der Zeiger ist.</p>
<p>Ansonsten new benutzt du ja schon, das ist richtig so. Darfst dann natürlich nicht das delete vergessen an entsprechender Stelle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/954515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/954515</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 02 Jan 2006 09:40:51 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Rekursion on Mon, 02 Jan 2006 09:51:31 GMT]]></title><description><![CDATA[<p>Ja, da sollte auch values und nicht myVal stehen. Ich hab den Code ein bissal vereinfacht und lange Ausdrücke rausgenommen, da ist mir wohl ein kleiner Fehler passiert. Trotzdem bekomme ich diese vermaledeiten Seg-Faults. Ich werd jetzt einfach mal einen myVal** mit in die Signatur reinschreiben, das sollte dann (hoffentlich) funktionieren, ist aber meines Erachtens nach keine schöne Lösung;</p>
<pre><code class="language-cpp">void MyClass::fillMap(const char* dir, map&lt;char*,myVal*&gt;* _map, myVal** vals)
{

static int count = 0;
...
/*an geeigneter Stelle*/
vals[count] = new myVal();
...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/954523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/954523</guid><dc:creator><![CDATA[Cow]]></dc:creator><pubDate>Mon, 02 Jan 2006 09:51:31 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Rekursion on Mon, 02 Jan 2006 10:05:05 GMT]]></title><description><![CDATA[<p>Also nocheinmal danke für deine Antwort, ich hab es jetzt hinbekommen. Der Fehler lag anscheinend an ganz anderer Stelle. Hätte ich eigentlich nicht für möglich gehalten, aber da hat eine Klasse ints mit ganz komischen Werten initialisiert. Ich hätte halt gedacht das 0 Standard wäre ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/954532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/954532</guid><dc:creator><![CDATA[Cow]]></dc:creator><pubDate>Mon, 02 Jan 2006 10:05:05 GMT</pubDate></item><item><title><![CDATA[Reply to std::map und Rekursion on Mon, 02 Jan 2006 10:06:59 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">myVal = loadValue(sCurFile);
</code></pre>
<p>Das Teil liefert auch wirklich einen Zeiger zurück?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/954533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/954533</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Mon, 02 Jan 2006 10:06:59 GMT</pubDate></item></channel></rss>