<?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[Zwei Strukturen auf gleichem Speicherplatz]]></title><description><![CDATA[<p>Hallo<br />
Ich möchte auf die erste Struktur schreiben<br />
und dann von der zweiten Struktur lesen.<br />
Idealerweise liegen die Strukturen übereinander (gleicher Aufbau)<br />
Hat jemand eine Lösung?<br />
Gruß, Harald</p>
<pre><code class="language-cpp">// CAN_Message PEAK
typedef struct {
    DWORD ID;        // 11/29 Bit-Kennung
    BYTE  MSGTYPE;   // Bits aus MSGTYPEx*
    BYTE  LEN;       // Anzahl der gueltigen Datenbytes
    BYTE  DATA[8];   // Datenbytes 0..7
} TPCANMsg;

// CAN Message Ixxat
typedef struct
{
    DWORD  MsgId;      // 11/29 Bit-Kennung
    BYTE MsgType;      // Nachrichten Typ
    BYTE Length;       // Anzahl der Datenbytes 0-8
    BYTE Data[8];      // Datenbytes 0...7verwendet)
} CANMESSAGE;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/220875/zwei-strukturen-auf-gleichem-speicherplatz</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 12:12:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/220875.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 Aug 2008 09:35:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zwei Strukturen auf gleichem Speicherplatz on Fri, 22 Aug 2008 09:35:14 GMT]]></title><description><![CDATA[<p>Hallo<br />
Ich möchte auf die erste Struktur schreiben<br />
und dann von der zweiten Struktur lesen.<br />
Idealerweise liegen die Strukturen übereinander (gleicher Aufbau)<br />
Hat jemand eine Lösung?<br />
Gruß, Harald</p>
<pre><code class="language-cpp">// CAN_Message PEAK
typedef struct {
    DWORD ID;        // 11/29 Bit-Kennung
    BYTE  MSGTYPE;   // Bits aus MSGTYPEx*
    BYTE  LEN;       // Anzahl der gueltigen Datenbytes
    BYTE  DATA[8];   // Datenbytes 0..7
} TPCANMsg;

// CAN Message Ixxat
typedef struct
{
    DWORD  MsgId;      // 11/29 Bit-Kennung
    BYTE MsgType;      // Nachrichten Typ
    BYTE Length;       // Anzahl der Datenbytes 0-8
    BYTE Data[8];      // Datenbytes 0...7verwendet)
} CANMESSAGE;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1569476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1569476</guid><dc:creator><![CDATA[Andresen]]></dc:creator><pubDate>Fri, 22 Aug 2008 09:35:14 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei Strukturen auf gleichem Speicherplatz on Fri, 22 Aug 2008 09:47:55 GMT]]></title><description><![CDATA[<p>Im ersten Moment würde mit ein union in den Sinn kommen.</p>
<p>In etwa:</p>
<pre><code class="language-cpp">union CAN_Message
{
    TPCANMsg   PEAK;
    CANMESSAGE Ixxat;
};
</code></pre>
<p>Habe aber selber noch keine unions benötigt um das zu validieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1569485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1569485</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 22 Aug 2008 09:47:55 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei Strukturen auf gleichem Speicherplatz on Fri, 22 Aug 2008 10:09:50 GMT]]></title><description><![CDATA[<ol>
<li>Du machst einen harten Cast:</li>
</ol>
<pre><code class="language-cpp">TPCANMsg struct1 = /* ... */;
CANMESSAGE *pstruct2 = (CANMESSAGE*)&amp;struct1;
pstruct2-&gt;MsgId ...
</code></pre>
<p>EDIT: Ich seh jetzt erst, dass es um C++ statt um C geht. In dem Fall ist aus Stilgründen ein reinterpret_cast auf einen Referenztypen angesagt:</p>
<pre><code class="language-cpp">CANMESSAGE &amp;struct2 = reinterpret_cast&lt;CANMESSAGE&amp;&gt;(struct1);
struct2.MsgId ...
</code></pre>
<ol start="2">
<li>Du packst beide in eine union:</li>
</ol>
<pre><code class="language-cpp">union bla {
  TPCANMsg struct1;
  CANMESSAGE struct2;
} blub;

blub.struct1.ID = 42;
blub.struct2.MsgId /* =&gt; 42 */
</code></pre>
<p>beides natürlich nicht vom Standard definiert, es sollte aber funktionieren, zumal die Strukturen identisches Layout haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1569488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1569488</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 22 Aug 2008 10:09:50 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei Strukturen auf gleichem Speicherplatz on Fri, 22 Aug 2008 09:50:29 GMT]]></title><description><![CDATA[<p>Gibt mehrere Möglichkeiten:<br />
- du einigst dich darauf, nur eine von beiden zu nutzen, da der Aufbau ja identisch ist. Dagegen spricht eigentlich nur, wenn beide Definitionen nicht von dir stammen sondern aus irgendwelchen Bibliotheken (die beiden typedefs die du da hast sehen nach C-APIs aus). In dem Fall würde ich Adapter für eine oder beide Bibliotheken schreiben, die Umsetzung sollte ja nicht so schwer sein;</p>
<p>- du schreibst Umwandlungsfunktionen von der einen in die andere Struktur und hoffst dass der Compiler das weitgehend wegoptimiert.</p>
<p>- du benutzt union, das ist allerdings nur bei POD structs ratsam, wenn überhaupt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1569490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1569490</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 22 Aug 2008 09:50:29 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei Strukturen auf gleichem Speicherplatz on Fri, 22 Aug 2008 11:22:29 GMT]]></title><description><![CDATA[<p>Wenn eine der beiden Strukturen aus einer fremden Library stammt, so kann es sein, dass diese ein anderes Packaging hat, als Du erwartest. Der Effekt wäre, dass ein reinterpret_cast bzw. eine union eben nicht zu dem von Dir gewünschten Verhalten führen.<br />
Wen Du es trotzdem machst - so füge in Deinem Code mindesten ein <a href="http://www.boost.org/doc/libs/1_36_0/doc/html/boost_staticassert.html" rel="nofollow">BOOST_STATIC_ASSERT</a>( sizeof(TPCANMsg) == sizeof(CANMESSAGE) ); ein.</p>
<p>Der Vorschlag von Pumuckl ist in jedem Fall die sichere Variante.</p>
<p>Andererseits schließe ich aus</p>
<p>Andresen schrieb:</p>
<blockquote>
<p>Ich möchte auf die erste Struktur schreiben<br />
und dann von der zweiten Struktur lesen.</p>
</blockquote>
<p>dass kein anderes Programm oder andere Library in diese Typen schreibt oder aus ihnen liest.<br />
Wie kommt es dann zu den beiden unterschiedlichen Typen?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1569546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1569546</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 22 Aug 2008 11:22:29 GMT</pubDate></item><item><title><![CDATA[Reply to Zwei Strukturen auf gleichem Speicherplatz on Mon, 25 Aug 2008 13:14:57 GMT]]></title><description><![CDATA[<p>Hallo<br />
Zuerst einmal vielen Dank für eure schnellen Antworten.<br />
Das Problem ist, das mein neues Programm sich aus zwei verschiedenen Programmen zusammensetzt. Nur ein Programm habe ich selbst geschrieben.<br />
In den Programmen werden die Strukturen mehrfach verwendet (Bibliotheken ??).<br />
Um die Änderungen minimal zu halten, habe ich mich jetzt entschlossen, vor Verwendung der Struktur ein Umkopieren vorzunehmen.<br />
Es läuft jetzt problemlos.</p>
<pre><code class="language-cpp">void p_Ixxat_to_Peak(void)
{
    myMsg.ID = MsgIxxat.MsgId;
    myMsg.MSGTYPE = MsgIxxat.MsgType;
    myMsg.LEN = MsgIxxat.Length;
    for(int i=7; i&gt;=0; i--)
        myMsg.DATA[i] = MsgIxxat.Data[i];
}
---------------------------------------------------------------------------
void p_Peak_to_Ixxat(void)
{
    MsgIxxat.MsgId = myMsg.ID;
    MsgIxxat.MsgType = myMsg.MSGTYPE;
    MsgIxxat.Length = myMsg.LEN;
    for(int i=7; i&gt;=0; i--)
        MsgIxxat.Data[i] = myMsg.DATA[i];
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1571070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1571070</guid><dc:creator><![CDATA[Andresen]]></dc:creator><pubDate>Mon, 25 Aug 2008 13:14:57 GMT</pubDate></item></channel></rss>