<?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[Array Stack push]]></title><description><![CDATA[<p>Hi, folgendes Programm wird erfolgreich compiliert doch die Ausführung führt zu einem Programmabsturz. Wo liegt der Fehler?</p>
<p>jojo.h</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class chip
{
public:
	virtual int zeigdich() const = 0;
};

class chip_0 : public chip
{
public:
	int zeigdich() const
	{
		return 0;
	}
};

class chip_1 : public chip
{
public:
	int zeigdich() const
	{
		return 1;
	}
};

class chip_2 : public chip
{
public:
	int zeigdich() const
	{
		return 2;
	}
};

class stack 
{
	enum { size = 100 };
	int top;
	chip* feld[size];

public:
	stack()
		: top(0)
	{}

	class stack_voll {};

	void push (chip* ding) throw (stack_voll)
	{
		if (top == size)
			throw stack_voll();
		feld[top] = ding;
		top++;
	}

	void zeigdich()
	{
		int counter[2];
		for (int i=0; i&lt;=2; i++)
		{
			counter[i] = 0;
		}

		for (int i=0; i&lt;=size; i++)
		{
			counter[feld[i]-&gt;zeigdich()]++;
		}

		for (int i=0; i&lt;=2; i++)
		{
			cout &lt;&lt; &quot;Von Typ &quot; &lt;&lt; i &lt;&lt; &quot; vorhanden: &quot; &lt;&lt; counter[i] &lt;&lt; endl;
		}
	}
};
</code></pre>
<p>ausfuehren.cpp</p>
<pre><code class="language-cpp">#include &quot;jojo.h&quot;

void main()
{
	stack st;
	try
	{
		st.push( new chip_1 );
		st.push( new chip_0 );
		st.push( new chip_2 );
		st.push( new chip_0 ); 
	}
	catch ( stack::stack_voll )
	{
		cout &lt;&lt; &quot;Stack ist voll zefix&quot; &lt;&lt; endl;
		exit(1);
	}

	st.zeigdich();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/217145/array-stack-push</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 21:06:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/217145.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 Jul 2008 15:56:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Array Stack push on Thu, 03 Jul 2008 15:56:31 GMT]]></title><description><![CDATA[<p>Hi, folgendes Programm wird erfolgreich compiliert doch die Ausführung führt zu einem Programmabsturz. Wo liegt der Fehler?</p>
<p>jojo.h</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class chip
{
public:
	virtual int zeigdich() const = 0;
};

class chip_0 : public chip
{
public:
	int zeigdich() const
	{
		return 0;
	}
};

class chip_1 : public chip
{
public:
	int zeigdich() const
	{
		return 1;
	}
};

class chip_2 : public chip
{
public:
	int zeigdich() const
	{
		return 2;
	}
};

class stack 
{
	enum { size = 100 };
	int top;
	chip* feld[size];

public:
	stack()
		: top(0)
	{}

	class stack_voll {};

	void push (chip* ding) throw (stack_voll)
	{
		if (top == size)
			throw stack_voll();
		feld[top] = ding;
		top++;
	}

	void zeigdich()
	{
		int counter[2];
		for (int i=0; i&lt;=2; i++)
		{
			counter[i] = 0;
		}

		for (int i=0; i&lt;=size; i++)
		{
			counter[feld[i]-&gt;zeigdich()]++;
		}

		for (int i=0; i&lt;=2; i++)
		{
			cout &lt;&lt; &quot;Von Typ &quot; &lt;&lt; i &lt;&lt; &quot; vorhanden: &quot; &lt;&lt; counter[i] &lt;&lt; endl;
		}
	}
};
</code></pre>
<p>ausfuehren.cpp</p>
<pre><code class="language-cpp">#include &quot;jojo.h&quot;

void main()
{
	stack st;
	try
	{
		st.push( new chip_1 );
		st.push( new chip_0 );
		st.push( new chip_2 );
		st.push( new chip_0 ); 
	}
	catch ( stack::stack_voll )
	{
		cout &lt;&lt; &quot;Stack ist voll zefix&quot; &lt;&lt; endl;
		exit(1);
	}

	st.zeigdich();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1540514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540514</guid><dc:creator><![CDATA[Zeiteisen]]></dc:creator><pubDate>Thu, 03 Jul 2008 15:56:31 GMT</pubDate></item><item><title><![CDATA[Reply to Array Stack push on Thu, 03 Jul 2008 16:17:08 GMT]]></title><description><![CDATA[<p>spotan: dein &quot;feld&quot; ist ein zeiger auf ein array. nimm den stern oder die [] weg.</p>
<p>edit: du musst dein &quot;feld&quot; auch reservieren, also new() dafür aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1540517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540517</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Thu, 03 Jul 2008 16:17:08 GMT</pubDate></item><item><title><![CDATA[Reply to Array Stack push on Thu, 03 Jul 2008 16:20:20 GMT]]></title><description><![CDATA[<p>ghorst schrieb:</p>
<blockquote>
<p>spotan: dein &quot;feld&quot; ist ein zeiger auf ein array. nimm den stern oder die [] weg.</p>
<p>edit: du musst dein &quot;feld&quot; auch reservieren, also new() dafür aufrufen.</p>
</blockquote>
<p>Das müsste einen Compile Fehler geben.</p>
<p>Aber ich denke mal, dass er ein ganz anderes Problem hat.</p>
<pre><code class="language-cpp">int counter[2];
</code></pre>
<pre><code class="language-cpp">for (int i=0; i&lt;=2; i++)
</code></pre>
<p>Das kann so nicht gehen. Da greifst du auf Speicher zu, der nicht zu counter gehört.<br />
Du hast in counter genau Platz für 2 integer. Der erste ist 0, der zweite ist 1.<br />
Na was passiert wohl, wenn du jetzt auf [2] zugreifst?<br />
In einem Fall ist geholfen, wenn du das machst:</p>
<pre><code class="language-cpp">for (int i = 0; i &lt; 2; i++) // Beachte &lt; und nicht &lt;= !
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1540519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540519</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 03 Jul 2008 16:20:20 GMT</pubDate></item><item><title><![CDATA[Reply to Array Stack push on Thu, 03 Jul 2008 16:21:51 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Das müsste einen Compile Fehler geben.</p>
</blockquote>
<p>warum sollte es einen solchen geben? das ist in c und c++ völlig legal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1540520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540520</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Thu, 03 Jul 2008 16:21:51 GMT</pubDate></item><item><title><![CDATA[Reply to Array Stack push on Thu, 03 Jul 2008 16:34:36 GMT]]></title><description><![CDATA[<p>ghorst schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Das müsste einen Compile Fehler geben.</p>
</blockquote>
<p>warum sollte es einen solchen geben? das ist in c und c++ völlig legal</p>
</blockquote>
<p>Wenn es ein semantischer Fehler ist, dann muss das der Compiler entdecken. Vielleicht will er ja ein Array von Zeigern auf chip haben. Im übrigen ruft er ja new auf und übergibt den Zeiger der Klasse, wo er den Zeiger in einem Array speichert. Das kann er so ganz gut machen. (Über das schlechtes Design reden wir hier mal nicht)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1540524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540524</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 03 Jul 2008 16:34:36 GMT</pubDate></item><item><title><![CDATA[Reply to Array Stack push on Thu, 03 Jul 2008 16:35:23 GMT]]></title><description><![CDATA[<p>ghorst schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Das müsste einen Compile Fehler geben.</p>
</blockquote>
<p>warum sollte es einen solchen geben? das ist in c und c++ völlig legal</p>
</blockquote>
<p>Schau dir den Code nochmals an. In dem Code wird ein Array von Zeigern benötigt. Wenn du nur ein Array von Objekten machst, dann gibt es bei der push Funktion sicher einen Compile-Fehler <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>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19415">@Zeiteisen</a>,<br />
Das was Drakon sagt ist korrekt, aber du solltest auch noch die zwei nachfolgenden for-Schleifen begutachten, die haben genau denselben Fehler. Einfach das <code>&lt;=</code> durch ein <code>&lt;</code> ersetzen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1540526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540526</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 03 Jul 2008 16:35:23 GMT</pubDate></item><item><title><![CDATA[Reply to Array Stack push on Thu, 03 Jul 2008 17:04:35 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>ghorst schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Das müsste einen Compile Fehler geben.</p>
</blockquote>
<p>warum sollte es einen solchen geben? das ist in c und c++ völlig legal</p>
</blockquote>
<p>Wenn es ein semantischer Fehler ist, dann muss das der Compiler entdecken. Vielleicht will er ja ein Array von Zeigern auf chip haben. Im übrigen ruft er ja new auf und übergibt den Zeiger der Klasse, wo er den Zeiger in einem Array speichert. Das kann er so ganz gut machen. (Über das schlechtes Design reden wir hier mal nicht)</p>
</blockquote>
<p>Erzähl mir bitte was über das schlechte Design.<br />
Hab das mit den for Schleifen korrigiert. Das eigentliche Problem ist leider nicht gelöst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1540549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540549</guid><dc:creator><![CDATA[Zeiteisen]]></dc:creator><pubDate>Thu, 03 Jul 2008 17:04:35 GMT</pubDate></item><item><title><![CDATA[Reply to Array Stack push on Thu, 03 Jul 2008 17:22:00 GMT]]></title><description><![CDATA[<p>Du hast immernoch das gleiche Problem, aber diesmal anderst.</p>
<pre><code class="language-cpp">for (int i=0; i&lt;=size; i++)
        {
            counter[feld[i]-&gt;zeigdich()]++;
        }
</code></pre>
<p>Hier wird bei chip_2 2 zurückgegeben. Bei aller lieber zur 2, geht das bei einem Array der Grösse 2 einfach nicht. <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>
<p>Zum Design:<br />
1. Du übergibst den Zeiger, den du per new anforderst an eine Klasse, die den Verwalten soll. Wer soll das den jetzt aufräumen? Deiner Meinung nach ja der User der Klasse, was ihm aber so ohne weiteres nicht (so einfach) möglich ist.</p>
<p>2. Du scheinst dich in deinem eigenen Code ja nicht sehr auszukennen und daher kann das gar kein gutes Design sein,wenn der Programmierer selbst da nicht durchblickt.</p>
<p>3. Ich nehme mal an, dass du da ein RTTI System simulieren willst. Das geht aber besser (wenn überhaupt nötig) per dynamic_cast&lt;&gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1540559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540559</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 03 Jul 2008 17:22:00 GMT</pubDate></item><item><title><![CDATA[Reply to Array Stack push on Thu, 03 Jul 2008 17:36:13 GMT]]></title><description><![CDATA[<p>BTW: Warum selbst einen Stack schreiben, wenn's den schon <a href="http://cppreference.com/cppstack/index.html" rel="nofollow">im Standard</a> gibt ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1540571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540571</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 03 Jul 2008 17:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to Array Stack push on Thu, 03 Jul 2008 17:41:26 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Zum Design:<br />
[..]<br />
2. Du scheinst dich in deinem eigenen Code ja nicht sehr auszukennen und daher kann das gar kein gutes Design sein,wenn der Programmierer selbst da nicht durchblickt.</p>
</blockquote>
<p>Also hat das hier jeder Fragender <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>Nunja das ist eine Klausuraufgabe mit einigen Lösungsvoraussetzungen.<br />
Und es stürzt immernoch ab... Dennoch danke für die schnellen Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1540577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540577</guid><dc:creator><![CDATA[Zeiteisen]]></dc:creator><pubDate>Thu, 03 Jul 2008 17:41:26 GMT</pubDate></item><item><title><![CDATA[Reply to Array Stack push on Thu, 03 Jul 2008 17:43:55 GMT]]></title><description><![CDATA[<p>Dem Standard-Stack lässt sich halt nicht so einfach eine Methode &quot;zeigdich&quot; hinzufügen, da man ja nicht über die Elemente im Stack iterieren kann. Und bevor man sich eine Wrapperklasse um den Standard-Stack schreibt, die die Elemente beim Einfügen zählt, kann man sich auch gleich nen eigenen Stack schreiben:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;map&gt;

struct foo
{
    virtual int bar() const = 0;
};

struct foo_a : foo
{
    int bar() const { return 0; }
};

struct foo_b : foo
{
    int bar() const { return 1; }
};

struct foo_c : foo
{
    int bar() const { return 2; }
};

class foo_stack
{
    public:
        bool empty() const
        {
            return foos.empty();
        }

        void push(foo* f)
        {
            foos.push_back(f);
        }

        foo* top()
        {
            return foos.back();
        }

        void pop()
        {
            foos.pop_back();
        }

        size_t size() const
        {
            return foos.size();
        }

        friend std::ostream&amp; operator&lt;&lt; (std::ostream&amp; os, const foo_stack&amp; s)
        {
            std::map&lt;int, int&gt; count;
            for(std::vector&lt;foo*&gt;::const_iterator iter = s.foos.begin(), end = s.foos.end(); iter != end; ++iter)
            {
                ++count[(*iter)-&gt;bar()];
            }
            for(std::map&lt;int, int&gt;::const_iterator iter = count.begin(), end = count.end(); iter != end; ++iter)
            {
                os &lt;&lt; &quot;Vom Typ &quot; &lt;&lt; iter-&gt;first &lt;&lt; &quot; vorhanden: &quot; &lt;&lt; iter-&gt;second &lt;&lt; std::endl;
            }
            return os;
        }

    private:
        std::vector&lt;foo*&gt; foos;
};

int main()
{
    foo_stack s;
    s.push(new foo_a());
    s.push(new foo_b());
    s.push(new foo_a());
    s.push(new foo_c());

    std::cout &lt;&lt; s;

    while(!s.empty())
    {
        foo* f = s.top();
        s.pop();
        delete f;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1540579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540579</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Thu, 03 Jul 2008 17:43:55 GMT</pubDate></item><item><title><![CDATA[Reply to Array Stack push on Thu, 03 Jul 2008 17:46:07 GMT]]></title><description><![CDATA[<p>Zeiteisen schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Zum Design:<br />
[..]<br />
2. Du scheinst dich in deinem eigenen Code ja nicht sehr auszukennen und daher kann das gar kein gutes Design sein,wenn der Programmierer selbst da nicht durchblickt.</p>
</blockquote>
<p>Also hat das hier jeder Fragender <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>Nunja das ist eine Klausuraufgabe mit einigen Lösungsvoraussetzungen.<br />
Und es stürzt immernoch ab... Dennoch danke für die schnellen Antworten.</p>
</blockquote>
<p>Das ist auch nicht unsere Aufgabe deinen Code zu verstehen und wir haben ihn ja nicht geschrieben.</p>
<p>Na, wenns ne Aufgabe ist, dann solltest du dich mal ransetzen und mal ein wenig überlgen und den Debugger benutzen. Ich hätte kein Problem das zu lösen und die Fehler zu finden, aber dazu habe ich keine Lust, wenn du selber keine Initiative zeigst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1540581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540581</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 03 Jul 2008 17:46:07 GMT</pubDate></item><item><title><![CDATA[Reply to Array Stack push on Thu, 03 Jul 2008 19:15:03 GMT]]></title><description><![CDATA[<p>Für die es interessiert:<br />
Die Fehler waren alle in der zeigdich Methode und zwar:</p>
<p>korrigierter zeigdich</p>
<pre><code class="language-cpp">void zeigdich()
	{
		int counter[3];
		for (int i=0; i&lt;3; i++)
		{
			counter[i] = 0;
		}

		for (int i=0; i&lt;top; i++)
		{
			counter[feld[i]-&gt;zeigdich()]++;
		}

		for (int i=0; i&lt;3; i++)
		{
			cout &lt;&lt; &quot;Von Typ &quot; &lt;&lt; i &lt;&lt; &quot; vorhanden: &quot; &lt;&lt; counter[i] &lt;&lt; endl;
		}
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1540626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1540626</guid><dc:creator><![CDATA[Zeiteisen]]></dc:creator><pubDate>Thu, 03 Jul 2008 19:15:03 GMT</pubDate></item></channel></rss>