<?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[Cast von struct in int* sicher??]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgenden Code und möchte gerne wissen, ob der Cast wirklich 100% sicher ist, insbesondere auf verschiedenen Machinen (Windows / Linux):</p>
<pre><code class="language-cpp">typedef signed long  int32;

// Indices des Dreiecks
typedef struct _Triangle
{
    int32 i;
    int32 j;
    int32 k;
}Triangle;

// ...
int32 Class::Method(const Triangle *const triangle)
{
    const int32* indices = (const int32*)triangle;  // to be able to iterate
    for(int i = 0; i &lt; 3; i++)
    {
        // ...
    }
}
</code></pre>
<p>Ich dachte, da Triangle nur Daten enthält, müsste das im Speicher eigentlich genauso angeordnet sein, wie ein int32*. Ist das korrekt?!?! Auf meinem WinXP-Rechner klappt das, es muss aber <strong>GARANTIERT</strong> auch auf in jeder anderen Umgebung funktionieren.</p>
<p>Wenn mir jemand sagt, dass das gefährlich ist, mache ich es anders...</p>
<p>Danke,<br />
Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/146722/cast-von-struct-in-int-sicher</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 18:27:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/146722.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 May 2006 11:40:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Cast von struct in int* sicher?? on Wed, 10 May 2006 11:40:51 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgenden Code und möchte gerne wissen, ob der Cast wirklich 100% sicher ist, insbesondere auf verschiedenen Machinen (Windows / Linux):</p>
<pre><code class="language-cpp">typedef signed long  int32;

// Indices des Dreiecks
typedef struct _Triangle
{
    int32 i;
    int32 j;
    int32 k;
}Triangle;

