<?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[Zeiger auf int in stack puschen]]></title><description><![CDATA[<p>Hallo, ich möchte die Zeiger auf ein Array von int in ein stack packen, habe aber probleme damit:</p>
<pre><code class="language-cpp">int main (){

int *pArray = new int[8]; 

	pArray[0]=11;
	pArray[1]=5;
	pArray[2]=19;
	pArray[3]=12;

	pArray[4]=13;
	pArray[5]=100;
	pArray[6]=7;
	pArray[7]=9;

	stack&lt;int&gt; *s = new stack&lt;int&gt; ();

	s-&gt;push(s);    ///Fehler

return 0;
}
</code></pre>
<p>Fehler: error C2664: 'push' : Konvertierung des Parameters 1 von 'int *' in 'const int &amp;' nicht moeglich</p>
<p>Wie geht sowas?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/121333/zeiger-auf-int-in-stack-puschen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 16:42:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/121333.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Sep 2005 10:40:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger auf int in stack puschen on Thu, 22 Sep 2005 10:40:17 GMT]]></title><description><![CDATA[<p>Hallo, ich möchte die Zeiger auf ein Array von int in ein stack packen, habe aber probleme damit:</p>
<pre><code class="language-cpp">int main (){

int *pArray = new int[8]; 

	pArray[0]=11;
	pArray[1]=5;
	pArray[2]=19;
	pArray[3]=12;

	pArray[4]=13;
	pArray[5]=100;
	pArray[6]=7;
	pArray[7]=9;

	stack&lt;int&gt; *s = new stack&lt;int&gt; ();

	s-&gt;push(s);    ///Fehler

return 0;
}
</code></pre>
<p>Fehler: error C2664: 'push' : Konvertierung des Parameters 1 von 'int *' in 'const int &amp;' nicht moeglich</p>
<p>Wie geht sowas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/877718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/877718</guid><dc:creator><![CDATA[jsdhfhdgb]]></dc:creator><pubDate>Thu, 22 Sep 2005 10:40:17 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf int in stack puschen on Thu, 22 Sep 2005 10:44:01 GMT]]></title><description><![CDATA[<p>du möchtest ja den stack auf den stack pushen, das geht nicht.</p>
<pre><code class="language-cpp">int main ()
{
    // so wäre doch bestimmt besser, oder was hast du mit den array vor
    stack&lt;int&gt; s;

    s.push(11);
    s.push(5);
    s.push(19);
    s.push(12);
    // usw
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/877724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/877724</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Thu, 22 Sep 2005 10:44:01 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf int in stack puschen on Thu, 22 Sep 2005 11:06:09 GMT]]></title><description><![CDATA[<p>Es geht eigentlich um was anderes. Ich habe versucht MergheSort selbst zu schreibn. Diese Methode ist rekursiv und erzugt dabei dynamisch neue Arrays mit</p>
<pre><code class="language-cpp">int *c = new int[gr1 + gr2]; // Platz fuer Array c besorgen
</code></pre>
<p>Das Problem ist, dass ich es nicht schaffe bei der rekusion alle neu erzeugten Array wieder zu löschen. (Ich rufe delete entweder zu wenig oder zu oft auf).</p>
<p>Jetzt habe ich mir gedacht, ich könnte Zeiger aller erzeugten Arrays auf den Stack legen und zum Schluß komplett löschen.</p>
<p>Aber vieleicht findet jemand eine elegantere Möglichkeit. Ich Poste mal den gesamten code:</p>
<pre><code class="language-cpp">class sortieren 
{ 

private:  static int*  MergeMerge(int a[],int b[], int gr1, int gr2) {

			  int i=0, j=0, k=0; // Laufindizes
			  int *c = new int[gr1 + gr2]; // Platz fuer Array c besorgen

			  while ((i&lt;gr1) &amp;&amp; (j&lt;gr2)) { // mischen, bis ein Array leer
				  if (a[i] &lt; b[j]) // jeweils das kleinere Element
					  c[k++] = a[i++]; // wird nach c uebernommen
				  else
					  c[k++] = b[j++];
			  }
			  while (i&lt;gr1) c[k++] = a[i++]; // ggf.: Rest von Folge a
			  while (j&lt;gr2) c[k++] = b[j++]; // ggf.: Rest von Folge b

			  return c; // Ergebnis abliefern

			  		  }

public:static int* MergeSort(int a[], int laenge) {

		   int *x;
		   int *y;
		   int *c;
		   int halb_laenge=(int)(laenge/2.0);		//Mitte bestimmen

		   if  (laenge==1){							//Wenn nichts zu tun a zurückgeben (Element wird kopiert)
			   c = new int [laenge];				//direktes zurückgeben ohne die Objektkopie erzeugt nochmehr probleme,
			   c[0]=a[0];							//dann einige Rekursive Aufrufe Echte kopiel lieferten und andere nicht

			   return a;								//Rückgabe	
		   }

		   x = new int[halb_laenge];			//lege 2 neue Arrays an
		   y = new int[halb_laenge+(laenge%2)];

		   int i;	
		   for (i=0; i&lt;halb_laenge; i++) {		// Kopiere die 1. Hälfte von a[] nach x[]
			   x[i]=a[i];
		   }

		   for (i=halb_laenge; i&lt;laenge; i++) {	// Kopiere die 2. Hälfte von a[] nach y[]

			   y[i-halb_laenge]=a[i];
		   }

		   int *d= MergeSort(x,halb_laenge);		//Rekursiver Aufruf für die 2 Teilfolgen
		   int *f= MergeSort(y,halb_laenge+(laenge%2));

		   c= MergeMerge(d,f,halb_laenge,halb_laenge+(laenge%2));	//Beide Sortierte Teilfolgen &quot;zusammenmischen&quot;

		   delete(x);  //Hier wird x wieder freigegeben (in der selben Methode oben erzeugt)
		   delete(y);  //Hier wird x wieder freigegeben (in der selben Methode oben erzeugt)

		   return c;								//Rückgabe 
	   }

};
</code></pre>
<p>Und hier der Code der Hauptklasse:</p>
<pre><code class="language-cpp">int main (void) {

	int *pArray = new int[8]; 

	pArray[0]=11;
	pArray[1]=5;
	pArray[2]=19;
	pArray[3]=12;

	pArray[4]=13;
	pArray[5]=100;
	pArray[6]=7;
	pArray[7]=9;

	int *eArray=	sortieren::MergeSort(pArray,5);

	for (int i=0; i&lt;5; i++ ) {
		cout &lt;&lt;eArray[i]&lt;&lt; endl;
	}

	return 0;
}
</code></pre>
<p>Das Problem ist in der Methode MergeMerge bei der Zeile</p>
<p>int *c = new int[gr1 + gr2]; // Platz fuer Array c besorgen (Hier liegt das Problem)</p>
<p>Da diese nicht wieder freigegeben werden</p>
<p>Setze ich nun ein Delete(a) unter die beiden anderen delete Aufrufe stürtzt das Programm ab! Das ist ja auch klar, weil das Programm MergeSort sich 2 mal selbst rekursiv aufruft und dadurch zuviele Delete(a) da sind!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/877748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/877748</guid><dc:creator><![CDATA[jsdhfhdgb]]></dc:creator><pubDate>Thu, 22 Sep 2005 11:06:09 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf int in stack puschen on Thu, 22 Sep 2005 11:24:19 GMT]]></title><description><![CDATA[<p>jsdhfhdgb schrieb:</p>
<blockquote>
<p>Setze ich nun ein Delete(a) unter die beiden anderen delete Aufrufe stürtzt das Programm ab! Das ist ja auch klar, weil das Programm MergeSort sich 2 mal selbst rekursiv aufruft und dadurch zuviele Delete(a) da sind!</p>
</blockquote>
<p>Nee, daran liegt es nicht, da bei jedem Aufruf von MergeSort eine Instanz des Arrays erzeugt, die auch wieder zum Ende der Methode zerstoert wird.</p>
<p>Aber: In Deinem main-Prg. rufst Du zweimal den new-Operator auf:</p>
<pre><code class="language-cpp">int *pArray = new int[8];
</code></pre>
<p>Hier den Default-new-Operator fuer int und hier</p>
<pre><code class="language-cpp">int *eArray=    sortieren::MergeSort(pArray,5);
</code></pre>
<p>ebenfalls ueber</p>
<pre><code class="language-cpp">int *c = new int[gr1 + gr2]; // Platz fuer Array c besorgen
</code></pre>
<p>die Aufrufe von MergeMerge und MergeSort. Dieser Speicher wird nirgentwo wieder freigeben. Ich vermute, dass hierin die Ursache des Crashs liegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/877754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/877754</guid><dc:creator><![CDATA[MBCS-CITP]]></dc:creator><pubDate>Thu, 22 Sep 2005 11:24:19 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf int in stack puschen on Thu, 22 Sep 2005 11:30:09 GMT]]></title><description><![CDATA[<p>Ja das Problem ist genau hier, im MergeMerge</p>
<pre><code class="language-cpp">int *c = new int[gr1 + gr2]; // Platz fuer Array c besorgen
</code></pre>
<p>Aber dies wird ja mit return c zurückgegeben und kommt so wieder in MerGeSort an und wird auch dort sofort zurückgegeben. Das ist ja genau die Rekursion.</p>
<p>Aber wie kann ich dieses löschen? Es müsste ja sozusagen eine ebene höher passieren (bei der Rekursion), weil erst dort dfas neu erzeugte Array unnötig wird. (Deswegen wollte ich delete(a) machen weil es eine Ebene höher wieder in MergeSort ankommt. Aber da stürtzt das Programm ab!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/877760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/877760</guid><dc:creator><![CDATA[jsdhfhdgb]]></dc:creator><pubDate>Thu, 22 Sep 2005 11:30:09 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf int in stack puschen on Thu, 22 Sep 2005 11:31:48 GMT]]></title><description><![CDATA[<p>PS so wie es ist ist das programm lauffähig. Jedoch belegt es immer mehr speicher der nicht mehr freigegeben wird!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/877762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/877762</guid><dc:creator><![CDATA[jsdhfhdgb]]></dc:creator><pubDate>Thu, 22 Sep 2005 11:31:48 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf int in stack puschen on Thu, 22 Sep 2005 11:52:35 GMT]]></title><description><![CDATA[<p>Ich bin zu faul, Dir Deine Arbeit zu machen, aber Du hast doch eine Abbruchbedingung:</p>
<pre><code class="language-cpp">if  (laenge==1)
</code></pre>
<p>Die Struktur der Rekursion muss so aussehen, dass der Speicher <strong>vor</strong> dem Verlassen der Methode (Aufruf von return) freigegeben wird, wenn die Abbruchbedingung falsch ist, ansonsten gibts Du den allocierten Speicher als Zeiger zurueck. Ich denke, dass Du die gesamte Struktur der Rekursion ueberarbeiten musst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/877785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/877785</guid><dc:creator><![CDATA[MBCS-CITP]]></dc:creator><pubDate>Thu, 22 Sep 2005 11:52:35 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf int in stack puschen on Thu, 22 Sep 2005 15:23:26 GMT]]></title><description><![CDATA[<blockquote>
<p>Die Struktur der Rekursion muss so aussehen, dass der Speicher vor dem Verlassen der Methode (Aufruf von return) freigegeben wird, wenn die Abbruchbedingung falsch ist, ansonsten gibts Du den allocierten Speicher als Zeiger zurueck. Ich denke, dass Du die gesamte Struktur der Rekursion ueberarbeiten musst.</p>
</blockquote>
<p>Genau! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> Ich habe es jetzt so gemacht:</p>
<pre><code class="language-cpp">public:static int* MergeSort(int a[], int laenge) {

		   int *x;
		   int *y;
		   int *c;
		   int halb_laenge=(int)(laenge/2.0);		//Mitte bestimmen

		   if  (laenge==1){							//Wenn nichts zu tun a zurückgeben (Element wird kopiert)
			   c = new int [laenge];				//direktes zurückgeben ohne die Objektkopie erzeugt nochmehr probleme,
			   c[0]=a[0];							//dann einige Rekursive Aufrufe Echte kopiel lieferten und andere nicht

			   return a;								//Rückgabe	
		   }

		   x = new int[halb_laenge];			//lege 2 neue Arrays an
		   y = new int[halb_laenge+(laenge%2)];

		   int i;	
		   for (i=0; i&lt;halb_laenge; i++) {		// Kopiere die 1. Hälfte von a[] nach x[]
			   x[i]=a[i];
		   }

		   for (i=halb_laenge; i&lt;laenge; i++) {	// Kopiere die 2. Hälfte von a[] nach y[]

			   y[i-halb_laenge]=a[i];
		   }

		   int *d= MergeSort(x,halb_laenge);		//Rekursiver Aufruf für die 2 Teilfolgen
		   int *f= MergeSort(y,halb_laenge+(laenge%2));

			c= MergeMerge(d,f,halb_laenge,halb_laenge+(laenge%2));	//Beide Sortierte Teilfolgen &quot;zusammenmischen&quot;
			for (i =0; i&lt;laenge;i++) {
					a[i]=c[i];
			}

		   delete [laenge] c;
		   delete[halb_laenge] x ;  //Hier wird x wieder freigegeben (in der selben Methode oben erzeugt)
		   delete[halb_laenge+(laenge%2)] y;  //Hier wird x wieder freigegeben (in der selben Methode oben erzeugt)

		   return a;								//Rückgabe 
	   }

};
</code></pre>
<p>Das scheint zu funktionieren! <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="😃"
    /><br />
Die Idee in jeder Rekursionstiefe alles dort erstelle auch sofort zu löschen hat geholfen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/877964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/877964</guid><dc:creator><![CDATA[jsdhfhdgb]]></dc:creator><pubDate>Thu, 22 Sep 2005 15:23:26 GMT</pubDate></item></channel></rss>