<?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[Verständnisproblem beim konvertieren von struct -&amp;gt; QByteArray -&amp;gt; struct]]></title><description><![CDATA[<p>Ich habe die folgende Struktur, wo ich ein dynamisches char-array benutze.</p>
<pre><code class="language-cpp">struct test{
    int value_a;
    unsigned short value_b;
    char *c;
};
</code></pre>
<p>Ich erzeuge eine Instanz von der Struktur, allokiere Speicher für das c-Array und befülle es.</p>
<pre><code class="language-cpp">test *ptr = new test;    //die neue instanz

ptr-&gt;value_a = 5;       //befülle die struktur
ptr-&gt;value_b = 12;

ptr-&gt;c = new char[2 * sizeof(char)];  //allokiere speicher für 2bytes
ptr-&gt;c[0] = 'A';
ptr-&gt;c[1] = 'B';         //ende

char *p = (char*)ptr;  //caste hier ptr auf char* für den Ctor von QByteArray

QByteArray bytearray(p, 4 + 2 + 2 * sizeof(char));  // 4bytes (integer) + 2bytes (unsigned short) + 2bytes (char array mit 'A' und 'B')

test *xy = (test*)bytearray.data();   // nun hole ich mir die Daten aus dem QByteArray zurück
int p = xy-&gt;a;
unsigned short q = xy-&gt;b;

char r[2];
memcpy(&amp;r,xy-&gt;c,2);    // kopiere das array mit 'A' and 'B' in r[2]
</code></pre>
<p>Wenn ich nun versuche auf xy-&gt;c (das array) zuzugreifen, erhalte ich einen ungültigen Pointer.<br />
Dadurch schlägt auch memcpy fehl.</p>
<p><strong>Nun kommt das, was mich total verwirrt.</strong></p>
<pre><code class="language-cpp">ptr-&gt;c = new char[3 * sizeof(char)];
ptr-&gt;c[0] = 'A';
ptr-&gt;c[1] = 'B';  
ptr-&gt;c[2] = 'C';
</code></pre>
<p><strong>Erhöhe ich die Array-Größe auf 3-Elemente, funktioniert das ganze.</strong><br />
Natürlich ändere ich dabei alle anderen Stellen wie<br />
&quot;2 * sizeof(char)&quot; zu &quot;3 * sizeof(char)&quot; usw...</p>
<p><strong>Was ist hier los? warum gehts mit 3 und nicht mit 2?</strong></p>
<p><a href="http://doc.trolltech.com/4.4/qbytearray.html" rel="nofollow">http://doc.trolltech.com/4.4/qbytearray.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/230567/verständnisproblem-beim-konvertieren-von-struct-gt-qbytearray-gt-struct</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 09:06:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/230567.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Dec 2008 02:25:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisproblem beim konvertieren von struct -&amp;gt; QByteArray -&amp;gt; struct on Mon, 29 Dec 2008 02:25:57 GMT]]></title><description><![CDATA[<p>Ich habe die folgende Struktur, wo ich ein dynamisches char-array benutze.</p>
<pre><code class="language-cpp">struct test{
    int value_a;
    unsigned short value_b;
    char *c;
};
</code></pre>
<p>Ich erzeuge eine Instanz von der Struktur, allokiere Speicher für das c-Array und befülle es.</p>
<pre><code class="language-cpp">test *ptr = new test;    //die neue instanz

ptr-&gt;value_a = 5;       //befülle die struktur
ptr-&gt;value_b = 12;

ptr-&gt;c = new char[2 * sizeof(char)];  //allokiere speicher für 2bytes
ptr-&gt;c[0] = 'A';
ptr-&gt;c[1] = 'B';         //ende

char *p = (char*)ptr;  //caste hier ptr auf char* für den Ctor von QByteArray

QByteArray bytearray(p, 4 + 2 + 2 * sizeof(char));  // 4bytes (integer) + 2bytes (unsigned short) + 2bytes (char array mit 'A' und 'B')

test *xy = (test*)bytearray.data();   // nun hole ich mir die Daten aus dem QByteArray zurück
int p = xy-&gt;a;
unsigned short q = xy-&gt;b;

char r[2];
memcpy(&amp;r,xy-&gt;c,2);    // kopiere das array mit 'A' and 'B' in r[2]
</code></pre>
<p>Wenn ich nun versuche auf xy-&gt;c (das array) zuzugreifen, erhalte ich einen ungültigen Pointer.<br />
Dadurch schlägt auch memcpy fehl.</p>
<p><strong>Nun kommt das, was mich total verwirrt.</strong></p>
<pre><code class="language-cpp">ptr-&gt;c = new char[3 * sizeof(char)];
ptr-&gt;c[0] = 'A';
ptr-&gt;c[1] = 'B';  
ptr-&gt;c[2] = 'C';
</code></pre>
<p><strong>Erhöhe ich die Array-Größe auf 3-Elemente, funktioniert das ganze.</strong><br />
Natürlich ändere ich dabei alle anderen Stellen wie<br />
&quot;2 * sizeof(char)&quot; zu &quot;3 * sizeof(char)&quot; usw...</p>
<p><strong>Was ist hier los? warum gehts mit 3 und nicht mit 2?</strong></p>
<p><a href="http://doc.trolltech.com/4.4/qbytearray.html" rel="nofollow">http://doc.trolltech.com/4.4/qbytearray.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1636708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1636708</guid><dc:creator><![CDATA[donglebob]]></dc:creator><pubDate>Mon, 29 Dec 2008 02:25:57 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem beim konvertieren von struct -&amp;gt; QByteArray -&amp;gt; struct on Mon, 29 Dec 2008 03:30:37 GMT]]></title><description><![CDATA[<p>Ich glaub ich habs...</p>
<p>QByteArray hat keine tiefe kopie gemacht!<br />
Es hat jedesmal meinen pointer kopiert.</p>
<p>Weiss jemand was ich ändern muss um nicht den pointer zu kopiere sondern wirklich den Inhalt des arrays in meiner struktur.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1636713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1636713</guid><dc:creator><![CDATA[donglebob]]></dc:creator><pubDate>Mon, 29 Dec 2008 03:30:37 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem beim konvertieren von struct -&amp;gt; QByteArray -&amp;gt; struct on Mon, 29 Dec 2008 06:52:55 GMT]]></title><description><![CDATA[<p>Mal ganz ehrlich: Was du da tust kann man bestenfalls als grauenvoll bezeichnen.</p>
<ol>
<li>Du castest wild hin und her. Mal abgesehen davon dass es sich dabei um C-Casts handelt und das was du da tust eigentlich ein reinterpret_cast ist, verlierst du damit mutwillig jede Typsicherheit.</li>
<li>Du erzählst dem QByteArray, dass es auf einen 8 Byte großen Bereich zeigt. tatsächlich sinds aber 10 oder 12 Byte, je nach Alignment. Dein Fehler dabei ist, dass du 2 Byte für das dynamisch allokierte char-Array angibst statt der 4 byte für den char-Pointer.</li>
<li>Du hast es fertig gebracht, überall feste Zahlen einzucodieren, nur beim char benutzt du sizeof(). Glückwunsch, char ist der <strong>einzige</strong> Datentyp für den die Größe im Standard festgelegt ist. das sizeof(char) ist also überflüssig (nämlich per Definition immer 1), die Annahme, dass ints immer 4 Byte groß sind un short immer 2 Byte, ist aber eben nur eine Annahme.</li>
<li>Du sagst was von nicht tief kopiert - da wird auch nichts tief Kopiert. QByteArray ist dazu da, um char's zu kopieren/verwalten, nicht irgendwelche structs. Dein QByteArray interpretiert also die ersten 8 Byte deines struct um, und interpretiert diese als char's.</li>
</ol>
<p>Schau dir am besten nochmal ein paar C++-Grundlagen an und verstehe was da passiert, bevor du dich mit Qt, C-Casts und anderen Dingen verlustierst. Zu wissen, was du mit deinen Anweisungen aussagst ist wichtiger, als sie einfach hinzuschreiben und zu gucken was passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1636723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1636723</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 29 Dec 2008 06:52:55 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem beim konvertieren von struct -&amp;gt; QByteArray -&amp;gt; struct on Mon, 29 Dec 2008 08:32:34 GMT]]></title><description><![CDATA[<p>bei new reicht folgendes</p>
<pre><code class="language-cpp">typ * var = new typ[n];  // statt n-mal sizeof(typ)
</code></pre>
<p>würdest du das so mit z.b. int machen, oder einer eigenen geschriebenen klasse hättest du auf einmal statt deinen 5 gewollten elementen speicher für 20 oder mehr geholt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1636731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1636731</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 29 Dec 2008 08:32:34 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem beim konvertieren von struct -&amp;gt; QByteArray -&amp;gt; struct on Mon, 29 Dec 2008 13:41:59 GMT]]></title><description><![CDATA[<p>Erstmals danke für die reichlichen Antworten.</p>
<ol>
<li></li>
</ol>
<p>Die oberen Codeschnipsel gehören nicht zu meinem eigentlichen Code.<br />
Das sollte nur zur Demonstration dienen. Aus diesem Grund, dieser etwas schmutzige Code und die C-casts.</p>
<ol start="2">
<li></li>
</ol>
<p>Bit-alignment ist kein Problem, da ich hierbei &quot;pragma pack(1)&quot; verwende<br />
um keine Stopf-Bits zu bekommen.<br />
Den Fehler mit den 2Bytes für den Pointer habe ich zuvor bemerkt, siehe vorheriges Post von mir.<br />
Das Problem dabei war, ich bin davon ausgegangen, dass QByteArray den Inhalt und nicht den Pointer kopier. (Inhalt = 2Bytes, Pointer 4 Bytes)</p>
<ol start="3">
<li></li>
</ol>
<p>Siehe 1. Das ist nur ein fast&amp;dirty Code zur Demonstration des Problems.</p>
<ol start="4">
<li></li>
</ol>
<p>Ja das stimmt wohl. Habe ehrlich gesagt nicht daran gedacht oder besser gesagt nicht gewusst, dass QByteArray einfach nur die struktur &quot;um-interpretiert&quot; wird.</p>
<p>Ich sollte eventuell mal sagen was dahinter steckt:<br />
Diese Struktur enthält Daten, die vom Benutzer der Anwendung kommen und über die serielle Leitung geschickt werden sollen.<br />
Da die Eingabe vom Benutzer unterschiedlich lang sein kann, muss ein char-array her, welches diese unterschiedlich langen Daten unterbringen kann.</p>
<p>Wie wird denn sowas generell gemacht? Man kann doch keine fest-definierten Arrays nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1636839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1636839</guid><dc:creator><![CDATA[donglebob]]></dc:creator><pubDate>Mon, 29 Dec 2008 13:41:59 GMT</pubDate></item></channel></rss>