<?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[Problem mit zyklischem Buffer [solved]]]></title><description><![CDATA[<p>Hallo!</p>
<p>ich habe habe ein Problem mit einem zyklischen Buffer. Die folgende Funktion ist dafür verantwortlich, den Buffer zu füllen:</p>
<pre><code>void CMyClass::process ( const CSequence&lt;signed short&gt;* const s ) {
	BYTE* buf = static_cast&lt;BYTE*&gt;( m_pUserData-&gt;buf );
	if ( ! m_pUserData-&gt;bInit ) {
		m_pUserData-&gt;last = m_pUserData-&gt;size - 1;
	}
	m_pUserData-&gt;last = ( m_pUserData-&gt;last + 1 ) % m_pUserData-&gt;size;
	const unsigned int iFirstNew = m_pUserData-&gt;last;
	const unsigned int iNewBytes = ( s-&gt;getLastIndex () + 1 ) * 2;
	const unsigned int iUntilEnd = ( iFirstNew + iNewBytes &gt; m_pUserData-&gt;size ) ? m_pUserData-&gt;size - iFirstNew : iNewBytes;
	const unsigned int iFromBegin = iNewBytes - iUntilEnd;
	memcpy ( buf + iFirstNew, s-&gt;getPtr (), iUntilEnd );
	memcpy ( buf, s-&gt;getPtr (), iFromBegin );
	if ( m_pUserData-&gt;bInit &amp;&amp; ( m_pUserData-&gt;first &lt; iFromBegin || ( iFirstNew &lt;= m_pUserData-&gt;first &amp;&amp; iFirstNew + iUntilEnd &gt; m_pUserData-&gt;first ) ) ) {
		std::cerr &lt;&lt; &quot;Buffer Overrun&quot; &lt;&lt; std::endl;
		exit(1); // TODO: Lost sync, try to restore?
	}
	m_pUserData-&gt;last = ( iFirstNew + iNewBytes - 1 ) % m_pUserData-&gt;size;
	if ( ! m_pUserData-&gt;bInit ) {
		m_pUserData-&gt;bInit = true;
	}
	unsigned int sum1=0; for (unsigned int b=0; b &lt; (s-&gt;getLastIndex()+1)*2; b++) { sum1 += static_cast&lt;unsigned int&gt;(static_cast&lt;const BYTE*&gt;(s-&gt;getPtr())[b]); }
	unsigned int sum2=0; for (unsigned int b=0; b &lt; (s-&gt;getLastIndex()+1)*2; b++) { sum2 += static_cast&lt;unsigned int&gt;((iFirstNew+b)%m_pUserData-&gt;size); }
	std::cout &lt;&lt; sum1 &lt;&lt; &quot; - &quot; &lt;&lt; sum2 &lt;&lt; std::endl;
	std::cout &lt;&lt; (sum1 == sum2 ? &quot;[ok]&quot; : &quot;[EE]&quot;) &lt;&lt; std::endl;
}
</code></pre>
<p>Zur Kontrolle der Daten berechne ich zwei einfache Prüfsummen. Dummerweise sind diese <strong>immer</strong> unterschiedlich, was bedeutet, dass die Werte nicht korrekt im Buffer eingetragen werden. Allerdings finde ich partout keinen Fehler. Weiß jemand Rat?</p>
<p>PS. Die Klasse CSequence enthält die Daten, die in den Buffer eingetragen werden sollen. Dabei gibt &quot;getLastIndex ()&quot; den Index des letzten Elements an, das bereitgestellt wird.</p>
<p>Danke im Voraus!</p>
<p><em>EDIT: hat sich inzwischen erledigt :p</em></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/206152/problem-mit-zyklischem-buffer-solved</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 05:05:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206152.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 21 Feb 2008 16:44:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit zyklischem Buffer [solved] on Sun, 24 Feb 2008 10:16:11 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>ich habe habe ein Problem mit einem zyklischen Buffer. Die folgende Funktion ist dafür verantwortlich, den Buffer zu füllen:</p>
<pre><code>void CMyClass::process ( const CSequence&lt;signed short&gt;* const s ) {
	BYTE* buf = static_cast&lt;BYTE*&gt;( m_pUserData-&gt;buf );
	if ( ! m_pUserData-&gt;bInit ) {
		m_pUserData-&gt;last = m_pUserData-&gt;size - 1;
	}
	m_pUserData-&gt;last = ( m_pUserData-&gt;last + 1 ) % m_pUserData-&gt;size;
	const unsigned int iFirstNew = m_pUserData-&gt;last;
	const unsigned int iNewBytes = ( s-&gt;getLastIndex () + 1 ) * 2;
	const unsigned int iUntilEnd = ( iFirstNew + iNewBytes &gt; m_pUserData-&gt;size ) ? m_pUserData-&gt;size - iFirstNew : iNewBytes;
	const unsigned int iFromBegin = iNewBytes - iUntilEnd;
	memcpy ( buf + iFirstNew, s-&gt;getPtr (), iUntilEnd );
	memcpy ( buf, s-&gt;getPtr (), iFromBegin );
	if ( m_pUserData-&gt;bInit &amp;&amp; ( m_pUserData-&gt;first &lt; iFromBegin || ( iFirstNew &lt;= m_pUserData-&gt;first &amp;&amp; iFirstNew + iUntilEnd &gt; m_pUserData-&gt;first ) ) ) {
		std::cerr &lt;&lt; &quot;Buffer Overrun&quot; &lt;&lt; std::endl;
		exit(1); // TODO: Lost sync, try to restore?
	}
	m_pUserData-&gt;last = ( iFirstNew + iNewBytes - 1 ) % m_pUserData-&gt;size;
	if ( ! m_pUserData-&gt;bInit ) {
		m_pUserData-&gt;bInit = true;
	}
	unsigned int sum1=0; for (unsigned int b=0; b &lt; (s-&gt;getLastIndex()+1)*2; b++) { sum1 += static_cast&lt;unsigned int&gt;(static_cast&lt;const BYTE*&gt;(s-&gt;getPtr())[b]); }
	unsigned int sum2=0; for (unsigned int b=0; b &lt; (s-&gt;getLastIndex()+1)*2; b++) { sum2 += static_cast&lt;unsigned int&gt;((iFirstNew+b)%m_pUserData-&gt;size); }
	std::cout &lt;&lt; sum1 &lt;&lt; &quot; - &quot; &lt;&lt; sum2 &lt;&lt; std::endl;
	std::cout &lt;&lt; (sum1 == sum2 ? &quot;[ok]&quot; : &quot;[EE]&quot;) &lt;&lt; std::endl;
}
</code></pre>
<p>Zur Kontrolle der Daten berechne ich zwei einfache Prüfsummen. Dummerweise sind diese <strong>immer</strong> unterschiedlich, was bedeutet, dass die Werte nicht korrekt im Buffer eingetragen werden. Allerdings finde ich partout keinen Fehler. Weiß jemand Rat?</p>
<p>PS. Die Klasse CSequence enthält die Daten, die in den Buffer eingetragen werden sollen. Dabei gibt &quot;getLastIndex ()&quot; den Index des letzten Elements an, das bereitgestellt wird.</p>
<p>Danke im Voraus!</p>
<p><em>EDIT: hat sich inzwischen erledigt :p</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460383</guid><dc:creator><![CDATA[the*V*oid]]></dc:creator><pubDate>Sun, 24 Feb 2008 10:16:11 GMT</pubDate></item></channel></rss>