<?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[Ringpuffer]]></title><description><![CDATA[<p>Hallo,<br />
habe folgendes Problem. Ich soll ein ein Testprogramm zur Ermittlung der Performance in einem GDI-Koordinator schreiben.<br />
Dazu soll ich auch Messwerte in einen Ringpuffer schreiben. Es existiert folgende Callback-Funktion an den Treiber:</p>
<p>[void __stdcall IRReadChannelValues(<br />
MDAQCO_ThConnectionHandle hConnection,<br />
MDAQCO_ThDeviceComponentHandle hChannelOrGroup,<br />
const MDAQCO_TChannelStreamTransfer* poData)<br />
{<br />
/*<br />
typedef struct MDAQCO_TChannelStreamTransfer_tag<br />
{<br />
MDAQCO_TStreamTransferStatus m_oStatus; ///&lt; Übertragungsstatus<br />
MDAQCO_TChannelStreamData m_oData; ///&lt; Daten</p>
<p>} MDAQCO_ALIGNMENT_SPEC MDAQCO_TChannelStreamTransfer;</p>
<p>*/</p>
<p>unsigned long* ulValue=(unsigned long*)poData-&gt;m_oData.m_pData;</p>
<p>for(unsigned long i=0;i&lt;poData-&gt;m_oData.m_ulNumberOfDataBytes/4;i++)<br />
{<br />
printf(&quot;%ld &quot;,*(ulValue));<br />
ulValue++;<br />
}</p>
<p>}]</p>
<p>ulValue speichert die von einem UDP-Programm übermittelten Daten. Diese sollen in den Ringpuffer geschrieben werden.<br />
Kann mir jemand erklären, wie ich am besten vorgehe?</p>
<p>Vielen Dank im Vorraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219901/ringpuffer</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 14:02:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219901.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 09 Aug 2008 12:45:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ringpuffer on Sat, 09 Aug 2008 12:45:00 GMT]]></title><description><![CDATA[<p>Hallo,<br />
habe folgendes Problem. Ich soll ein ein Testprogramm zur Ermittlung der Performance in einem GDI-Koordinator schreiben.<br />
Dazu soll ich auch Messwerte in einen Ringpuffer schreiben. Es existiert folgende Callback-Funktion an den Treiber:</p>
<p>[void __stdcall IRReadChannelValues(<br />
MDAQCO_ThConnectionHandle hConnection,<br />
MDAQCO_ThDeviceComponentHandle hChannelOrGroup,<br />
const MDAQCO_TChannelStreamTransfer* poData)<br />
{<br />
/*<br />
typedef struct MDAQCO_TChannelStreamTransfer_tag<br />
{<br />
MDAQCO_TStreamTransferStatus m_oStatus; ///&lt; Übertragungsstatus<br />
MDAQCO_TChannelStreamData m_oData; ///&lt; Daten</p>
<p>} MDAQCO_ALIGNMENT_SPEC MDAQCO_TChannelStreamTransfer;</p>
<p>*/</p>
<p>unsigned long* ulValue=(unsigned long*)poData-&gt;m_oData.m_pData;</p>
<p>for(unsigned long i=0;i&lt;poData-&gt;m_oData.m_ulNumberOfDataBytes/4;i++)<br />
{<br />
printf(&quot;%ld &quot;,*(ulValue));<br />
ulValue++;<br />
}</p>
<p>}]</p>
<p>ulValue speichert die von einem UDP-Programm übermittelten Daten. Diese sollen in den Ringpuffer geschrieben werden.<br />
Kann mir jemand erklären, wie ich am besten vorgehe?</p>
<p>Vielen Dank im Vorraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1561809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1561809</guid><dc:creator><![CDATA[SuperAdmin]]></dc:creator><pubDate>Sat, 09 Aug 2008 12:45:00 GMT</pubDate></item><item><title><![CDATA[Reply to Ringpuffer on Sat, 09 Aug 2008 13:17:27 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">/* noch unübersichtlicher bekommt man das auch nicht hin, oder?
typedef struct MDAQCO_TChannelStreamTransfer_tag 
{ 
  MDAQCO_TStreamTransferStatus m_oStatus; ///&lt; Übertragungsstatus 
  MDAQCO_TChannelStreamData m_oData; ///&lt; Daten 
} MDAQCO_ALIGNMENT_SPEC MDAQCO_TChannelStreamTransfer; 
*/ 

void __stdcall IRReadChannelValues (MDAQCO_ThConnectionHandle hConnection, MDAQCO_ThDeviceComponentHandle hChannelOrGroup, const MDAQCO_TChannelStreamTransfer* poData)
  {
    unsigned long* ulValue=(unsigned long*)poData-&gt;m_oData.m_pData; //kein C++ !

    for (unsigned long i=0; i&lt;poData-&gt;m_oData.m_ulNumberOfDataBytes/4; i++) 
      { 
        printf(&quot;%ld &quot;,*(ulValue)); //KEIN C++ !
        ulValue++; 
      } 
  }
</code></pre>
<p>wäre schon mal nen anfang gewesen ^^<br />
und guck dir mal namespaces an... das MDAQCO_ am Anfang nervt auch immer ein wenig ^^</p>
<p>also geh entweder ins ANSI C Forum oder nimm std::cout, static_cast und vor allem ordentliche variablennamen!</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1561817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1561817</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 09 Aug 2008 13:17:27 GMT</pubDate></item><item><title><![CDATA[Reply to Ringpuffer on Sat, 09 Aug 2008 14:09:49 GMT]]></title><description><![CDATA[<p>Danke für die Kritik, hat mir jetzt nicht so wirklich weitergeholfen.<br />
Das is aber auch nicht meine Funktion.<br />
Ich will eigentlich nur wissen, wie ich nen Ringpuffer in C <em>oder</em> in C++ anlege.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1561851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1561851</guid><dc:creator><![CDATA[SuperAdmin]]></dc:creator><pubDate>Sat, 09 Aug 2008 14:09:49 GMT</pubDate></item><item><title><![CDATA[Reply to Ringpuffer on Sat, 09 Aug 2008 14:12:07 GMT]]></title><description><![CDATA[<p>SuperAdmin schrieb:</p>
<blockquote>
<p>Danke für die Kritik, hat mir jetzt nicht so wirklich weitergeholfen.<br />
Das is aber auch nicht meine Funktion.<br />
Ich will eigentlich nur wissen, wie ich nen Ringpuffer in C <em>oder</em> in C++ anlege.</p>
</blockquote>
<p>selber implementieren, oder einen fertigen irgendwo her besorgen.<br />
idR reicht aber ein std::list</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1561852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1561852</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sat, 09 Aug 2008 14:12:07 GMT</pubDate></item><item><title><![CDATA[Reply to Ringpuffer on Sat, 09 Aug 2008 14:52:15 GMT]]></title><description><![CDATA[<p>Ich wäre sehr dankbar, wenn mir jemand vielleicht mal ein Quelltextbeispiel zum Thema geben könnte. Wär' ne coole Sache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1561869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1561869</guid><dc:creator><![CDATA[SuperAdmin]]></dc:creator><pubDate>Sat, 09 Aug 2008 14:52:15 GMT</pubDate></item><item><title><![CDATA[Reply to Ringpuffer on Sat, 09 Aug 2008 15:07:24 GMT]]></title><description><![CDATA[<p>SuperAdmin schrieb:</p>
<blockquote>
<p>Ich wäre sehr dankbar, wenn mir jemand vielleicht mal ein Quelltextbeispiel zum Thema geben könnte. Wär' ne coole Sache.</p>
</blockquote>
<p>Benutz mal die Suchfunktion. Das hatten wir hier mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1561871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1561871</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 09 Aug 2008 15:07:24 GMT</pubDate></item><item><title><![CDATA[Reply to Ringpuffer on Sat, 09 Aug 2008 15:24:30 GMT]]></title><description><![CDATA[<p>SuperAdmin schrieb:</p>
<blockquote>
<p>Ich wäre sehr dankbar, wenn mir jemand vielleicht mal ein Quelltextbeispiel zum Thema geben könnte. Wär' ne coole Sache.</p>
</blockquote>
<pre><code class="language-cpp">#include &lt;deque&gt;

using namespace std;

int main()
{
	const int SizeRingpuffer = 10;
	int tvalue = 4;

	deque&lt;int&gt; Ringpuffer(SizeRingpuffer, 0);

	// Durch ein push_front(= Wert einfuegen) gefolgt von einem pop_back
	// haelt der Ringpuffer seine konstante Laenge.
	Ringpuffer.push_front(tvalue);
	Ringpuffer.pop_back();

	return 0;
}
</code></pre>
<p><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/1561875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1561875</guid><dc:creator><![CDATA[egon2]]></dc:creator><pubDate>Sat, 09 Aug 2008 15:24:30 GMT</pubDate></item><item><title><![CDATA[Reply to Ringpuffer on Sat, 09 Aug 2008 16:19:00 GMT]]></title><description><![CDATA[<p>Hallo, ich bin's nochmal.<br />
Erstmal herzlichsten Dank für das kleine Beispiel, hat mir erstmal weitergeholfen.<br />
Noch 'ne kurze Frage. Klingt vielleicht blöd, bin aber noch Anfänger. <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="🙂"
    /><br />
Vereinfacht gesagt, ich will in einer for-Schleife ziemlich viele Daten einlesen.</p>
<p>Einfaches Beispiel:</p>
<pre><code class="language-cpp">for(i=0; i&lt;=500; i++)
{
     Value++;
}
</code></pre>
<p>Ein Ringpuffer bei konstanter Größe schmeißt doch die letzten Daten raus, wenn neue hinzugefügt werden, oder?<br />
Wie schaff ich es, den Puffer(der ja kleiner sein soll als die Anzahl der insgesamt abzuspeichernden Daten) in einer solchen Schleife zu befüllen, ohne dass ich Probleme mit dem Speicher bekomme ?</p>
<p>(nicht lachen, wie gesagt, ANFÄNGER <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/1561904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1561904</guid><dc:creator><![CDATA[SuperAdmin]]></dc:creator><pubDate>Sat, 09 Aug 2008 16:19:00 GMT</pubDate></item><item><title><![CDATA[Reply to Ringpuffer on Sat, 09 Aug 2008 22:36:57 GMT]]></title><description><![CDATA[<p>Ich versteh deine Frage nicht so recht... Wie sollst du denn Probleme mit dem Speicher bekommen? Oo</p>
<pre><code class="language-cpp">#include &lt;deque&gt; //hat nur leider kein reserver aber ich schätze mal, dass das trotzdem in Ordnung geht ^^

template &lt;size_t laenge&gt;
  class meinRingpuffer_l
    {
      public:
		  static size_t Limit ()                                     {return laenge;}
    };

template &lt;class T, size_t laenge = 500&gt;
  class meinRingpuffer : public meinRingpuffer_l &lt;500&gt;
    {
      private:
        bool is_full;
        std::deque &lt;T&gt; container;
      public:
        meinRingpuffer () : is_full (false)
          {}
        meinRingpuffer (const meinRingpuffer &lt;T&gt; &amp;rhs) : container (rhs.container), is_full (rhs.is_full)
          {}
        void add (const T &amp;toadd)
          {
            if ((is_full) || (container.size () &gt;= laenge))
              {
                is_full = true;
                container.pop_front ();
              }
            container.push_back (toadd);
          }
        const T&amp; operator [] (const size_t i) const
          {
            return container.at (i);
          }
        //etc
    };

#include &lt;iostream&gt;

int main ()
{
 meinRingpuffer &lt;size_t, 10&gt; eins;
 meinRingpuffer &lt;size_t&gt; zwei;
 meinRingpuffer &lt;size_t&gt; drei (zwei);
 for (size_t i (0); i &lt;= 510; ++i)
  {
   drei.add (i);
  }
 for (size_t i (0); i &lt; drei.Limit (); ++i)
  {
   std::cout &lt;&lt; drei[i] &lt;&lt; std::endl;
  }
}
</code></pre>
<p>so würd ichs anstellen</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562064</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 09 Aug 2008 22:36:57 GMT</pubDate></item><item><title><![CDATA[Reply to Ringpuffer on Sun, 10 Aug 2008 07:17:00 GMT]]></title><description><![CDATA[<p>Vielen Dank, ich werd's mal ausprobieren !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562103</guid><dc:creator><![CDATA[SuperAdmin]]></dc:creator><pubDate>Sun, 10 Aug 2008 07:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to Ringpuffer on Sun, 10 Aug 2008 09:27:06 GMT]]></title><description><![CDATA[<p>Ich hab hier trotzdem noch'n Problem.<br />
Die Daten, die ich im Ringpuffer speichern will, kommen aus folgender callback-Funktion:</p>
<pre><code class="language-cpp">void __stdcall IRReadChannelValues(
									MDAQCO_ThConnectionHandle               hConnection,
									MDAQCO_ThDeviceComponentHandle          hChannelOrGroup,
									const MDAQCO_TChannelStreamTransfer*    poData)
{
	unsigned long* ulValue=(unsigned long*)poData-&gt;m_oData.m_pData;

	for(unsigned long i=0;i&lt;poData-&gt;m_oData.m_ulNumberOfDataBytes/4;i++)
	{
		printf(&quot;%ld &quot;,*(ulValue));
		ulValue++;
		ulCounter++;
		/*for(unsigned long i=0; i&lt;poData-&gt;m_oData.m_ulNumberOfDataBytes/4; i++)
		{
			if(i&lt;=1000)
				deque1.push_back(*ulValue);
			if(i&gt;1000)
			{
				deque1.pop_front();
				deque1.push_back(*ulValue);
			}
		}*/
	}

}
</code></pre>
<p>Ne kurze Erklärung dazu. Im Hintergrund läuft ein UDP-Programm, das &quot;Messdaten&quot; in Form von Integerwerten liefert. In &quot;poData&quot; (out-Parameter) werden diese an die Funktion übergeben. Diese Werte werden wiederum an ulValue übergeben und bei Aufruf der Funktion in der Konsole entsprechend ausgegeben. Es können massig viele Werte sein, je nach Einstellung.<br />
MDAQCO_TChannelStreamTransfer* ist ein Zeiger auf eine Struktur, &quot;m_oData.m_ulNumberOfDataBytes/4&quot; speichert dann die Daten.<br />
Nun habe ich versucht, entsprechende Daten(ist das, was im Kommentar steht) in den Ringpuffer zu schreiben. Geb ich den allerdings aus, wird meine Begrenzung von 1000 Werten erheblich überschritten, genau genommen, läuft das Ganze ins Bodenlose. Zur Ausgabe nutze ich folgende Funktion:</p>
<pre><code class="language-cpp">void printcontents(ULDEQUE deque)
{
	ULDEQUE::iterator pdeque1;
	cout &lt;&lt; &quot;\nRingpuffer: \n&quot;;

	for(pdeque1 = deque1.begin(); pdeque1 != deque1.end(); pdeque1++)
	{
		cout &lt;&lt; *pdeque1 &lt;&lt;  &quot; &quot;;
	}
}
</code></pre>
<p>(ULDEQUE ist ein globaler Ringpuffer-typedef, printcontents-Funktion rufe in der main() auf)</p>
<p>Ich hoffe, das ihr was mit der Funktion und der Erklärung anfangen könnt und vielleicht ne Idee habt, wie man das Problemchen lösen kann.<br />
Für Vorschläge und Lösungen wäre ich sehr dankbar !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562129</guid><dc:creator><![CDATA[SuperAdmin]]></dc:creator><pubDate>Sun, 10 Aug 2008 09:27:06 GMT</pubDate></item><item><title><![CDATA[Reply to Ringpuffer on Sun, 10 Aug 2008 11:18:29 GMT]]></title><description><![CDATA[<p>SuperAdmin schrieb:</p>
<blockquote>
<p>Ein Ringpuffer bei konstanter Größe schmeißt doch die letzten Daten raus, wenn neue hinzugefügt werden, oder?<br />
Wie schaff ich es, den Puffer(der ja kleiner sein soll als die Anzahl der insgesamt abzuspeichernden Daten) in einer solchen Schleife zu befüllen, ohne dass ich Probleme mit dem Speicher bekomme ?</p>
</blockquote>
<p>Mir sind Deine Anforderungen an den 'Ringpuffer ' nicht klar.<br />
Ein Ringpuffer mit konstanter Größe bekommt natürlich keine Probleme mit dem Speicher, weil seine Größe ja konstant ist!</p>
<p>Was soll denn in Deiner Anwendung passieren, wenn der erste Messwert in den Rinpuffer geschrieben werden soll, der nicht mehr rein passt, also in diesem Fall das gewählte Limit von 1000 Werten übersteigt?</p>
<p>Im Allgemeinen gibt es drei Möglichkeiten:<br />
- der älteste (also 1.) Wert wird gelöscht; bzw. überschrieben.<br />
- der Ringpuffer soll sich automatisch vergrößern<br />
- der schreibende Thread (also hier die Callbackfunktion) soll blockieren</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562182</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 10 Aug 2008 11:18:29 GMT</pubDate></item></channel></rss>