<?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[Automatische Initialisierung einer Tabelle]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich wollte letztens Tabellen, die von mehreren Instanzen einer Klasse gemeinsam genutzt werden, automatisch initialisieren lassen. Ohne also ein einmaliges <code>init( )</code> aufrufen zu müssen, was dann durch ein Flag oder so vor mehrmaligem Aufruf geschützt wird.</p>
<p>Dabei bin ich auf die Idee gekommen, dass die Klasse ein statisches Member (Tabellen-Objekt) hat, dessen Constructor die Initialisierung der <em>eigentlichen</em> Map o.ä. durchführt.</p>
<p>Als Beispiel hier eine LED-Klasse, der man einen Sequenzcode vorgeben kann (also an, aus, blinken usw.). Mit <code>getSequence( )</code> erhält man über die statische (und private) Sequenztabelle dann die eigentliche Sequenz (also das Binkmuster) jedes LED-Objekts. <em>Hinweis: Es ist Absicht, dass die LED-Objekte jeweils ihren Sequenz-Code speichern und nicht die Sequenz selbst. Mir geht es primär ja auch um das Prinzip selbst. Es sind hier auch der Einfachheit halber keine Bereichsprüfungen o.ä. dabei.</em></p>
<p>Mich würde interessieren, was Ihr davon haltet (funktionieren tut es) oder ob ich was Wichtiges vergessen hab. Oder wie man etwas Ähnliches noch anders hinkriegt.</p>
<p>Led.h:</p>
<pre><code class="language-cpp">#include &lt;map&gt;

class Led
{
public:
	typedef enum
	{
		OFF,
		BLINK,
		FLASH,
		ON
	} seqCodes_e;

	Led( ) : mySequence( OFF ) { }

	void setSequenceCode( seqCodes_e code_ ) { mySequence = code_; }
	int  getSequence( ) const                { return seqTable( mySequence ); }

private:

	class SeqTable
	{
	public:
		SeqTable( );
		int operator( )( seqCodes_e code_ )   { return sequenceOf[ code_ ]; }
	private:
		std::map&lt;seqCodes_e, int&gt; sequenceOf;
	};
	static SeqTable seqTable;

	seqCodes_e mySequence;
};
</code></pre>
<p>Led.cpp:</p>
<pre><code class="language-cpp">#include &quot;Led.h&quot;

Led::SeqTable Led::seqTable;
// Der Constructor, der die Initialisierung durchführt
Led::SeqTable::SeqTable( )
{
	sequenceOf[ OFF ]   = 0x00;  // 00000000 bin
	sequenceOf[ BLINK ] = 0xAA;  // 10101010 bin
	sequenceOf[ FLASH ] = 0x80;  // 10000000 bin
	sequenceOf[ ON ]    = 0xFF;  // 11111111 bin
}
</code></pre>
<p>main:</p>
<pre><code class="language-cpp">Led redLed;
Led greenLed;

redLed.setSequenceCode( Led::BLINK );
greenLed.setSequenceCode( Led::ON );

std::cout &lt;&lt; &quot;Red:   &quot; &lt;&lt; std::hex &lt;&lt; redLed.getSequence( ) &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;Green: &quot; &lt;&lt; std::hex &lt;&lt; greenLed.getSequence( ) &lt;&lt; std::endl;
</code></pre>
<p>Ausgabe:</p>
<pre><code>Red:   aa
Green: ff
</code></pre>
<p>~Edit: Unterscheidung [c]setSequenceCode( )[/c] / [c]getSequence( )[/c]~</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/281500/automatische-initialisierung-einer-tabelle</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 15:46:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/281500.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Feb 2011 22:08:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Thu, 03 Feb 2011 08:16:02 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich wollte letztens Tabellen, die von mehreren Instanzen einer Klasse gemeinsam genutzt werden, automatisch initialisieren lassen. Ohne also ein einmaliges <code>init( )</code> aufrufen zu müssen, was dann durch ein Flag oder so vor mehrmaligem Aufruf geschützt wird.</p>
<p>Dabei bin ich auf die Idee gekommen, dass die Klasse ein statisches Member (Tabellen-Objekt) hat, dessen Constructor die Initialisierung der <em>eigentlichen</em> Map o.ä. durchführt.</p>
<p>Als Beispiel hier eine LED-Klasse, der man einen Sequenzcode vorgeben kann (also an, aus, blinken usw.). Mit <code>getSequence( )</code> erhält man über die statische (und private) Sequenztabelle dann die eigentliche Sequenz (also das Binkmuster) jedes LED-Objekts. <em>Hinweis: Es ist Absicht, dass die LED-Objekte jeweils ihren Sequenz-Code speichern und nicht die Sequenz selbst. Mir geht es primär ja auch um das Prinzip selbst. Es sind hier auch der Einfachheit halber keine Bereichsprüfungen o.ä. dabei.</em></p>
<p>Mich würde interessieren, was Ihr davon haltet (funktionieren tut es) oder ob ich was Wichtiges vergessen hab. Oder wie man etwas Ähnliches noch anders hinkriegt.</p>
<p>Led.h:</p>
<pre><code class="language-cpp">#include &lt;map&gt;

