<?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[rekursiver Funktionsaufruf frisst Variablen]]></title><description><![CDATA[<p>Hallo!<br />
Ich hab folgende rekursive Funktion:</p>
<pre><code class="language-cpp">void iterateRight(Rational r, const char *str, int depth)
{
	printf(&quot;iterate %s %d\n&quot;, str, depth);
	r.print();
	printf(&quot;\n&quot;);
	list.add(r, str);
	if (--depth==0)
		return;
	char name[MAX_NAME];
	strcpy(name, str);
	int n=strlen(name);
	name[n+1]='\0';
	name[n]='p';
	iterateRight(r&lt;&lt;p, name, depth);
	printf(&quot;strange things happen here:\n&quot;);
	printf(name);
	name[n]='n';
	iterateRight(r&lt;&lt;n, name, depth);
}
</code></pre>
<p>Übergeben wird also immer eine Variable vom Typ <strong>Rational</strong>, ein String und die Zahl, der Iterationen, die noch folgen sollen, welche jedesmal dekrementiert wird.<br />
Danach soll die Funktion zweimal aufgerufen werden, wobei an den String einmal ein &quot;p&quot; und einmal ein &quot;n&quot; angehängt wird. Dafür wird für beide Aufrufe nur eine Variable &quot;name&quot; verwendet, die beim zweiten iterativen Aufruf manipuliert wird. Aber anscheinend ist sie nach dem ersten rekursiven Aufruf von <strong>IterateRight()</strong> nicht mehr da. Jedenfalls bleibt das Programm beim ersten return aus der tiefsten Iterationsstufe hängen mit der Ausgabe: <em>&quot;strange things happen here:&quot;</em>. Das <strong>printf(name)</strong> danach wird nicht mehr ausgeführt. Das Ende der Ausgabe:</p>
<pre><code>iterate ppp 1
1X^8 + -5X^7 + 10X^6 + -10X^5 + 5X^4 + -1X^3 + 0X^2 + 0X + 0
----------------------------
1X^7 + -5X^6 + 10X^5 + -10X^4 + 5X^3 + -1X^2 + 0X + 0

strange things happen here: 1
</code></pre>
<p>Das gleiche Ergebnis erhalte ich, wenn ich <strong>printf(str)</strong> statt <strong>printf(name)</strong> nehme oder wenn ich zwei Variablen <strong>name1</strong> und <strong>name2</strong> deklariere, egal ob ich die zweite vor oder hinter dem ersten Iterationsaufruf deklariere usw. Es kann einfach nicht mehr auf sie zugegriffen werden und das Programm hängt. Es bleibt immer nach dem return vom ersten Iterationsaufruf und dem <em>&quot;strange things happen here&quot;</em> hängen, also dann, wenn auf eine dieser String-Variablen zugegriffen wird - die ja eigentlich noch da sein sollten (oder?).<br />
Ein <strong>printf(&quot;%d\n&quot;, depth)</strong> dagegen funktioniert noch einwandfrei, ebenso wie <strong>r.print()</strong>.<br />
Woran kann das liegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202825/rekursiver-funktionsaufruf-frisst-variablen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 00:33:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202825.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Jan 2008 19:53:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to rekursiver Funktionsaufruf frisst Variablen on Tue, 15 Jan 2008 19:53:12 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich hab folgende rekursive Funktion:</p>
<pre><code class="language-cpp">void iterateRight(Rational r, const char *str, int depth)
{
	printf(&quot;iterate %s %d\n&quot;, str, depth);
	r.print();
	printf(&quot;\n&quot;);
	list.add(r, str);
	if (--depth==0)
		return;
	char name[MAX_NAME];
	strcpy(name, str);
	int n=strlen(name);
	name[n+1]='\0';
	name[n]='p';
	iterateRight(r&lt;&lt;p, name, depth);
	printf(&quot;strange things happen here:\n&quot;);
	printf(name);
	name[n]='n';
	iterateRight(r&lt;&lt;n, name, depth);
}
</code></pre>
<p>Übergeben wird also immer eine Variable vom Typ <strong>Rational</strong>, ein String und die Zahl, der Iterationen, die noch folgen sollen, welche jedesmal dekrementiert wird.<br />
Danach soll die Funktion zweimal aufgerufen werden, wobei an den String einmal ein &quot;p&quot; und einmal ein &quot;n&quot; angehängt wird. Dafür wird für beide Aufrufe nur eine Variable &quot;name&quot; verwendet, die beim zweiten iterativen Aufruf manipuliert wird. Aber anscheinend ist sie nach dem ersten rekursiven Aufruf von <strong>IterateRight()</strong> nicht mehr da. Jedenfalls bleibt das Programm beim ersten return aus der tiefsten Iterationsstufe hängen mit der Ausgabe: <em>&quot;strange things happen here:&quot;</em>. Das <strong>printf(name)</strong> danach wird nicht mehr ausgeführt. Das Ende der Ausgabe:</p>
<pre><code>iterate ppp 1
1X^8 + -5X^7 + 10X^6 + -10X^5 + 5X^4 + -1X^3 + 0X^2 + 0X + 0
----------------------------
1X^7 + -5X^6 + 10X^5 + -10X^4 + 5X^3 + -1X^2 + 0X + 0

strange things happen here: 1
</code></pre>
<p>Das gleiche Ergebnis erhalte ich, wenn ich <strong>printf(str)</strong> statt <strong>printf(name)</strong> nehme oder wenn ich zwei Variablen <strong>name1</strong> und <strong>name2</strong> deklariere, egal ob ich die zweite vor oder hinter dem ersten Iterationsaufruf deklariere usw. Es kann einfach nicht mehr auf sie zugegriffen werden und das Programm hängt. Es bleibt immer nach dem return vom ersten Iterationsaufruf und dem <em>&quot;strange things happen here&quot;</em> hängen, also dann, wenn auf eine dieser String-Variablen zugegriffen wird - die ja eigentlich noch da sein sollten (oder?).<br />
Ein <strong>printf(&quot;%d\n&quot;, depth)</strong> dagegen funktioniert noch einwandfrei, ebenso wie <strong>r.print()</strong>.<br />
Woran kann das liegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437263</guid><dc:creator><![CDATA[Krecik]]></dc:creator><pubDate>Tue, 15 Jan 2008 19:53:12 GMT</pubDate></item><item><title><![CDATA[Reply to rekursiver Funktionsaufruf frisst Variablen on Wed, 16 Jan 2008 01:11:02 GMT]]></title><description><![CDATA[<p>Welch ein Quelltext. Sowas hab ich lange nicht mehr gesehen. <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="😃"
    /> <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="😃"
    /> <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>
<p>Versuch doch mal statt</p>
<pre><code class="language-cpp">printf(name);
</code></pre>
<pre><code class="language-cpp">printf(&quot;%s&quot;, name);
</code></pre>
<p>Vielleicht taucht name dann wieder auf. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437356</guid><dc:creator><![CDATA[senf_dazu]]></dc:creator><pubDate>Wed, 16 Jan 2008 01:11:02 GMT</pubDate></item><item><title><![CDATA[Reply to rekursiver Funktionsaufruf frisst Variablen on Wed, 16 Jan 2008 06:51:09 GMT]]></title><description><![CDATA[<p>Mit name[n+1] mit n == strlen(name) schreibst du außerhalb des Arrays herum. Das sollte es erklären.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437389</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 16 Jan 2008 06:51:09 GMT</pubDate></item><item><title><![CDATA[Reply to rekursiver Funktionsaufruf frisst Variablen on Wed, 16 Jan 2008 08:52:28 GMT]]></title><description><![CDATA[<p>Solange n&lt;MAX_NAME+1 ist nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437443</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 16 Jan 2008 08:52:28 GMT</pubDate></item><item><title><![CDATA[Reply to rekursiver Funktionsaufruf frisst Variablen on Wed, 16 Jan 2008 09:07:16 GMT]]></title><description><![CDATA[<p>Ah, das fehlende &quot;%s&quot; bei printf hatte ich übersehen...</p>
<p>Da er strcpy einsetzt ist da eh eine potenzielle Fehlerquelle. strncpy sollte da besser passen.</p>
<p>Edit:<br />
Du meinst solange n &lt; (MAX_NAME - 1) ist.</p>
<p>Denn wenn MAX_NAME zB 4 ist, ist name[4]<br />
strlen(name) und somit n wäre also maximal (hoffentlich) 3. name[n+1] bzw. name[3+1] ist dann schon außerhalb des Limits.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437451</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 16 Jan 2008 09:07:16 GMT</pubDate></item><item><title><![CDATA[Reply to rekursiver Funktionsaufruf frisst Variablen on Wed, 16 Jan 2008 09:21:08 GMT]]></title><description><![CDATA[<p>Schau dir mal im C++-Buch deiner Wahl die Themen Input/Output (I/O-Streams) und Strings an. Sollte dein C++-Buch mit const char*s und printf() arbeiten, ändere mit Tipp-Ex den Titel in C-Buch, stells ins Regal und kauf dir ein C++-Buch. Printf und char-Arrays als strings sind C-Dinosaurier, die nur aus Kompatibilitätsgründen in C++ funktionieren, aber eigentlich nciht zur Sprache gehören.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437458</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 16 Jan 2008 09:21:08 GMT</pubDate></item><item><title><![CDATA[Reply to rekursiver Funktionsaufruf frisst Variablen on Wed, 16 Jan 2008 09:34:41 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Edit:<br />
Du meinst solange n &lt; (MAX_NAME - 1) ist.</p>
</blockquote>
<p>Ja, das meinte ich eigentlich. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437466</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 16 Jan 2008 09:34:41 GMT</pubDate></item><item><title><![CDATA[Reply to rekursiver Funktionsaufruf frisst Variablen on Sat, 09 Feb 2008 13:43:22 GMT]]></title><description><![CDATA[<p>Sorry, dass ich mich hier nicht wieder gemeldet hab. Hatte ich ganz vergessen, dass ich das hier geschrieben hab. Fehler hab ich gefunden. Aber weiß nicht mehr, was das war.<br />
Danke trotzdem für all die Antworten <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1452515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452515</guid><dc:creator><![CDATA[Krecik]]></dc:creator><pubDate>Sat, 09 Feb 2008 13:43:22 GMT</pubDate></item></channel></rss>