<?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[initialisierung verschachtelter structs]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>folgendes Minimalbeispiel:</p>
<pre><code class="language-cpp">struct TableEntry  {
  int x;
  int y;
};

struct Table {
  TableEntry data[];     // table data
};

Table foo = {
	{5,   23 },
	{11,   42 }
};
</code></pre>
<p>funktioniert leider nicht (gcc liefert &quot;to many initializers for 'Table'&quot;).<br />
Wie ist das vom Standard vorgesehen?<br />
Ich möchte die Anzahl von Elementen in data[] in der Deklaration von Table zunächst unbestimmt lassen, da ich ja noch andere &quot;Objekte&quot; vom typ table anlegen möchte, mit veränderlicher Anzahl von TableEntry - Einträgen.<br />
Natürlich initialisiere ich alle Table´s zur Compilezeit.</p>
<p>Danke euch schonmal</p>
<p>(ich weiß natürlich, dass man auch STL-Container nehmen könnte aber darauf wird in meinem Fall bewusst verzichtet (u.a. Performancegründe))</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/249962/initialisierung-verschachtelter-structs</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 05:09:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/249962.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Sep 2009 15:44:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to initialisierung verschachtelter structs on Mon, 14 Sep 2009 15:44:00 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>folgendes Minimalbeispiel:</p>
<pre><code class="language-cpp">struct TableEntry  {
  int x;
  int y;
};

struct Table {
  TableEntry data[];     // table data
};

