<?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[Problem mit dynamischem Array]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Funktion, die mir alle möglichen Permutationen einer Zahl ausgibt. Nun möchte ich diese aber in einem Array speichern und nicht einfach ausgeben. So sieht der Quelltext aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

void permut(string str, int endIndex) 
{
    if(endIndex == 0)
		 cout &lt;&lt; str &lt;&lt; endl;
    else
       permut(str,endIndex-1);
       for(int i = 0; i&lt;endIndex;i++)
	   {
		   std::swap(str[i],str[endIndex]);
           permut(str,endIndex-1);
           std::swap(str[i],str[endIndex]);
	   }
} 

int main()
{
    string str;
    cout &lt;&lt; &quot;Eingabe: &quot;;
    cin &gt;&gt; str;
    permut(str, str.length()-1);

	return 0;
}
</code></pre>
<p>Ich möchte also, dass in einem die Array die Werte gespeichert werden, die durch die Rekursion ausgegeben werden.</p>
<p>Meine Frage:</p>
<p>1.) Wenn ich nicht std::vector nehmen möchte, gibt es eine saubere Möglichkeit, mit einem dynamsichen Array zu arbeiten. Ich weiß nämlich bis zum letzten SChritt der Rekursion nicht, wie viele Elemente das Array hat. Dann müssten irgendwie alle Werte da drin gespeichert werden.</p>
<p>2.) Wo müsste ich ein dynmaisches Array überhaupt deklarieren? In der Rekursion kann das ja nicht gemacht werden, sonst würde das ja ganz schön häufig passieren.</p>
<p>Vielen dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/276692/problem-mit-dynamischem-array</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 08:56:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/276692.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 06 Nov 2010 20:35:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit dynamischem Array on Sat, 06 Nov 2010 20:42:18 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Funktion, die mir alle möglichen Permutationen einer Zahl ausgibt. Nun möchte ich diese aber in einem Array speichern und nicht einfach ausgeben. So sieht der Quelltext aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

void permut(string str, int endIndex) 
{
    if(endIndex == 0)
		 cout &lt;&lt; str &lt;&lt; endl;
    else
       permut(str,endIndex-1);
       for(int i = 0; i&lt;endIndex;i++)
	   {
		   std::swap(str[i],str[endIndex]);
           permut(str,endIndex-1);
           std::swap(str[i],str[endIndex]);
	   }
} 