// ...
int32 Class::Method(const Triangle *const triangle)
{
    const int32* indices = (const int32*)triangle;  // to be able to iterate
    for(int i = 0; i &lt; 3; i++)
    {
        // ...
    }
}
</code></pre>
<p>Ich dachte, da Triangle nur Daten enthält, müsste das im Speicher eigentlich genauso angeordnet sein, wie ein int32*. Ist das korrekt?!?! Auf meinem WinXP-Rechner klappt das, es muss aber <strong>GARANTIERT</strong> auch auf in jeder anderen Umgebung funktionieren.</p>
<p>Wenn mir jemand sagt, dass das gefährlich ist, mache ich es anders...</p>
<p>Danke,<br />
Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1054765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1054765</guid><dc:creator><![CDATA[FelixManke]]></dc:creator><pubDate>Wed, 10 May 2006 11:40:51 GMT</pubDate></item><item><title><![CDATA[Reply to Cast von struct in int* sicher?? on Wed, 10 May 2006 11:49:13 GMT]]></title><description><![CDATA[<p>Ob das klappt, bin ich mir nicht sicher - durchaus möglich, daß dir das Padding auf bestimmten Rechnern dein Design durcheinanderbringt.</p>
<p>Du könntest deiner struct aber eine Zugriffsfunktion spendieren, die einen Index-Zugriff in eine der drei Membervariablen übersetzt:</p>
<pre><code class="language-cpp">struct Triangle
{
  int i,j,k;
  int&amp; operator[](int v)
  {
    return (v==0)?i: (v==1)?j:k;
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1054770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1054770</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 10 May 2006 11:49:13 GMT</pubDate></item><item><title><![CDATA[Reply to Cast von struct in int* sicher?? on Wed, 10 May 2006 11:56:51 GMT]]></title><description><![CDATA[<blockquote>
<p>int32 Class::Method(const Triangle *const triangle)</p>
</blockquote>
<p>Ich geh mal davon aus dass du C++ verwendest ...</p>
<p>Warum der cast ?</p>
<p>Was erreichst du durch den cast ?<br />
Das du dein triangle wie ein Array (zeiger auf x hintereinanderliegende elemente) verwenden kannst ....</p>
<p>Wie erreichst du das besser ?</p>
<p>Ideale variante: du nimmst gleich wirklich nen Array !</p>
<pre><code class="language-cpp">class Triangle
{
public:
    // Konstruktoren destruktoren die man so braucht 

    // Zugriff auf die rohen daten, falls man mal irgend ne C-Schnittstelle 
befuellen muss
    const int32 * c_data() const {return adata;}
    // Index opeerator ueberladen, damit die klasse selber wie nen Array behandeln kannst 
    const int32 &amp; operator[](size_t index) const {return adata[index];}
    int32 &amp; operator[](size_t index){return adata[index];}
private:
    int32 adata[3]; 
};
</code></pre>
<p>Falls du irgendwo doch dein i j k brauchst, mir fallen aaber ehrlich keine gruende ein, dann mach dein struct einfach so zur klasse und verwende nur die index operatoren ....</p>
<p>Also bleibt nur die frage, warum brauchst du eigentlich die struct ???</p>
<p>Ciao ..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1054774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1054774</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 10 May 2006 11:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to Cast von struct in int* sicher?? on Wed, 10 May 2006 11:56:46 GMT]]></title><description><![CDATA[<p>Du darfst die Adresse eines structs in die Adresse des Typs des ersten Members casten. Das Dereferenzieren dieser Adresse ist dann zulässig. Zugriff auf die dahinterliegenden Felder garantiert das aber nicht. Z.B. auf einer 64Bit Maschine sieht das schon viel anders aus. Oder mit einem per #pragma erzwungenem Padding. Es ist auf jeden Fall nicht standardkonform und du hast keine Garantie, dass es überall funktioniert.</p>
<p>Eine Alternative wäre das hier:</p>
<pre><code class="language-cpp">struct X
{
   int x[3];
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1054778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1054778</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Wed, 10 May 2006 11:56:46 GMT</pubDate></item><item><title><![CDATA[Reply to Cast von struct in int* sicher?? on Wed, 10 May 2006 11:57:48 GMT]]></title><description><![CDATA[<p>Ok, danke für die Antwort. Also: Ich habe die Datenstrukturen festgelegt durch eine Bibliothek. An dem Struct Triangle kann ich nichts ändern. Und insg. sollte der Code möglichst schnell sein. Ich hätte auch gerne ein Array, kann aber nix daran ändern, dass ich drei Variablen i, j, k habe :-(.</p>
<p>Die einzige Möglichkeit, die ich noch sah, ist dreimal derselbe Code für i, j und k. Das fand ich aber auch nicht sehr gelungen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1054779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1054779</guid><dc:creator><![CDATA[FelixManke]]></dc:creator><pubDate>Wed, 10 May 2006 11:57:48 GMT</pubDate></item><item><title><![CDATA[Reply to Cast von struct in int* sicher?? on Wed, 10 May 2006 12:10:08 GMT]]></title><description><![CDATA[<p>Ok, also, da das ja anscheinend nicht so wirklich super ist, habe ich jetzt die drei Werte i,j,k einzeln getestet, ohne die Schleife. Ist auch nicht soo viel Code, insofern vertretbar, denke ich. Und wahrscheinlich sogar schneller ohne die ganzen Sprünge und die Zählvariable.</p>
<p>Trotzdem 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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1054791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1054791</guid><dc:creator><![CDATA[FelixManke]]></dc:creator><pubDate>Wed, 10 May 2006 12:10:08 GMT</pubDate></item><item><title><![CDATA[Reply to Cast von struct in int* sicher?? on Wed, 10 May 2006 12:11:08 GMT]]></title><description><![CDATA[<p>Das sicherste was machen kannst iss in dem falle die Struct zu wrappen ...<br />
Wenn es schnell sein soll, willst ja kopien vermeiden ....</p>
<pre><code class="language-cpp">class TriangleWrapper
{
public:
    TriangleWrapper(Triangle &amp; rx):rdata(rx){}
    ~TriangleWrapper(){}
    // Code von CStoll adaptiert ! :-) 
    int32&amp; operator[](int v){return (v==0)?rdata.i: (v==1)?rdata.j:rdata.k;}
    // und um const variante ergaenzt 
    const int32&amp; operator[] const (int v){return (v==0)?rdata.i: (v==1)?rdata.j:rdata.k;}
private:
    Triangle &amp; rdata;
};
</code></pre>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1054792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1054792</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Wed, 10 May 2006 12:11:08 GMT</pubDate></item></channel></rss>