<?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[Pointer auf Element in deque?]]></title><description><![CDATA[<p>Hi</p>
<p>Ich arbeite gerade an einer kleinen USB-HID-Lib.</p>
<p>Folgende Zeilen bereiten mir allerdings Probleme:</p>
<pre><code class="language-cpp">std::deque&lt; char &gt; *def_vec = getData();

int vecSize = def_vec-&gt;size(); // Größe der zu schreibenden Daten

int repLen = Capabilities.OutputReportByteLength - 1; // Größe eines Datenblocks für die Übertragung

if( ( vecSize % repLen ) != 0 )// Falls nötig...
{
	// ...Größe anpassen
	def_vec-&gt;resize( ( int( vecSize / repLen ) + 1 ) * repLen, 0 );
}

// Das erste Byte wird vom Treiber verarbeitet und nicht gesendet
def_vec-&gt;push_front( 0 );

for( unsigned int i = 0; i &lt; ( def_vec-&gt;size() - 1 ); i += repLen )
{
	// Erstes Byte auf 0 setzen
	(*def_vec)[i] = 0x00;

	// Daten schreiben
	bResult = WriteFile( hDevice,
						 &amp;(*def_vec)[i], // hier ist das Problem
						 Capabilities.OutputReportByteLength,
						 &amp;numBytesReturned,
						 &amp;HidOverlapped
					   );

	bResult = WaitForSingleObject(ReportEvent, 200);
}
</code></pre>
<p>Das Problem ist dass der erste gesendete Block immer Müll ist.</p>
<p>Ich habe jetzt herausgefunden dass das an der Zeile def_vec-&gt;push_front( 0 ); liegt. Wenn ich diese auskommentiere werden die Daten richtig gesendet.</p>
<p>Wenn man sich den internen Aufbau eines std::deque veranschaulicht ist auch klar warum das fehl schlägt.<br />
Durch den Befehl push_front wird ja intern ein zweites Array angelegt welches an einer anderen Stelle im Speicher steht.</p>
<p>Ein iterator wäre natürlich die Lösung des Problems. Die Frage ist wie ich den an WriteFile übergebe?</p>
<p>Vielen Dank für alle Vorschläge</p>
<p>mfg</p>
<p>stein</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/227556/pointer-auf-element-in-deque</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 20:15:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227556.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 17 Nov 2008 08:30:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer auf Element in deque? on Mon, 17 Nov 2008 08:30:53 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Ich arbeite gerade an einer kleinen USB-HID-Lib.</p>
<p>Folgende Zeilen bereiten mir allerdings Probleme:</p>
<pre><code class="language-cpp">std::deque&lt; char &gt; *def_vec = getData();

int vecSize = def_vec-&gt;size(); // Größe der zu schreibenden Daten

int repLen = Capabilities.OutputReportByteLength - 1; // Größe eines Datenblocks für die Übertragung

if( ( vecSize % repLen ) != 0 )// Falls nötig...
{
	// ...Größe anpassen
	def_vec-&gt;resize( ( int( vecSize / repLen ) + 1 ) * repLen, 0 );
}

// Das erste Byte wird vom Treiber verarbeitet und nicht gesendet
def_vec-&gt;push_front( 0 );

for( unsigned int i = 0; i &lt; ( def_vec-&gt;size() - 1 ); i += repLen )
{
	// Erstes Byte auf 0 setzen
	(*def_vec)[i] = 0x00;

	// Daten schreiben
	bResult = WriteFile( hDevice,
						 &amp;(*def_vec)[i], // hier ist das Problem
						 Capabilities.OutputReportByteLength,
						 &amp;numBytesReturned,
						 &amp;HidOverlapped
					   );

	bResult = WaitForSingleObject(ReportEvent, 200);
}
</code></pre>
<p>Das Problem ist dass der erste gesendete Block immer Müll ist.</p>
<p>Ich habe jetzt herausgefunden dass das an der Zeile def_vec-&gt;push_front( 0 ); liegt. Wenn ich diese auskommentiere werden die Daten richtig gesendet.</p>
<p>Wenn man sich den internen Aufbau eines std::deque veranschaulicht ist auch klar warum das fehl schlägt.<br />
Durch den Befehl push_front wird ja intern ein zweites Array angelegt welches an einer anderen Stelle im Speicher steht.</p>
<p>Ein iterator wäre natürlich die Lösung des Problems. Die Frage ist wie ich den an WriteFile übergebe?</p>
<p>Vielen Dank für alle Vorschläge</p>
<p>mfg</p>
<p>stein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1615815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1615815</guid><dc:creator><![CDATA[deckprob]]></dc:creator><pubDate>Mon, 17 Nov 2008 08:30:53 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Element in deque? on Mon, 17 Nov 2008 09:41:31 GMT]]></title><description><![CDATA[<p>Ja, eine <code>std::deque</code> garantiert nicht, dass intern das Array in einem Block vorhanden ist. Meistens wird es realisiert, indem man mehrere Blöcke hat. Und du wirst mit den Iteratoren sowas auch nicht an <code>WriteFile</code> übergeben können. Hier hilft nur ein <code>std::vector</code> Abhilfe.</p>
<pre><code class="language-cpp">// Kopie erstellen.
std::vector&lt;char&gt; dataToWrite(def_vec-&gt;begin(), def_vec-&gt;end());

// ...

// Daten schreiben
bResult = WriteFile(hDevice,
                    &amp;dataToWrite[i],
                    Capabilities.OutputReportByteLength,
                    &amp;numBytesReturned,
                    &amp;HidOverlapped);
</code></pre>
<p>Oder statt der Kopie, arbeitest du gleich mit <code>std::vector</code> , wenn das möglich ist.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1615842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1615842</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 17 Nov 2008 09:41:31 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Element in deque? on Mon, 17 Nov 2008 10:14:45 GMT]]></title><description><![CDATA[<p>Hab ich mir fast gedacht dass das nicht gehen wird.</p>
<p>Hatte ursprünglich mit nem vector angefangen aber weil beim Senden halt immer dieses erste Byte vorgehängt und beim Lesen entsprechend gelöscht werden muss bin ich auf deque umgestiegen.</p>
<p>Trotzdem vielen Dank</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1615857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1615857</guid><dc:creator><![CDATA[deckprob]]></dc:creator><pubDate>Mon, 17 Nov 2008 10:14:45 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Element in deque? on Mon, 17 Nov 2008 20:15:21 GMT]]></title><description><![CDATA[<p>Kannst du beim <code>std::vector</code> nicht <code>push_back()</code> verwenden (halt die Reihenfolge umkehren)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616162</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 17 Nov 2008 20:15:21 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Element in deque? on Mon, 17 Nov 2008 22:13:45 GMT]]></title><description><![CDATA[<p>Das würde nicht funktionieren da die Daten in der richtigen Reihenfolge übertragen werden müssen.</p>
<p>Oder hab ich dich da falsch verstanden?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616194</guid><dc:creator><![CDATA[deckprob]]></dc:creator><pubDate>Mon, 17 Nov 2008 22:13:45 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Element in deque? on Tue, 18 Nov 2008 07:32:55 GMT]]></title><description><![CDATA[<p>deckprob schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">...
// Das erste Byte wird vom Treiber verarbeitet und nicht gesendet
def_vec-&gt;push_front( 0 );
...
</code></pre>
</blockquote>
<p>Das verstehe ich nicht ... kann es sein, dass Du pop_front() meintest ?<br />
Bzw. warum willst Du Deinem Container eine 0 voranstellen?<br />
Willst Du das erste Byte löschen (=aus dem Container entfernen) oder auf den Wert 0 setzen oder ... ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616253</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 18 Nov 2008 07:32:55 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Element in deque? on Tue, 18 Nov 2008 10:27:29 GMT]]></title><description><![CDATA[<p>Ich muss ein Byte am Anfang einfügen und dieses auf 0 setzen.</p>
<p>Um Daten über WriteFile an mein USB-Gerät zu senden muss das erste Byte jedes Blocks(Reports) 0 sein.</p>
<p>In dem Beispielcode aus dem ich meinen Code erarbeitet habe stand dazu, dass das erste Byte vom Treiber verarbeitet wird und 0 sein muss.<br />
Wenn ich das richtig verstanden habe ist dieses Byte die ReportID.</p>
<p>Ab dem zweiten Block setze ich dazu einfch das entsprechende Byte im Puffer auf 0:</p>
<pre><code class="language-cpp">(*def_vec)[i] = 0x00;
</code></pre>
<p>Beim ersten Block würde ich damit ja aber die zu sendenden Daten verändern.</p>
<p>Also muss ich am Anfang ein Byte einfügen, was ich über</p>
<pre><code class="language-cpp">deque::push_front( wert_ist_eigentlich egal )
</code></pre>
<p>machen wollte und jetzt halt über</p>
<pre><code class="language-cpp">vector::insert(vector::begin(), wert_ist_egal )
</code></pre>
<p>mache.</p>
<p>Konnte ich etwas Licht ins Dunkel bringen? <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/1616351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616351</guid><dc:creator><![CDATA[deckprob]]></dc:creator><pubDate>Tue, 18 Nov 2008 10:27:29 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Element in deque? on Tue, 18 Nov 2008 17:45:01 GMT]]></title><description><![CDATA[<p>Man muss natürlich auch abwägen, wie wichtig einem die Performance ist und ob häufig einzelne Elemente am Anfang eingefügt werden. Je nachdem lohnt sich vielleicht eine <code>std::deque</code> oder <code>std::list</code> mehr. Wenn man dann das interne Array braucht, kann man immer noch einen <code>std::vector</code> von diesen konstruieren. Das mag zwar Zeit in Anspruch nehmen, aber man muss daran denken, dass das Verschieben aller Elemente im Container auch nicht gerade eine leichtgewichtige Operation ist. Wenn dann noch die gelegentliche Reallokation des <code>std::vector</code> s vorkommt, ist man damit sicher auf der besseren Seite.</p>
<p>Etwas weiter hergeholt wären auch folgende Möglichkeiten (wahrscheinlich kannst du die nicht brauchen, aber um sie mal genannt zu haben):</p>
<ul>
<li>Reverse-Iterator</li>
<li>Schreiben einer Wrapperklasse, die umgekehrten Zugriff gewährt</li>
<li>Implementierung eines eigenen Containers, der intern wie ein Array aufgebaut ist, aber am Anfang vorallokiert.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1616686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616686</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 18 Nov 2008 17:45:01 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Element in deque? on Tue, 18 Nov 2008 20:41:57 GMT]]></title><description><![CDATA[<p>Etwas mehr Infos:<br />
Bei dem Projekt handelt es sich wie gesagt um eine kleine USB-HID-Bibliothek.</p>
<p>Sie besteht bis jetzt aus 4 Klassen:</p>
<pre><code class="language-cpp">USBBaseClass // abstrakt, definiert lediglich ein paar Funktionen die in USBThread und USBInterface gebraucht werden.

USBInterface // erbt von USBBaseClass und stellt die Schnittstelle für den Programmierer da

USBThread // erbt von USBBaseClass, stellt Thread-Objekt mit Sende/Empfangs-Funktionen bereit.

USBData // Datenklasse die den threadsicheren Austausch von Daten zwischen USBInterface und USBThread sicherstellt.
</code></pre>
<p>Der Programmierer übergibt seinem Objekt von USBInterface die Daten die er an das Gerät schicken möchte mit Hilfe der Funktion</p>
<pre><code class="language-cpp">addWriteData( char * buffer, int length ) // vorläufig, später soll man auch Container übergeben können
</code></pre>
<p>Diese reicht buffer an das interne USBData-Objekt weiter welches buffer in einen Container(vorher deque, jetzt vector) packt welcher wiederum in eine queue gepackt wird:</p>
<pre><code class="language-cpp">std::queue&lt; container&lt; char &gt; &gt; dataToWrite;
</code></pre>
<p>Der Thread guckt jetzt ständig nach ob es neue Daten zum schreiben gibt, falls ja holt er sich diese von dem USBData-Objekt und sendet sie mit der Funktion aus meinem ersten Post an das USB-Gerät.</p>
<p>Ich hoffe soweit ist noch alles klar.</p>
<p>Wie ich schon erwähnt habe muss das erste Byte des Arrays welches an WriteFile übergeben wird 0 sein damit alles funktioniert. Dieses Byte wird nicht an das Gerät gesendet sondern offensichtlich lediglich vom Geräte-Treiber verarbeitet (Report-ID).</p>
<p>Nach den Kriterien von Herrn Josuttis habe ich mich für die Datenspeicherung zunächst für eine deque entschieden (es muss oft am Anfang ein Element gelöscht bzw. eingefügt werden), was aber zu den oben beschriebenen Problemen geführt hat.</p>
<p>Zu den Themen Reverse-Iterator, Wrapperklasse, eigener Container:</p>
<p>Wie ein Reverse-Iterator das Problem lösen könnte ist mir unklar.<br />
Da WriteFile einen blanken Pointer erwartet komme ich an dieser Stelle mit iteratoren nicht weiter und auch an einer anderen Stelle würde sowas keinen Sinn machen.</p>
<p>Wrapperklasse: auch hier ist das Problem das WriteFile eben ein klassisches sequenzielles Array erwartet. Ich wüsste nicht wie man das untergraben könnte.</p>
<p>Eigener Container:<br />
Wäre eine Möglichkeit aber wohl mit Kanonen auf Spatzen geschossen.</p>
<p>Falls ich da etwas falsch verstanden oder nicht bedacht habe würde ich aber sehr gerne mehr zum jeweiligen Thema hören.</p>
<p>Ich denke auch nicht dass sich diese Stelle als Flaschehals herausstellen könnte.<br />
Die STL ist meiner Erfahrung nach so enorm leistungsfähig dass sich erst bei sehr großen Datenmengen eine Verzögerung auch nur messen lassen sollte und bei solchen Datenmengen ist dann der USB-Bus (ja ich weiß, korrekt müsste es US-Bus heißt weil das B schon für Bus steht aber zum besseren Verständnis schreib ichs so :P) der Flaschenhals.</p>
<p>Und ja, ich habe schon darüber nachgedacht einfach beim Speichern der Daten in den Container ein Byte vorzuhängen aber nach meinem Verständnis vom Schichtenmodell sollte die Datenhaltungsschicht keine noch so kleine Aufgabe der Verarbeitungsschicht übernehmen.</p>
<p>Ich denke gerade darüber nach ob man nicht doch eine deque verwenden könnte wenn man den ersten zu sendenen Block umkopiert aber dazu muss ich erstmal ein paar Überlegungen anstellen, Bücher wälzen und mir die Innereien von deque anschauen.</p>
<p>Ich bin auch weiterhin für jeglichen Input dankbar <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>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616803</guid><dc:creator><![CDATA[deckprob]]></dc:creator><pubDate>Tue, 18 Nov 2008 20:41:57 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Element in deque? on Wed, 19 Nov 2008 07:45:11 GMT]]></title><description><![CDATA[<p>deckprob schrieb:</p>
<blockquote>
<p>Ich muss ein Byte am Anfang einfügen und dieses auf 0 setzen....</p>
</blockquote>
<p>Ah! OK - danke. <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="🙂"
    /> <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="👍"
    /></p>
<p>(bitte nicht persönlich nehmen ... hier sind eine Menge Anfänger unterwegs (was ja auch vollkommen in Ordnung ist), die da noch nicht genau wissen, was sie tun).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1616931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1616931</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 19 Nov 2008 07:45:11 GMT</pubDate></item></channel></rss>