class Led
{
public:
	typedef enum
	{
		OFF,
		BLINK,
		FLASH,
		ON
	} seqCodes_e;

	Led( ) : mySequence( OFF ) { }

	void setSequenceCode( seqCodes_e code_ ) { mySequence = code_; }
	int  getSequence( ) const                { return seqTable( mySequence ); }

private:

	class SeqTable
	{
	public:
		SeqTable( );
		int operator( )( seqCodes_e code_ )   { return sequenceOf[ code_ ]; }
	private:
		std::map&lt;seqCodes_e, int&gt; sequenceOf;
	};
	static SeqTable seqTable;

	seqCodes_e mySequence;
};
</code></pre>
<p>Led.cpp:</p>
<pre><code class="language-cpp">#include &quot;Led.h&quot;

Led::SeqTable Led::seqTable;
// Der Constructor, der die Initialisierung durchführt
Led::SeqTable::SeqTable( )
{
	sequenceOf[ OFF ]   = 0x00;  // 00000000 bin
	sequenceOf[ BLINK ] = 0xAA;  // 10101010 bin
	sequenceOf[ FLASH ] = 0x80;  // 10000000 bin
	sequenceOf[ ON ]    = 0xFF;  // 11111111 bin
}
</code></pre>
<p>main:</p>
<pre><code class="language-cpp">Led redLed;
Led greenLed;

redLed.setSequenceCode( Led::BLINK );
greenLed.setSequenceCode( Led::ON );

