<?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[Elemente im Ringpuffer verschwinden [GELÖST]]]></title><description><![CDATA[<p>Hi,<br />
Ich habe hier ein Problem mit meinem Programm, dass eine Integer-Warteschlange in Form eines Ringpuffers erzeugen soll und anschließend testet, ob er richtig funktioniert.<br />
Dazu sollte ich zuerst eine Ringpuffer-Struktur schreiben:</p>
<pre><code class="language-cpp">struct RingBuffer {
    int *pIn;
    int *pArray;
    int *pOut;
};
</code></pre>
<p>Anschließend gibt es<br />
- eine Funktion, die einen Ringpuffer erzeugt,<br />
- eine Funktion, die den Speicher am Ende wieder freigibt,<br />
- eine Funktion push, die Elemente in den Ringpuffer hinzufügt<br />
- und eine Funktion pull, die Elemente ausliest.</p>
<p>Mein Problem liegt bei den letzten beiden, denn nachdem ich mit der push-Funktion Elemente eingegeben habe, und sie später mit pull wieder auslesen will, kommen ganz andere Zahlen, also wurden die dort gespeicherten Eingaben wieder gelöscht, aber ich weiß nicht wieso.<br />
Hier sind die beiden Funktionen:</p>
<pre><code class="language-cpp">void push(RingBuffer&amp; rb, int n) {
    RingBuffer *Puffer = &amp;rb;
    if(Puffer-&gt;pIn != &amp;Puffer-&gt;pArray[nCAPACITY]) {
        *Puffer-&gt;pIn = n;
        cout &lt;&lt; &quot;pIn-Inhalt: &quot; &lt;&lt; *Puffer-&gt;pIn &lt;&lt; &quot; bei pIn-Adresse: &quot; &lt;&lt; Puffer-&gt;pIn &lt;&lt; endl;
        Puffer-&gt;pIn += 1;
    }
}
</code></pre>
<pre><code class="language-cpp">int pull(RingBuffer&amp; rb) {
    RingBuffer *Puffer = &amp;rb;
    if(Puffer-&gt;pOut != Puffer-&gt;pIn) {
        int* pTemp = Puffer-&gt;pOut;
        cout &lt;&lt; &quot;pOut-Inhalt: &quot; &lt;&lt; *Puffer-&gt;pOut &lt;&lt; &quot; bei pOut-Adresse: &quot; &lt;&lt; Puffer-&gt;pOut &lt;&lt; endl;
        Puffer-&gt;pOut += 1;
        return *pTemp;
    }
    else return 0;
</code></pre>
<p>Wie man sieht, hab ich auch cout-Befehle eingegeben, um zu sehen, was genau an welcher Stelle gespeichert ist. Wenn ich die Warteschlange z.B. auf drei Elemente begrenze und die Zahlen 1, 2, 3 eingebe, wird mir folgendes ausgegeben:</p>
<blockquote>
<p>pIn-Inhalt: 1 bei pIn-Adresse: 0x22fe20<br />
pIn-Inhalt: 2 bei pIn-Adresse: 0x22fe24<br />
pIn-Inhalt: 3 bei pIn-Adresse: 0x22fe28</p>
<p>Ausgabe der Elemente in der Warteschlange:<br />
pOut-Inhalt: 4669632 bei pOut-Adresse: 0x22fe20<br />
pOut-Inhalt: 172442912 bei pOut-Adresse: 0x22fe24<br />
pOut-Inhalt: 2293700 bei pOut-Adresse: 0x22fe28</p>
</blockquote>
<p>Obwohl pOut auf die richtigen Speicheradressen zeigt, kommt etwas anderes zurück. Ich kannte den Fehler nur, wenn man lokale Variablen übergibt und sich wundert, dass die Veränderungen nach der Funktion verschwinden, aber hier habe ich ja Pointer benutzt. Was könnte ich falsch gemacht haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/278226/elemente-im-ringpuffer-verschwinden-gelöst</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 08:31:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/278226.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 02 Dec 2010 11:01:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Elemente im Ringpuffer verschwinden [GELÖST] on Thu, 02 Dec 2010 13:55:04 GMT]]></title><description><![CDATA[<p>Hi,<br />
Ich habe hier ein Problem mit meinem Programm, dass eine Integer-Warteschlange in Form eines Ringpuffers erzeugen soll und anschließend testet, ob er richtig funktioniert.<br />
Dazu sollte ich zuerst eine Ringpuffer-Struktur schreiben:</p>
<pre><code class="language-cpp">struct RingBuffer {
    int *pIn;
    int *pArray;
    int *pOut;
};
</code></pre>
<p>Anschließend gibt es<br />
- eine Funktion, die einen Ringpuffer erzeugt,<br />
- eine Funktion, die den Speicher am Ende wieder freigibt,<br />
- eine Funktion push, die Elemente in den Ringpuffer hinzufügt<br />
- und eine Funktion pull, die Elemente ausliest.</p>
<p>Mein Problem liegt bei den letzten beiden, denn nachdem ich mit der push-Funktion Elemente eingegeben habe, und sie später mit pull wieder auslesen will, kommen ganz andere Zahlen, also wurden die dort gespeicherten Eingaben wieder gelöscht, aber ich weiß nicht wieso.<br />
Hier sind die beiden Funktionen:</p>
<pre><code class="language-cpp">void push(RingBuffer&amp; rb, int n) {
    RingBuffer *Puffer = &amp;rb;
    if(Puffer-&gt;pIn != &amp;Puffer-&gt;pArray[nCAPACITY]) {
        *Puffer-&gt;pIn = n;
        cout &lt;&lt; &quot;pIn-Inhalt: &quot; &lt;&lt; *Puffer-&gt;pIn &lt;&lt; &quot; bei pIn-Adresse: &quot; &lt;&lt; Puffer-&gt;pIn &lt;&lt; endl;
        Puffer-&gt;pIn += 1;
    }
}
</code></pre>
<pre><code class="language-cpp">int pull(RingBuffer&amp; rb) {
    RingBuffer *Puffer = &amp;rb;
    if(Puffer-&gt;pOut != Puffer-&gt;pIn) {
        int* pTemp = Puffer-&gt;pOut;
        cout &lt;&lt; &quot;pOut-Inhalt: &quot; &lt;&lt; *Puffer-&gt;pOut &lt;&lt; &quot; bei pOut-Adresse: &quot; &lt;&lt; Puffer-&gt;pOut &lt;&lt; endl;
        Puffer-&gt;pOut += 1;
        return *pTemp;
    }
    else return 0;
</code></pre>
<p>Wie man sieht, hab ich auch cout-Befehle eingegeben, um zu sehen, was genau an welcher Stelle gespeichert ist. Wenn ich die Warteschlange z.B. auf drei Elemente begrenze und die Zahlen 1, 2, 3 eingebe, wird mir folgendes ausgegeben:</p>
<blockquote>
<p>pIn-Inhalt: 1 bei pIn-Adresse: 0x22fe20<br />
pIn-Inhalt: 2 bei pIn-Adresse: 0x22fe24<br />
pIn-Inhalt: 3 bei pIn-Adresse: 0x22fe28</p>
<p>Ausgabe der Elemente in der Warteschlange:<br />
pOut-Inhalt: 4669632 bei pOut-Adresse: 0x22fe20<br />
pOut-Inhalt: 172442912 bei pOut-Adresse: 0x22fe24<br />
pOut-Inhalt: 2293700 bei pOut-Adresse: 0x22fe28</p>
</blockquote>
<p>Obwohl pOut auf die richtigen Speicheradressen zeigt, kommt etwas anderes zurück. Ich kannte den Fehler nur, wenn man lokale Variablen übergibt und sich wundert, dass die Veränderungen nach der Funktion verschwinden, aber hier habe ich ja Pointer benutzt. Was könnte ich falsch gemacht haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1988929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988929</guid><dc:creator><![CDATA[Toffi-Fee]]></dc:creator><pubDate>Thu, 02 Dec 2010 13:55:04 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente im Ringpuffer verschwinden [GELÖST] on Thu, 02 Dec 2010 11:41:47 GMT]]></title><description><![CDATA[<p>Vermutlich ist der Array-Zeiger im Ringpuffer nicht auf ein tatsächliches Array verlinkt. Zeige mal den Code, mit dem Du den eigentlichen Puffer erzeugst.</p>
<p>Zudem machst Du eine überflüssige Verpointerung in den Methoden. Behandle den Buffer doch wie ein Objekt:</p>
<pre><code class="language-cpp">int pull(RingBuffer&amp; rb) {
    // RingBuffer *Puffer = &amp;rb;   &lt;&lt;-- das weg!
    if(rb.pOut != rb.pIn) {
        int* pTemp = rb.pOut;
        cout &lt;&lt; &quot;pOut-Inhalt: &quot; &lt;&lt; *(rb.pOut) &lt;&lt; &quot; bei pOut-Adresse: &quot; &lt;&lt; rb.pOut &lt;&lt; endl;
        rb.pOut += 1;
        return *pTemp;
    }
    else return 0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1988951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988951</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Thu, 02 Dec 2010 11:41:47 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente im Ringpuffer verschwinden [GELÖST] on Thu, 02 Dec 2010 12:03:00 GMT]]></title><description><![CDATA[<p>minastaros schrieb:</p>
<blockquote>
<p>Behandle den Buffer doch wie ein Objekt:</p>
</blockquote>
<p>Überhaupt schreit das ganze Problem nach einer objektorientierten Herangehensweise. Mit einer schicken Ringpufferklasse die ihre Größe, Speicherbereich und Einsprungpointer selber kennt, wäre das so viel einfacher, sicherer in der Anwendung und (meiner Meinung nach) auch viel weniger fehleranfällig in der Programmierung. Extrapunkte gibt es, wenn man es noch templatisiert.</p>
<p>Da er C++ macht, muss der Threadersteller sich daher die Frage gefallen lassen, warum er diese Mittel nicht nutzt. Gibt's dafür einen guten Grund?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1988965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988965</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 02 Dec 2010 12:03:00 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente im Ringpuffer verschwinden [GELÖST] on Thu, 02 Dec 2010 12:08:17 GMT]]></title><description><![CDATA[<p>Ohh, ich habe sowieso erstmal nicht verstanden, wie ich &amp;rb behandeln soll]. Danke, so sieht es schon viel besser aus. Hier ist die Funktion, mit der ich den Ringpuffer erzeuge:</p>
<pre><code class="language-cpp">RingBuffer create(int Capacity) {
    int nArray[Capacity];
    RingBuffer *Puffer = new RingBuffer;
    Puffer-&gt;pArray = nArray;
    Puffer-&gt;pIn = Puffer-&gt;pArray;
    Puffer-&gt;pOut = Puffer-&gt;pArray;
    return *Puffer;
}
</code></pre>
<p>EDIT: Leider darf ich Klassen noch nicht benutzen, ich studiere gerade, und da sollen wir immer die Mittel anwenden, die wir erlernt haben, um zu zeigen, dass wir sie beherrschen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Aus meiner Aufgabenstellung geht auch hervor, dass ich diese genannten Funktionen auf jeden Fall außerhalb der Struktur schreiben muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1988967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988967</guid><dc:creator><![CDATA[Toffi-Fee]]></dc:creator><pubDate>Thu, 02 Dec 2010 12:08:17 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente im Ringpuffer verschwinden [GELÖST] on Thu, 02 Dec 2010 12:16:12 GMT]]></title><description><![CDATA[<p>Du speicherst einen Zeiger auf eine lokale Variable: Das Array nArray ist nach dem Aufruf von create weg, der Zeiger damit ungültig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1988973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988973</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Thu, 02 Dec 2010 12:16:12 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente im Ringpuffer verschwinden [GELÖST] on Thu, 02 Dec 2010 12:47:45 GMT]]></title><description><![CDATA[<p>Achso, wie dumm. Ich hab den Fehler an der falschen Stelle gesucht. Aber jetzt habe ich nArray global deklariert und nun scheint es fehlerfrei zu klappen. Danke für eure Hilfe <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/1988995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988995</guid><dc:creator><![CDATA[Toffi-Fee]]></dc:creator><pubDate>Thu, 02 Dec 2010 12:47:45 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente im Ringpuffer verschwinden [GELÖST] on Thu, 02 Dec 2010 20:31:36 GMT]]></title><description><![CDATA[<p>Hallo Toffi-Fee,</p>
<p>ein herzliches Willkommen im C++-Forum.</p>
<p>Gelöst ist Dein Problem noch nicht, weil die Funktion create immer noch einen Fehler enthält, Sie produziert ein Memory-Leak. Aber das ist nicht so schlimm, das kann man korrigieren.<br />
Schlimmer ist, dass Du an in Deinem Studium anscheinend einen C++-Kurs belegt hast, in dem Du zwar new und Pointer lernst, aber nicht class und std::vector. Lass Dir gesagt sein, dass kein professioneller C++-Programmierer das so macht, wie Du es da lernst.</p>
<p>Tue Dir, deinem Dozenten und uns doch mal den Gefallen und sage ihm (oder ihr), dass er sich hier mal melden soll.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1989318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1989318</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 02 Dec 2010 20:31:36 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente im Ringpuffer verschwinden [GELÖST] on Thu, 02 Dec 2010 22:23:27 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>in dem Du zwar new und Pointer lernst, aber nicht class und std::vector. Lass Dir gesagt sein, dass kein professioneller C++-Programmierer das so macht, wie Du es da lernst.</p>
</blockquote>
<p>Die &quot;Fee&quot; hat doch geschrieben, dass sie nur die Elemente benutzen sollen, die bereits behandelt wurden. Da ist eben <code>std::vector</code> noch nicht dabei. Zudem sollte man auch in C++ über Arrays bescheid wissen und Erfahrungen sammeln.<br />
Und vielleicht sollte man den Leuten erstmal die Möglichkeit geben, die einfachen Dinge zu lernen, bevor man sie an den &quot;professionellen Programmierern&quot; misst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1989379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1989379</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Thu, 02 Dec 2010 22:23:27 GMT</pubDate></item><item><title><![CDATA[Reply to Elemente im Ringpuffer verschwinden [GELÖST] on Fri, 03 Dec 2010 07:43:56 GMT]]></title><description><![CDATA[<p>Wenn man ein mentales Modell dessen hat, was da im Hintergrund geschieht, wenn man mit High-Level-Konstrukten der &quot;professionellen Programmierer&quot; um sich schmeißt, dient das dem besseren Verständnis und als Gedächtnisstütze. Das entschuldigt natürlich keine elementaren Fehler der Lehrenden Person.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1989416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1989416</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 03 Dec 2010 07:43:56 GMT</pubDate></item></channel></rss>