Table foo = {
	{5,   23 },
	{11,   42 }
};
</code></pre>
<p>funktioniert leider nicht (gcc liefert &quot;to many initializers for 'Table'&quot;).<br />
Wie ist das vom Standard vorgesehen?<br />
Ich möchte die Anzahl von Elementen in data[] in der Deklaration von Table zunächst unbestimmt lassen, da ich ja noch andere &quot;Objekte&quot; vom typ table anlegen möchte, mit veränderlicher Anzahl von TableEntry - Einträgen.<br />
Natürlich initialisiere ich alle Table´s zur Compilezeit.</p>
<p>Danke euch schonmal</p>
<p>(ich weiß natürlich, dass man auch STL-Container nehmen könnte aber darauf wird in meinem Fall bewusst verzichtet (u.a. Performancegründe))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778286</guid><dc:creator><![CDATA[wurfholz]]></dc:creator><pubDate>Mon, 14 Sep 2009 15:44:00 GMT</pubDate></item><item><title><![CDATA[Reply to initialisierung verschachtelter structs on Mon, 14 Sep 2009 15:49:10 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct Table { 
  TableEntry data[];     // table data 
};
</code></pre>
<p>Das ist kein gültiges C++, bei Array-Definitionen musst du die Dimension angeben. Aber an deiner Stelle würde ich sowieso Konstruktoren schreiben, die kannst du auch leicht verschachtelt aufrufen.</p>
<p>wurfholz schrieb:</p>
<blockquote>
<p>(ich weiß natürlich, dass man auch STL-Container nehmen könnte aber darauf wird in meinem Fall bewusst verzichtet (u.a. Performancegründe))</p>
</blockquote>
<p>Performancegründe - du bist dir also sicher, dass Klassen langsamer sein müssen? Sowas solltest du erst sagen, nachdem du es genau nachgemessen hast und es für dein Problem wirklich eine Rolle spielt. Ausserdem gibts immer noch <code>std::tr1::array</code> , ein reiner Array-Wrapper, der bei einem brauchbaren Compiler garantiert keinen Overhead hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778289</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 14 Sep 2009 15:49:10 GMT</pubDate></item><item><title><![CDATA[Reply to initialisierung verschachtelter structs on Mon, 14 Sep 2009 15:59:57 GMT]]></title><description><![CDATA[<p>Hier hast du zwei meiner Meinung nach elegante Lösungen, um dynamisch Einträge anzuhängen. Der Einfachheit halber habe ich alle Funktionen inline definiert.</p>
<pre><code class="language-cpp">struct TableEntry
{
    int x;
    int y;

    TableEntry(int x, int y)
    : x(x), y(y)
    {
    }
};

class Table
{
    private:
        std::vector&lt;TableEntry&gt; MyEntries;

    public:
        Table&amp; operator&lt;&lt; (const TableEntry&amp; NewEntry)
        {
            MyEntries.push_back(NewEntry);
            return *this;
        }

        Table&amp; operator() (int x, int y)
        {
            MyEntries.push_back(TableEntry(x, y));
            return *this;
        }
};
</code></pre>
<p>Anwendung:</p>
<pre><code class="language-cpp">int main()
{
    Table Tab;

    // Möglichkeit mit operator&lt;&lt;
    Tab &lt;&lt; TableEntry(3, 4)
        &lt;&lt; TableEntry(5, 2);

    // Möglichkeit mit operator()
    Tab(3, 4)(5, 2);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1778295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778295</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 14 Sep 2009 15:59:57 GMT</pubDate></item><item><title><![CDATA[Reply to initialisierung verschachtelter structs on Mon, 14 Sep 2009 16:15:28 GMT]]></title><description><![CDATA[<p>Danke für eure Hilfe soweit,</p>
<p>ich bin mir natürlich bewusst, dass es schön und elegant und immernoch (relativ) performant ist, mit den STL Containern zu arbeiten aber ich bin hier in einer embedded Realtime Umgebung mit ein paar Fakten:</p>
<p>1. Gerade diese Tables müssen wirklich performant sein (und ja, wir haben das schon mit profilern u.A. (Oszis :-)) nachgemessen..)<br />
2. Derzeit haben wir (noch) keine STL zur Verfügung<br />
3. Der obige Code hat mit einem älteren Compiler problemlos (und performant) funktioniert - und wurde dementsprechend eingesetzt.</p>
<p>Ich würde deshalb gerne zunächst den obigen Code sinngemäß wieder zum laufen bringen, und anschließend schauen, ob mit dem neuen Compiler evtl. die STL wieder denkbar wäre.</p>
<p>Hoffe ihr versteht meine Problematik..</p>
<p>(PS: Sämtliche Table Einträge sind bereits zur Compilezeit bekannt und ändern sich auch zur Laufzeit nicht mehr.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778303</guid><dc:creator><![CDATA[wurfholz]]></dc:creator><pubDate>Mon, 14 Sep 2009 16:15:28 GMT</pubDate></item><item><title><![CDATA[Reply to initialisierung verschachtelter structs on Mon, 14 Sep 2009 16:39:36 GMT]]></title><description><![CDATA[<p>wurfholz schrieb:</p>
<blockquote>
<p>(PS: Sämtliche Table Einträge sind bereits zur Compilezeit bekannt und ändern sich auch zur Laufzeit nicht mehr.)</p>
</blockquote>
<p>Ok, das ist der Vorteil, sonst müsstest du wieder mit <code>new</code> arbeiten und wärst kaum noch schneller als die STL.</p>
<p>Ich würde Templates empfehlen. Um die Initialisierungsliste zu nutzen, musst du bei PODs bleiben. So könnte das aussehen:</p>
<pre><code class="language-cpp">struct TableEntry
{
    int x;
    int y;
};

template &lt;unsigned int Size&gt;
struct Table
{
	TableEntry MyEntries[Size];
};

int main()
{
    Table&lt;3&gt; Tab =
    {
		2, 3, 
		5, 7, 
		1, 4,
	};
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1778312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778312</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 14 Sep 2009 16:39:36 GMT</pubDate></item><item><title><![CDATA[Reply to initialisierung verschachtelter structs on Mon, 14 Sep 2009 16:48:56 GMT]]></title><description><![CDATA[<p>Wieso überhaupt das Ganze in eine Klasse packen? Was spricht gegen</p>
<pre><code class="language-cpp">TableEntry foo[] = {
    {5,   23 },
    {11,   42 }
};
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778318</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 14 Sep 2009 16:48:56 GMT</pubDate></item><item><title><![CDATA[Reply to initialisierung verschachtelter structs on Mon, 14 Sep 2009 22:04:04 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@Camper</a><br />
Ja du hast recht aber: ich habe den Beispielcode etwas zu sehr abgespeckt. eigentlich ist in der Table struct noch ein element size enthalten, was die anzahl der Tabelleneinträge enthält, etwa so:</p>
<pre><code class="language-cpp">struct Table {
int size;  
TableEntry data[];     // table data
};
</code></pre>
<p>und natürlich brauche ich dieses element später auch, da es die einzige Information über die Anzahl der Entrys pro Table enthält.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a><br />
Hm, dass man Templates so auch (in Structs) verwenden konnte wusste ich nicht - Habe mich bisher auch erfolgreich um Templates gedrückt ;). Werde ich morgen mal ausprobieren, sieht recht elegant aus. Das könnte genau die Mischung aus elegantem Code und maximaler Performance sein, die ich suche.</p>
<p>Vielen Dank schonmal für eure Ideen.</p>
<p>Dennoch bleibt eine gewisse Unsicherheit, warum der eine Compiler den ursprünglichen Code akzeptiert und der andere nicht. Ist der Standard an dieser Stelle etwa undefiniert oder haben alle Compilerbauer mal wieder ihr eigenes Süppchen gekocht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778476</guid><dc:creator><![CDATA[wurfholz]]></dc:creator><pubDate>Mon, 14 Sep 2009 22:04:04 GMT</pubDate></item><item><title><![CDATA[Reply to initialisierung verschachtelter structs on Mon, 14 Sep 2009 22:10:33 GMT]]></title><description><![CDATA[<p>wurfholz schrieb:</p>
<blockquote>
<p>und natürlich brauche ich dieses element später auch, da es die einzige Information über die Anzahl der Entrys pro Table enthält.</p>
</blockquote>
<p>Das weiß Table auch selbst.</p>
<pre><code class="language-cpp">sizeof Table / sizeof *Table
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1778478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778478</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 14 Sep 2009 22:10:33 GMT</pubDate></item><item><title><![CDATA[Reply to initialisierung verschachtelter structs on Tue, 15 Sep 2009 07:20:16 GMT]]></title><description><![CDATA[<p>Stimmt natürlich auch wieder. Leider gibt es da noch ein Element, nämlich den Namen der aktuellen Tabelle als const char*.<br />
Den bräuchte ich auch noch. Ansonsten wäre es natürlich mit nem Array von Entrys auch getan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778581</guid><dc:creator><![CDATA[wurfholz]]></dc:creator><pubDate>Tue, 15 Sep 2009 07:20:16 GMT</pubDate></item><item><title><![CDATA[Reply to initialisierung verschachtelter structs on Tue, 15 Sep 2009 08:30:47 GMT]]></title><description><![CDATA[<p>ok, habe die Template methode implementiert, stoße aber auf neue Probleme:</p>
<p>Benutze in einer Klasse die Tables z.B. in der folgenden Art und Weise:</p>
<pre><code class="language-cpp">void AddTable (const Table * pTable);
</code></pre>
<p>Mit der Implementierung als Template müsste ich dann diese Methode ja folgendermaßen deklarieren</p>
<pre><code class="language-cpp">void AddTable (const Table&lt;42&gt; * pTable);
</code></pre>
<p>was ja offensichtlich Unsinn ist, da ich die Anzahl der Elemente ja an dieser Stelle nicht kenne. Gibts da ne Möglichkeit? Ansonsten gefällt mir die Template-methode ja ganz gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778631</guid><dc:creator><![CDATA[wurfholz]]></dc:creator><pubDate>Tue, 15 Sep 2009 08:30:47 GMT</pubDate></item><item><title><![CDATA[Reply to initialisierung verschachtelter structs on Tue, 15 Sep 2009 08:45:47 GMT]]></title><description><![CDATA[<p>Funktionstemplate.</p>
<pre><code class="language-cpp">template &lt;unsigned int Size&gt;
void AddTable (const Table&lt;Size&gt;* pTable);
</code></pre>
<p>Allerdings solltest du vielleicht mit der Zeit auch den Code-Bloat bedenken, wenn du in einer kritischen Umgebung arbeitest. Für jeden unterschiedlichen Templateparameter <code>Size</code> wird eine eigene Funktion <code>AddTable</code> erstellt, bzw. eine eigene Klasse <code>Table</code> . Ich weiss nicht, ob Codegrösse bei dir ein Problem darstellt, aber in dieser Hinsicht ist campers Vorschlag mit dem Array schon nicht ganz daneben; manchmal ist es besser, man programmiert direkt in C. Den <code>const char*</code> müsstest du dann eben zusätzlich speichern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778648</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 15 Sep 2009 08:45:47 GMT</pubDate></item><item><title><![CDATA[Reply to initialisierung verschachtelter structs on Tue, 15 Sep 2009 09:03:34 GMT]]></title><description><![CDATA[<p>Ja, das ist der Grund warum ich mich vor Templates bisher immer gedrückt habe.<br />
Ich glaube mittlerweile auch, dass ich es auf die altmodische C-Art machen sollte.</p>
<p>Dennoch Vielen Dank für eure Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778668</guid><dc:creator><![CDATA[wurfholz]]></dc:creator><pubDate>Tue, 15 Sep 2009 09:03:34 GMT</pubDate></item><item><title><![CDATA[Reply to initialisierung verschachtelter structs on Tue, 15 Sep 2009 10:49:48 GMT]]></title><description><![CDATA[<p>Es gibt noch die Möglichkeit, beide Ansätze zu kombinieren:</p>
<pre><code class="language-cpp">struct struct TableEntry  {
  int x;
  int y;
};

template &lt;unsigned int Size&gt;
struct Table_
{
    const char* name;
    unsigned size;
    TableEntry MyEntries[Size];
};

typedef Table_&lt;1&gt; Table;

union
{
    Table_&lt;2&gt; table_;
    Table table;
} foo = { &quot;foo&quot;, 2, { { 5,   23 }, { 11,   42 } } };
</code></pre>
<p>Das funktioniert, da wir es mit PODs zu tun haben, und wir uns daher auf die sog. &quot;common initial sequence&quot; verlassen können. Im Beispiel existiert foo.table_, damit wir bequem per {} initialisieren können und genügend Speicher reserviert wird. foo.table kann dann benutzt werden, um darauf wie bisher zuzugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1778737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1778737</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 15 Sep 2009 10:49:48 GMT</pubDate></item></channel></rss>