<?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[Struct Werte indizieren]]></title><description><![CDATA[<p>Hi Fans,</p>
<p>ich habe z.B. folgendes Struct und eine Klasse definiert:</p>
<pre><code class="language-cpp">*.h:

struct SWerte
{
       float fWert1;
       float fWert2;
       float fWert3;
};

class TestC
{
      private:

      SWerte Werte;

      public:

      TestC();
      ~TestC();

      float GetStructValue(int iIndex);
};

*.cpp

TestC::TestC()
{
     Werte.fWert1 = 0.1;
     Werte.fWert2 = 0.2;
     Werte.fWert3 = 0.3;
}

TestC::~TestC()
{
}

float TestC::GetStructValue(int iIndex)
{
      float fRetVal = 0.0;

      switch (iIndex)
      {
             case 0  : { fRetVal = Werte.fWert1; break; }
             case 1  : { fRetVal = Werte.fWert2; break; }
             case 2  : { fRetVal = Werte.fWert3; break; }
             default : {}
      }

      return fRetVal;
}
</code></pre>
<p>Nun ist es ja so, dass wenn oben im Struct noch eine Variable dazu kommt, muß man unten in der Switch-Anweisung eine case-Zeile einfügen.</p>
<p>Wie könnte man sowas automatisieren? Sprich, so, dass man sauber über den Index an das jeweilige Struct Element rankommt (quasi als foreach-Ersatz), trotzdem aber innerhalb der Klasse das Struct weiter verwendet (wegen der übersichtlicheren Namensgebung der einzelnen Structelemente).</p>
<p>Es soll also ein cleverer Bezug zwischen Index des Structelementes von außen und Namen von innen (Klasse) bestehen.</p>
<p>MfG F98.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/191696/struct-werte-indizieren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 04:35:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191696.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Sep 2007 15:31:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Struct Werte indizieren on Wed, 05 Sep 2007 15:31:41 GMT]]></title><description><![CDATA[<p>Hi Fans,</p>
<p>ich habe z.B. folgendes Struct und eine Klasse definiert:</p>
<pre><code class="language-cpp">*.h:

struct SWerte
{
       float fWert1;
       float fWert2;
       float fWert3;
};

class TestC
{
      private:

      SWerte Werte;

      public:

      TestC();
      ~TestC();

      float GetStructValue(int iIndex);
};

*.cpp

TestC::TestC()
{
     Werte.fWert1 = 0.1;
     Werte.fWert2 = 0.2;
     Werte.fWert3 = 0.3;
}

TestC::~TestC()
{
}

float TestC::GetStructValue(int iIndex)
{
      float fRetVal = 0.0;

      switch (iIndex)
      {
             case 0  : { fRetVal = Werte.fWert1; break; }
             case 1  : { fRetVal = Werte.fWert2; break; }
             case 2  : { fRetVal = Werte.fWert3; break; }
             default : {}
      }

      return fRetVal;
}
</code></pre>
<p>Nun ist es ja so, dass wenn oben im Struct noch eine Variable dazu kommt, muß man unten in der Switch-Anweisung eine case-Zeile einfügen.</p>
<p>Wie könnte man sowas automatisieren? Sprich, so, dass man sauber über den Index an das jeweilige Struct Element rankommt (quasi als foreach-Ersatz), trotzdem aber innerhalb der Klasse das Struct weiter verwendet (wegen der übersichtlicheren Namensgebung der einzelnen Structelemente).</p>
<p>Es soll also ein cleverer Bezug zwischen Index des Structelementes von außen und Namen von innen (Klasse) bestehen.</p>
<p>MfG F98.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1359551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359551</guid><dc:creator><![CDATA[F98]]></dc:creator><pubDate>Wed, 05 Sep 2007 15:31:41 GMT</pubDate></item><item><title><![CDATA[Reply to Struct Werte indizieren on Wed, 05 Sep 2007 15:36:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Wieso nimmst du in deiner struct nicht einfach ein Array (vector)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1359555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359555</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 05 Sep 2007 15:36:20 GMT</pubDate></item><item><title><![CDATA[Reply to Struct Werte indizieren on Wed, 05 Sep 2007 15:38:00 GMT]]></title><description><![CDATA[<p>Wie wärs mit einem Array?</p>
<pre><code class="language-cpp">struct SWerte 
{ 
       float fWert[3]; 
};

//...

float TestC::GetStructValue(int iIndex)
{
    return fWert[iIndex];
}
</code></pre>
<p>Achja, Array-Indizes gehen von 0 bis Anzahl-1. Die Werte in diesem Beispiel heißen also fWert[0], fWert[1] und fWert[2].</p>
<p>Gruß<br />
Don06</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1359557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359557</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Wed, 05 Sep 2007 15:38:00 GMT</pubDate></item><item><title><![CDATA[Reply to Struct Werte indizieren on Wed, 05 Sep 2007 16:00:34 GMT]]></title><description><![CDATA[<p>Ich hatte gerade auch das Problem, dass ich ein struct benötige<br />
für die interne Berechnung in der Klasse, weil da Indizes doof sind. Aber<br />
nach außen sollen die struct member über einen Index angesprochen werden.</p>
<p>Was hälst du von folgender Lösung:</p>
<pre><code class="language-cpp">float GetValueFromFloatStruct(int iID, float *FirstElement)
{
    for (int i=0; i&lt;iID; i++)   FirstElement++;
    return *FirstElement;
}
</code></pre>
<p>Parameter ist die ID des entrechendne Items und der Zeiger auf das erste Structelement. Vorraussetzung ist natürlich, dass es sich bei den struct membern nur um float Datentypen handelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1359574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359574</guid><dc:creator><![CDATA[MrLeeh]]></dc:creator><pubDate>Wed, 05 Sep 2007 16:00:34 GMT</pubDate></item><item><title><![CDATA[Reply to Struct Werte indizieren on Wed, 05 Sep 2007 16:08:45 GMT]]></title><description><![CDATA[<p>und was ist jetzt hier der Unterschied zu einem Array, außer das du Pointerarithmetik verwendest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1359582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359582</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 05 Sep 2007 16:08:45 GMT</pubDate></item><item><title><![CDATA[Reply to Struct Werte indizieren on Wed, 05 Sep 2007 17:49:52 GMT]]></title><description><![CDATA[<p>Geht nicht sowas hier?</p>
<pre><code class="language-cpp">union SWerte
{
    struct
    {
        float fWert1;
        float fWert2;
        float fWert3;
    };

    float afWerte[3];
};
</code></pre>
<p>Ja, anonyme structs/unions sind nicht standardkonform ...<br />
Aber sonst sollte das zumindest für gewisse Compiler funktionieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1359649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359649</guid><dc:creator><![CDATA[TomasRiker]]></dc:creator><pubDate>Wed, 05 Sep 2007 17:49:52 GMT</pubDate></item><item><title><![CDATA[Reply to Struct Werte indizieren on Thu, 06 Sep 2007 06:46:20 GMT]]></title><description><![CDATA[<p>Also die union-Variante find ich ziemlich gut. Ist sauberer als das Herumhantieren mit Pointern.</p>
<p>An Braunstein: Ich brauche das struct, weil ich intern gern mit Variablen arbeiten möchte und nach außen die einzelnen Elemente automatiert über einen Index auslesen möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1359896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359896</guid><dc:creator><![CDATA[MrLeeh]]></dc:creator><pubDate>Thu, 06 Sep 2007 06:46:20 GMT</pubDate></item><item><title><![CDATA[Reply to Struct Werte indizieren on Thu, 06 Sep 2007 07:58:37 GMT]]></title><description><![CDATA[<p>Der BC++B frißt sowas (anonyme Structs), steht auch in der Hilfe.</p>
<p>Besser ist allerdings:</p>
<pre><code class="language-cpp">*.h:

#define MAXCOUNT 3

union UWerte
{
    struct SWerte
    {
        // hier dürfen MAXCOUNT float Variablen rein
        float fWert1;
        float fWert2;
        float fWert3;
    } stWerte;

    float afWerte[MAXCOUNT];

    UWerte()
    {
        for (int i=0; i&lt;MAXCOUNT; i++)
        {
            afWerte[i] = 0.0;
        }
    };

    ~UWerte()
    {
    };
};

class TestC
{
      private:

      UWerte Werte;

      public:

      TestC();
      ~TestC();

      float GetStructValue(int iIndex);
};

*.cpp

TestC::TestC()
{
     Werte.stWerte.fWert1 = 0.1;
     Werte.stWerte.fWert2 = 0.2;
     Werte.stWerte.fWert3 = 0.3;
}

TestC::~TestC()
{
}

float TestC::GetStructValue(int iIndex)
{
      float fRetVal = 0.0;

      if ((iIndex &gt;= 0) &amp;&amp; (iIndex &lt;MAXCOUNT))
      {
         fRetVal = Werte.afWerte[iIndex];
      }

      return fRetVal;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1359902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1359902</guid><dc:creator><![CDATA[F98]]></dc:creator><pubDate>Thu, 06 Sep 2007 07:58:37 GMT</pubDate></item><item><title><![CDATA[Reply to Struct Werte indizieren on Thu, 06 Sep 2007 11:06:30 GMT]]></title><description><![CDATA[<p>wusste garnicht dass es fuer unions Konstruktoren und Destruktoren gibt oO man lernt doch immer wieder neues.</p>
<blockquote>
<p>An Braunstein: Ich brauche das struct, weil ich intern gern mit Variablen arbeiten möchte und nach außen die einzelnen Elemente automatiert über einen Index auslesen möchte.</p>
</blockquote>
<p>Wo ist bei dir intern und nach aussen? Wenn du das Ding privtae machst, kannst du eh nur innerhalb der umgebenden Klasse damit arbeiten, und was anderes machst du auch nicht. Das einzige was ich bisher sehe, ist dass du das &quot;Ding&quot; in der einen Methode wie ein Array behandelst, in der anderen aber wie ein struct. Das macht in meinen Augen nur den Code unleserlich und schwer wartbar.<br />
Insofern: wenn du eh die meiste Zeit iterierst, dann bleib beim Array.<br />
Falls du allerdings nette Namen fuer die Werte brauchst und iterieren musst, dann fallen mir spontan 2 Wege ein:</p>
<p>Variante a:</p>
<pre><code class="language-cpp">struct SWerte {
enum { PAPISGELD;
       MAMISGELD;
       OMISGELD;
       MAX;
     } 
float w[MAX-1];
} werte;

//iteration
for (int i = 0; i &lt; SWerte::MAX; i++)
  cout &lt;&lt; werte.w[i];

//Zugriff mit Namen
cout &lt;&lt; &quot;Papi hat &quot; &lt;&lt; werte.w[SWerte::PAPISGELD];
</code></pre>
<p>Variante b (fuer ganz ganz seltene iterationen, naemlich unschoen!)</p>
<pre><code class="language-cpp">struct SWerte {
  float papisgeld;
  float mamisgeld;
  float omisgeld;
  enum{MAX = 4};
} werte;

//iteration
for(float* w = reinterpret_cast&lt;float*&gt;(&amp;werte), int i=0; i &lt; SWerte::MAX; i++)
  cout &lt;&lt; w[i];
//Zugriff mit namen
cout &lt;&lt; &quot;papi hat  &quot; &lt;&lt; werte.papisgeld;
</code></pre>
<p>Und jetz haut mich fuer den fiesen cast, ich weiss dass er unschoen ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360129</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 06 Sep 2007 11:06:30 GMT</pubDate></item><item><title><![CDATA[Reply to Struct Werte indizieren on Thu, 06 Sep 2007 13:10:34 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Da ist meine Variante aber schöner <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360217</guid><dc:creator><![CDATA[F98]]></dc:creator><pubDate>Thu, 06 Sep 2007 13:10:34 GMT</pubDate></item><item><title><![CDATA[Reply to Struct Werte indizieren on Thu, 06 Sep 2007 13:59:24 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Variante b (fuer ganz ganz seltene iterationen, naemlich unschoen!)</p>
<pre><code class="language-cpp">struct SWerte {
  float papisgeld;
  float mamisgeld;
  float omisgeld;
  enum{MAX = 4};
} werte;

//iteration
for(float* w = reinterpret_cast&lt;float*&gt;(&amp;werte), int i=0; i &lt; SWerte::MAX; i++)
  cout &lt;&lt; w[i];
//Zugriff mit namen
cout &lt;&lt; &quot;papi hat  &quot; &lt;&lt; werte.papisgeld;
</code></pre>
<p>Und jetz haut mich fuer den fiesen cast, ich weiss dass er unschoen ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Das ist gar nicht so falsch mit dem cast, bedient sich aber implementationspezifischen Verhaltens. Es macht also Sinn, dieses Verhalten schon beim Compilieren testen zu können:</p>
<pre><code class="language-cpp">static_assert&lt;offestof(SWerte,omisgeld)==(SWerte::MAX-1)*sizeof(float)&gt;;
</code></pre>
<p>Diese Identität ist ausreichend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360257</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 06 Sep 2007 13:59:24 GMT</pubDate></item><item><title><![CDATA[Reply to Struct Werte indizieren on Thu, 06 Sep 2007 14:04:26 GMT]]></title><description><![CDATA[<p>Sieht aber gnadenlos ungeil aus und ist nur von Profis in seiner Funktion zu entschlüsseln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360261</guid><dc:creator><![CDATA[F98]]></dc:creator><pubDate>Thu, 06 Sep 2007 14:04:26 GMT</pubDate></item></channel></rss>