std::cout &lt;&lt; &quot;Red:   &quot; &lt;&lt; std::hex &lt;&lt; redLed.getSequence( ) &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;Green: &quot; &lt;&lt; std::hex &lt;&lt; greenLed.getSequence( ) &lt;&lt; std::endl;
</code></pre>
<p>Ausgabe:</p>
<pre><code>Red:   aa
Green: ff
</code></pre>
<p>~Edit: Unterscheidung [c]setSequenceCode( )[/c] / [c]getSequence( )[/c]~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015848</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Thu, 03 Feb 2011 08:16:02 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Thu, 03 Feb 2011 06:38:42 GMT]]></title><description><![CDATA[<p>Das kann man machen, aber:<br />
Ich sehe den Nutzen im konkreten Fall nicht, weil</p>
<pre><code class="language-cpp">typedef enum
    {
        OFF = 0x00,
        BLINK = 0xaa,
        FLASH = 0x80,
        ON = 0xff
    } seqCodes_e;
</code></pre>
<p>ja schon alles macht was Du brauchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015898</guid><dc:creator><![CDATA[gastgast]]></dc:creator><pubDate>Thu, 03 Feb 2011 06:38:42 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Thu, 03 Feb 2011 08:13:49 GMT]]></title><description><![CDATA[<p>gastgast schrieb:</p>
<blockquote>
<p>ja schon alles macht was Du brauchst.</p>
</blockquote>
<p>In dem konkreten Fall geb ich Dir absolut recht, ich verwende die Technik jedoch auch für Tabellen, die strings als Keys oder Funktionspointer als Values haben (wie gesagt, die Led-Klasse ist nur ein Demo.).</p>
<p>Meine Überlegungen sind eher in der Art, ob die Konstruktion / Destruktion vom Timing her sicher ist (die Tabelle an sich ist ja ein Singleton, nur eben in einer sehr vereinfachten Ausführung). Ich gehe einfach davon aus, dass der Constructor aufgerufen wird, bevor der erste Zugriff auf die Tabelle erfolgt, bin mir aber nicht 100% sicher, ob das jeder Compiler auch so sieht.</p>
<p>Aber wie gesagt, evtl. gibt es noch andere elegantere Wege, um sowas umzusetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015920</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Thu, 03 Feb 2011 08:13:49 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Thu, 03 Feb 2011 08:42:48 GMT]]></title><description><![CDATA[<p>static class Member werden vor der dynamischen Konstruktion initialisiert. Von daher ist das sicher. Was aber passiert, wenn man im Code ein <code>static Led blueLED;</code> hat, ist nicht definiert, weil es keine definierte Reihenfolge für die Initialisierung von statics gibt. Solange aber im Konstruktor von Led nicht auf das static zugegriffen wird, bist Du da auf der sicheren Seite.</p>
<p>s. auch : <a href="http://stackoverflow.com/questions/1079623/what-is-the-lifetime-of-class-static-variables-in-c" rel="nofollow">http://stackoverflow.com/questions/1079623/what-is-the-lifetime-of-class-static-variables-in-c</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2015932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2015932</guid><dc:creator><![CDATA[gastgast]]></dc:creator><pubDate>Thu, 03 Feb 2011 08:42:48 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Thu, 03 Feb 2011 11:51:01 GMT]]></title><description><![CDATA[<p>OK, vielen Dank, v.a. für den stackoverflow-Artikel.</p>
<p>Ich habe gerade festgestellt, dass der Constructor noch vor main( ) aufgerufen wird, und sogar, wenn überhaupt <em>kein</em> LED-Objekt erzeugt wird (also nur durch das #include &quot;Led.h&quot;). Das ist interessant.</p>
<p>Solange die Tabelle nicht groß ist, sollte das kein Problem sein.</p>
<p>Eine sauberere Lösung wäre demnach vermutlich ein echtes Singleton, was nur bei Bedarf &quot;anspringt&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2016008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2016008</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Thu, 03 Feb 2011 11:51:01 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Thu, 03 Feb 2011 12:04:01 GMT]]></title><description><![CDATA[<p>Ich würde maximal die Initialisierung (Einfügen der Werte in die map) verzögern, nicht das Anlegen der std::map selbst.<br />
<code>boost::call_once</code> ist eine gute Möglichkeit das ganze thread-safe zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2016021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2016021</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 03 Feb 2011 12:04:01 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Thu, 03 Feb 2011 12:03:38 GMT]]></title><description><![CDATA[<p>-&gt; construct on first use idiom</p>
<pre><code class="language-cpp">int  getSequence( ) const 
{
  static SeqTable seqTable; 
  return seqTable( mySequence ); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2016022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2016022</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Thu, 03 Feb 2011 12:03:38 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Thu, 03 Feb 2011 12:06:40 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>-&gt; construct on first use idiom</p>
<pre><code class="language-cpp">int  getSequence( ) const 
{
  static SeqTable seqTable; 
  return seqTable( mySequence ); 
}
</code></pre>
</blockquote>
<p>* Falsche Syntax<br />
-&gt;</p>
<pre><code class="language-cpp">int getSequence() const 
{
  static SeqTable seqTable(mySequence);
  return seqTable; 
}
</code></pre>
<p>* Nicht thread-safe mit MSVC.<br />
* Nicht thread-safe mit C++03.<br />
* OK mit GCC.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2016023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2016023</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 03 Feb 2011 12:06:40 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Thu, 03 Feb 2011 12:30:53 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>brotbernd schrieb:</p>
<blockquote>
<p>-&gt; construct on first use idiom</p>
<pre><code class="language-cpp">int  getSequence( ) const 
{
  static SeqTable seqTable; 
  return seqTable( mySequence ); 
}
</code></pre>
</blockquote>
<p>* Falsche Syntax<br />
-&gt;</p>
<pre><code class="language-cpp">int getSequence() const 
{
  static SeqTable seqTable(mySequence);
  return seqTable; 
}
</code></pre>
<p>* Nicht thread-safe mit MSVC.<br />
* Nicht thread-safe mit C++03.<br />
* OK mit GCC.</p>
</blockquote>
<p>Also einer von uns beiden guckt schief. SeqTabl hat einen ()operator, keine int Konvertierung und auch keinen solchen Ctor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2016038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2016038</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Thu, 03 Feb 2011 12:30:53 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Thu, 03 Feb 2011 16:40:12 GMT]]></title><description><![CDATA[<p>Ja, ICH gucke schief <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Sorry, hast natürlich Recht.</p>
<p>Thread-safety ist aber so wie beschrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2016139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2016139</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 03 Feb 2011 16:40:12 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Thu, 03 Feb 2011 16:53:57 GMT]]></title><description><![CDATA[<p>Dazu eine Frage:<br />
- nicht thread-safe vermutlich weil ein zweiter thread getSequence aufrufen könnte, während das Objekt noch konstruiert wird (aufgrund eines Aufrufs von getsequence durch ersten thread)?</p>
<p>Inwiefern ist das für G++ in Ordnung? Hat er diesbezüglich erweiterete Sicherheitsmechanismen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2016154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2016154</guid><dc:creator><![CDATA[inter2k3]]></dc:creator><pubDate>Thu, 03 Feb 2011 16:53:57 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Thu, 03 Feb 2011 16:56:42 GMT]]></title><description><![CDATA[<p>Ja und Ja.<br />
lokale static Initialisierungen sind im GCC thread safe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2016157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2016157</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 03 Feb 2011 16:56:42 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Thu, 03 Feb 2011 17:01:06 GMT]]></title><description><![CDATA[<p>inter2k3 schrieb:</p>
<blockquote>
<p>- nicht thread-safe vermutlich weil ein zweiter thread getSequence aufrufen könnte, während das Objekt noch konstruiert wird (aufgrund eines Aufrufs von getsequence durch ersten thread)?</p>
</blockquote>
<p>Genau das. Dabei kann es dann passieren dass der 2. Thread anfängt seinerseits ebenfalls das Objekt zu initialisieren, oder dass der 2. Thread anfängt mit dem Objekt zu arbeiten, obwohl es noch nicht fertig initialisiert ist.</p>
<blockquote>
<p>Inwiefern ist das für G++ in Ordnung? Hat er diesbezüglich erweiterete Sicherheitsmechanismen?</p>
</blockquote>
<p>Auch richtig. G++ macht da im Prinzip das Äquivalent von boost::call_once rein um die statische Variable zu initialisieren. Da sich der check auf den meisten Plattformen so implementieren lässt, dass der &quot;bereits initialisiert&quot; Fall extrem schnell läuft, ist der Performance-Impact minimal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2016161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2016161</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 03 Feb 2011 17:01:06 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Fri, 04 Feb 2011 04:01:57 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21506">@minastaros</a>:<br />
Wenn du C++0x benutzt und dein Singleton thread-safe machen möchtest,<br />
kannst du dir ja mal die Variante 1 hier ankucken (bei Variante 2 wurde mir die thread-safety nicht bestätigt):<br />
<a href="http://www.c-plusplus.net/forum/279968#2004357" rel="nofollow">http://www.c-plusplus.net/forum/279968#2004357</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2016363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2016363</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Fri, 04 Feb 2011 04:01:57 GMT</pubDate></item><item><title><![CDATA[Reply to Automatische Initialisierung einer Tabelle on Fri, 04 Feb 2011 19:11:31 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>vielen Dank für die vielen Anmerkungen, das first use idion werd ich nochmal näher anschauen. Wie gesagt, funktionieren tut es und in der derzeitigen Umgebung (embedded-Gerät) ist thread-safeness an <em>dieser</em> Stelle (noch) kein Problem, da die Threads ganz gezielt erzeugt werden und auf die Resourcen zugreifen.</p>
<p>Werde bei Gelegenheit mal mehr in Richtung Singleton verbessern. Xspille, auch vielen Dank für den Vorschlag. Ist das Double-Checked-Locking-Pattern, da hab ich ganz frisch was im Alexandrescu drüber geschmökert, der natürlich gleich auch den Mercedes unter den Singletons (bzw. gleich die ganze Familie) mitbringt. Naja, zur Zeit tut es noch mein <code>static</code> ... <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/2016721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2016721</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Fri, 04 Feb 2011 19:11:31 GMT</pubDate></item></channel></rss>