int main()
{
    string str;
    cout &lt;&lt; &quot;Eingabe: &quot;;
    cin &gt;&gt; str;
    permut(str, str.length()-1);

	return 0;
}
</code></pre>
<p>Ich möchte also, dass in einem die Array die Werte gespeichert werden, die durch die Rekursion ausgegeben werden.</p>
<p>Meine Frage:</p>
<p>1.) Wenn ich nicht std::vector nehmen möchte, gibt es eine saubere Möglichkeit, mit einem dynamsichen Array zu arbeiten. Ich weiß nämlich bis zum letzten SChritt der Rekursion nicht, wie viele Elemente das Array hat. Dann müssten irgendwie alle Werte da drin gespeichert werden.</p>
<p>2.) Wo müsste ich ein dynmaisches Array überhaupt deklarieren? In der Rekursion kann das ja nicht gemacht werden, sonst würde das ja ganz schön häufig passieren.</p>
<p>Vielen dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1976341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1976341</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sat, 06 Nov 2010 20:42:18 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit dynamischem Array on Sat, 06 Nov 2010 20:46:04 GMT]]></title><description><![CDATA[<ol>
<li>
<p>Was verstehst du unter sauber? Du musst definitiv Speicher reservieren und auch wieder freigeben. Das kannst du beispielsweise mit einer verketteten Liste erledigen.</p>
</li>
<li>
<p>Du deklarierst das Array vor dem Funktionsaufruf und übergibst es als Zeiger/Referenz:</p>
</li>
</ol>
<pre><code class="language-cpp">void permut(string str, int endIndex, std::vector&lt;std::string&gt;&amp; v)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1976346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1976346</guid><dc:creator><![CDATA[,,,]]></dc:creator><pubDate>Sat, 06 Nov 2010 20:46:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit dynamischem Array on Sat, 06 Nov 2010 21:04:38 GMT]]></title><description><![CDATA[<p>kennst du <a href="http://www.cplusplus.com/reference/algorithm/next_permutation/" rel="nofollow">std::next_permutation</a>?<br />
Eigentlich müsste eine Obergrenze leicht zu berechnen sein, ansonsten könntest du std::list verwenden</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1976362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1976362</guid><dc:creator><![CDATA[!!!]]></dc:creator><pubDate>Sat, 06 Nov 2010 21:04:38 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit dynamischem Array on Sat, 06 Nov 2010 21:06:25 GMT]]></title><description><![CDATA[<p>Und wenn ich es gerade nicht als vector haben möchte? Sonst weiß ich auch, wie das geht. Mich interessiert es, zu verstehen, wie ich ein dynamisches Array in einer Rekursion fülle. Ich kann die Größe ja nämlich erst ganz zum Schluss bestimmen.</p>
<p>Ich habe jedoch noch ein ganz anderes Problem: Das obige Progrmam habe ich jetzt mal mit vector gemacht. Es sieht dann so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;
std::vector&lt;string&gt; num;  

void permut(string str, int endIndex) 
{
	if(endIndex == 0) {
		num.push_back(str);
		//cout &lt;&lt; str &lt;&lt; endl;
	}
    else
       permut(str,endIndex-1);

       for(int i = 0; i&lt;endIndex;i++)
	   {
		   std::swap(str[i],str[endIndex]);
           permut(str,endIndex-1);
           std::swap(str[i],str[endIndex]);
	   }
} 

int main()
{
    string str;
    cout &lt;&lt; &quot;Eingabe: &quot;;
    cin &gt;&gt; str;
    permut(str, str.length()-1);
    cout &lt;&lt; num.capacity();
	return 0;
}
</code></pre>
<p>Ich gebe jetzt die Anzahl aller Elemente aus - also n!. Wenn ich eine dreistellige Zahl eingebe, dann erscheint 6. Das ist richtig. Wenn ich jedoch eine vierstellige Zahl geben kommt nich 4! = 24, sondern 28. Bei einer fünfstelligen Zahl erscheint eine 141 und nicht 120. Da ist also noch ein Fehler, den ich aber nicht sehe. Sieht von euch jemand diesen logischen Fehler?</p>
<p>edit: @!!! In einem anderen Thread wurde mir diese Funktion bereits vorgeschlagen. Ich habe mich aber entschieden, die Permutationen per Hand selber zu programmieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1976364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1976364</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sat, 06 Nov 2010 21:06:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit dynamischem Array on Sat, 06 Nov 2010 21:24:43 GMT]]></title><description><![CDATA[<p>Hier ein Beispiel, wie es ohne std::vector gehen würde:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;

using namespace std;

class MyArray
{
private:
	std::string *arr;
	unsigned int size;
	unsigned int pos;

	static const int BLOCK_SIZE;

public:
	MyArray() : arr(NULL), size(BLOCK_SIZE), pos(0)
	{
		arr = new std::string[size];
	}

	~MyArray()
	{
		delete[] arr;
	}

	// !!! Copy Constructor, etc. fehlen !!!

	void Push(const std::string&amp; str)
	{
		if (size &gt;= pos)
		{
			Resize(size + BLOCK_SIZE);
		}

		arr[pos] = str;

		++pos;
	}

	void Resize(unsigned int newSize)
	{
		std::string *tmp = new std::string[newSize];

		for (unsigned int i = 0; i &lt; size; ++i)
		{
			tmp[i] = arr[i];
		}

		delete[] arr;

		arr = tmp;

		size = newSize;
	}

	std::string At(unsigned int i)
	{
		return arr[i];
	}

	unsigned int FilledSize() const
	{
		return pos;
	}

	unsigned int TotalSize() const
	{
		return size;
	}
};

const int MyArray::BLOCK_SIZE = 32;

// ----------------------------------------------

void permut(string str, int endIndex, MyArray&amp; arr)
{
    if(endIndex == 0)
	{
		arr.Push(str);
	}
    else
       permut(str,endIndex-1, arr);
       for(int i = 0; i&lt;endIndex;i++)
       {
           std::swap(str[i],str[endIndex]);
           permut(str,endIndex-1, arr);
           std::swap(str[i],str[endIndex]);
       }
}

int main()
{
	MyArray arr;

    string str;
    cout &lt;&lt; &quot;Eingabe: &quot;;
    cin &gt;&gt; str;

    permut(str, str.length()-1, arr);

	for (unsigned int i = 0; i &lt; arr.FilledSize(); ++i)
	{
		std::cout &lt;&lt; arr.At(i) &lt;&lt; std::endl;
	}

    return 0;
}
</code></pre>
<p>Als Übung ist sowas okay, aber in der Praxis ist das mehr als schwachsinnig! Das Beispiel ist wegen des fehlenden Copy Constructors, etc. nicht vollständig!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1976377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1976377</guid><dc:creator><![CDATA[,,,]]></dc:creator><pubDate>Sat, 06 Nov 2010 21:24:43 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit dynamischem Array on Sat, 06 Nov 2010 21:31:10 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Wenn ich eine dreistellige Zahl eingebe, dann erscheint 6. Das ist richtig. Wenn ich jedoch eine vierstellige Zahl geben kommt nich 4! = 24, sondern 28. Bei einer fünfstelligen Zahl erscheint eine 141 und nicht 120. Da ist also noch ein Fehler, den ich aber nicht sehe. Sieht von euch jemand diesen logischen Fehler?</p>
</blockquote>
<p>Die Grösse eines Vectors bestimmt man durch .size() und nicht durch .capacity(). Letzeres gibt dir die Anzahl allokierter (und noch ungebrauchter) Elemente an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1976384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1976384</guid><dc:creator><![CDATA[!!!]]></dc:creator><pubDate>Sat, 06 Nov 2010 21:31:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit dynamischem Array on Sat, 06 Nov 2010 21:33:59 GMT]]></title><description><![CDATA[<p>Die Lösung gefällt mir aber sehr. Danke schön! Es soll auch nur eine Übung für mich sein. Wow! Echt super! Danke, danke! Macht std::vector intern eigentlich was anderes?</p>
<p>Weißt Du oder jemand anderes denn, warum bei mir falsche Werte ausgegeben werden? Das Problem habe ich in meinem vorherigen Post beschrieben.</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1976387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1976387</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sat, 06 Nov 2010 21:33:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit dynamischem Array on Sat, 06 Nov 2010 21:35:19 GMT]]></title><description><![CDATA[<p>Ohhh! Danke !!!</p>
<p>Das wusste ich nicht. Ich bin verglichen mit euch noch ein Anfänger und habe mit der STL noch nie gearbeitet. Deswegen bin ich noch ein Freund von dynamischen Arrays.</p>
<p>Danke! Jetzt funtionierts.</p>
<p>lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1976389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1976389</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sat, 06 Nov 2010 21:35:19 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit dynamischem Array on Sat, 06 Nov 2010 21:41:44 GMT]]></title><description><![CDATA[<p>Vermutlich funktioniert auch <code>std::vector</code> nach diesem Prinzip. Fakt ist aber, dass <code>std::vector</code> von vielen Leuten programmiert, getestet und gewartet wurde und noch immer wird. Damit ist es nicht nur sicherer sondern auch viel schneller. In einer echten Applikation solltest du das beachten und nicht selber anfangen solche Sachen nachzuprogrammieren. Es kostet dich nur Zeit und ist letztendlich nicht besser, sondern eher schlechter.</p>
<p>Als Übung und zum besseren Verständnis ist es aber nett, wenn man sowas mal selber bastelt. Macht ja auch irgendwie Spaß <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1976392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1976392</guid><dc:creator><![CDATA[,,,]]></dc:creator><pubDate>Sat, 06 Nov 2010 21:41:44 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit dynamischem Array on Sat, 06 Nov 2010 21:55:43 GMT]]></title><description><![CDATA[<p>,,, schrieb:</p>
<blockquote>
<p>Macht ja auch irgendwie Spaß <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Das sehe ich eben genau so!</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1976402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1976402</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sat, 06 Nov 2010 21:55:43 GMT</pubDate></item></channel></rss>