<?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[Enum Wert zur Laufzeit ermitteln]]></title><description><![CDATA[<p>Hallo,<br />
ich bin auf der Suche nach einer Lösung habe aber bisher noch keine gefunden, die sich auch umsetzten lässt.<br />
Es handelt sich dabei um Dateien die Enumerationen enthalten.<br />
Diese werden dazu verwendet um Adressen zu speichern.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">enum
{
    SPEICHERADRESSE1 = 0x00000000,
    SPEICHERADRESSE2,
    SPEICHERADRESSE3,
    SPEICHERADRESSE4,
    SPEICHERADRESSE5
</code></pre>
<p>Das ganze gibt es natürlich nicht nur für einige wenige sondern für viele Hunderte von Adressen. Es scheidet also eine Hardgecodete Lösung aus.<br />
Ich habe außerdem eine Datei in der die Namen gespeichert sind.<br />
Also</p>
<blockquote>
<p>SPEICHERADRESSE1 SPEICHERADRESSE2 SPEICHERADRESSE3 SPEICHERADRESSE4 SPEICHERADRESSE5</p>
</blockquote>
<p>Diese Datei lese ich ein mit:</p>
<pre><code class="language-cpp">symbol_names_file.open(&quot;enum_names.txt&quot;, ios_base::in);
if(symbol_names_file == 0) { cout &lt;&lt; &quot;Fehler beim einlesen der Datei&quot; &lt;&lt; endl; return; }
for( string enum_name; getline( symbol_names_file, enum_name, symbol_names_file.widen(' ') ); )
{
 cout &lt;&lt; &quot;Gelesen: [&quot; &lt;&lt; enum_name &lt;&lt; &quot;]&quot; &lt;&lt; endl;
 int enum_mnr = 0;
 enum_list.push_back(MSTEnum(enum_name, enum_mnr);
}

symbol_names_file.close();
</code></pre>
<p>Meine Frage ist jetzt, wie kann ich die Strings aus der &quot;enum_names&quot;-Datei in den Wert des Enums übersetzen?<br />
Damit ich später mit SPEICHERADRESSE1 nach 0x00000000 und von 0x00000000 nach SPEICHERADRRESSE1 konvertieren kann.<br />
Hat da jemand eine Idee?<br />
Danke<br />
Grüßle Oli</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/197102/enum-wert-zur-laufzeit-ermitteln</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 02:57:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197102.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Nov 2007 16:27:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Enum Wert zur Laufzeit ermitteln on Tue, 06 Nov 2007 16:27:30 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich bin auf der Suche nach einer Lösung habe aber bisher noch keine gefunden, die sich auch umsetzten lässt.<br />
Es handelt sich dabei um Dateien die Enumerationen enthalten.<br />
Diese werden dazu verwendet um Adressen zu speichern.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">enum
{
    SPEICHERADRESSE1 = 0x00000000,
    SPEICHERADRESSE2,
    SPEICHERADRESSE3,
    SPEICHERADRESSE4,
    SPEICHERADRESSE5
</code></pre>
<p>Das ganze gibt es natürlich nicht nur für einige wenige sondern für viele Hunderte von Adressen. Es scheidet also eine Hardgecodete Lösung aus.<br />
Ich habe außerdem eine Datei in der die Namen gespeichert sind.<br />
Also</p>
<blockquote>
<p>SPEICHERADRESSE1 SPEICHERADRESSE2 SPEICHERADRESSE3 SPEICHERADRESSE4 SPEICHERADRESSE5</p>
</blockquote>
<p>Diese Datei lese ich ein mit:</p>
<pre><code class="language-cpp">symbol_names_file.open(&quot;enum_names.txt&quot;, ios_base::in);
if(symbol_names_file == 0) { cout &lt;&lt; &quot;Fehler beim einlesen der Datei&quot; &lt;&lt; endl; return; }
for( string enum_name; getline( symbol_names_file, enum_name, symbol_names_file.widen(' ') ); )
{
 cout &lt;&lt; &quot;Gelesen: [&quot; &lt;&lt; enum_name &lt;&lt; &quot;]&quot; &lt;&lt; endl;
 int enum_mnr = 0;
 enum_list.push_back(MSTEnum(enum_name, enum_mnr);
}

symbol_names_file.close();
</code></pre>
<p>Meine Frage ist jetzt, wie kann ich die Strings aus der &quot;enum_names&quot;-Datei in den Wert des Enums übersetzen?<br />
Damit ich später mit SPEICHERADRESSE1 nach 0x00000000 und von 0x00000000 nach SPEICHERADRRESSE1 konvertieren kann.<br />
Hat da jemand eine Idee?<br />
Danke<br />
Grüßle Oli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1398796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1398796</guid><dc:creator><![CDATA[sambalmueslie]]></dc:creator><pubDate>Tue, 06 Nov 2007 16:27:30 GMT</pubDate></item><item><title><![CDATA[Reply to Enum Wert zur Laufzeit ermitteln on Tue, 06 Nov 2007 16:45:49 GMT]]></title><description><![CDATA[<p>Zur Laufzeit sind die Namen der enums nicht mehr bekannt.<br />
Die oft empfohlene Lösung dafür ist die Verwendung einer std:<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f5fa.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--world_map"
      title=":map:"
      alt="🗺"
    /></p>
<pre><code class="language-cpp">#include &lt;map&gt;

typedef std::map&lt;std::string, size_t&gt; Map;

Map map;
map[&quot;SPEICHERADRESSE1&quot;] = 0x00000000;
map[&quot;SPEICHERADRESSE2&quot;] = 0x47114711;
</code></pre>
<p>Mittels der Methode find() kannst du dann nach einer speziellen Adresse (z.B. &quot;SPEICHERADRESSE2&quot;) suchen.</p>
<p>Ich frage mich nur, was du mit diesen (absoluten) Speicheradressen anfängst???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1398808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1398808</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 06 Nov 2007 16:45:49 GMT</pubDate></item><item><title><![CDATA[Reply to Enum Wert zur Laufzeit ermitteln on Tue, 06 Nov 2007 16:56:04 GMT]]></title><description><![CDATA[<p>Danke für die schnelle Antwort.</p>
<p>Th schrieb:</p>
<blockquote>
<p>Zur Laufzeit sind die Namen der enums nicht mehr bekannt.</p>
</blockquote>
<p>Hm schade eigentlich, das hab ich mir schon fast gedacht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Th schrieb:</p>
<blockquote>
<p>Die oft empfohlene Lösung dafür ist die Verwendung einer std:<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f5fa.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--world_map"
      title=":map:"
      alt="🗺"
    /></p>
<pre><code class="language-cpp">#include &lt;map&gt;

typedef std::map&lt;std::string, size_t&gt; Map;

Map map;
map[&quot;SPEICHERADRESSE1&quot;] = 0x00000000;
map[&quot;SPEICHERADRESSE2&quot;] = 0x47114711;
</code></pre>
<p>Mittels der Methode find() kannst du dann nach einer speziellen Adresse (z.B. &quot;SPEICHERADRESSE2&quot;) suchen.</p>
</blockquote>
<p>Das mit der map ist zwar ne coole Lösung aber funktioniert in meinem Fall leider nicht, da die Dateien mit den Enums leider schon exisitieren und sehr groß sind und ich diese ja irgendwie in die map reinbekommen muss.<br />
Außerdem sind die Enum-Dateien, Teil von einem System an dem &quot;mein&quot; Programm als Client hängt. Ich möchte also hardcoden vermeiden und das ganze austauschbar gestalten.<br />
Das läuft aber dann wohl auf einen Parser raus oder?</p>
<p>Th schrieb:</p>
<blockquote>
<p>Ich frage mich nur, was du mit diesen (absoluten) Speicheradressen anfängst???</p>
</blockquote>
<p>Ich kommuniziere(über einen Socket) mit einem System, das über die absolute Adresse auf seine Daten zugreift. Um es dem Benutzer aber zu erleichten würde ich gerne einen String verwenden und nicht einfach nur eine Zahl.<br />
Darum diese Umwandlung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1398811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1398811</guid><dc:creator><![CDATA[sambalmueslie]]></dc:creator><pubDate>Tue, 06 Nov 2007 16:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to Enum Wert zur Laufzeit ermitteln on Tue, 06 Nov 2007 21:40:20 GMT]]></title><description><![CDATA[<p>Hmm? Naja ... also std::map&lt;MSTEnum, int&gt; data; würde gehen ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1398917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1398917</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 06 Nov 2007 21:40:20 GMT</pubDate></item><item><title><![CDATA[Reply to Enum Wert zur Laufzeit ermitteln on Tue, 06 Nov 2007 21:46:55 GMT]]></title><description><![CDATA[<p>(D)Evil schrieb:</p>
<blockquote>
<p>Hmm? Naja ... also std::map&lt;MSTEnum, int&gt; data; würde gehen ^^</p>
</blockquote>
<p>Wie denn?? Ich steh da dezent auf dem Schlauch <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/1398924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1398924</guid><dc:creator><![CDATA[sambalmueslie]]></dc:creator><pubDate>Tue, 06 Nov 2007 21:46:55 GMT</pubDate></item><item><title><![CDATA[Reply to Enum Wert zur Laufzeit ermitteln on Wed, 07 Nov 2007 10:52:39 GMT]]></title><description><![CDATA[<p>Also verstehe ich dich richtig? Du hast eine Datei, in der schon die enums aufgelistet sind (als Header-Datei) und du willst jetzt auf die Enum-Namen zur Laufzeit zugreifen.</p>
<p>Dann wäre es wohl wirklich das einfachste, dafür einen Parser zu verwenden, der die Datei liest und diese Werte dann in die von mir beschriebene Map schreibt.<br />
Wenn diese Datei konstant ist, dann kanst du sie ja vielleicht noch so formatieren, daß der Parser simpel zu schreiben ist:</p>
<pre><code class="language-cpp">ifstream iff(&quot;enums.h&quot;);
if(!iff) return;

std::string sEnum;
size_t nEnum;
char c;

while(!iff.eof())
{
  iff &lt;&lt; sEnum &lt;&lt; c;
  if(c != '=')
    break; // Error: kein Gleichheitszeichen

  iff &lt;&lt; hex &lt;&lt; nEnum &lt;&lt; c;
  if(c != ',')
    break; // Error: Komma fehlt

  map[sEnum] = nEnum;
}
</code></pre>
<p>Zu beachten dabei ist, daß ich davon ausgehe, daß vor dem Gleichheitszeichen immer ein Leerzeichen ist (ansonsten mußt du den Parser anpassen):</p>
<pre><code class="language-cpp">SPEICHERADRESSE1 = 0x00000000,
</code></pre>
<p>Wenn du auch enums ohne Zuweisung haben willst (wie z.B. &quot;SPEICHERADRESSE2,&quot;) dann mußt du einfach den vorherigen 'nEnum' Wert um eins addieren (bzw. zu Beginn am besten mit 0 initialisieren) und dementsprechend den Parser anpassen.</p>
<p>Anschließend befinden sich die Daten in der Map (am besten als Klassenvariable deklariert) und du kannst dann damit nach einzelnen Namen mit find() suchen (O(log N)).<br />
Bei einem Array (oder std::vector) hättest du ja ein lineares Suchverhalten (O(N)), daher die Empfehlung für das Array (insebsondere bei mehreren Hundert oder mehr Einträgen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1399008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399008</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Wed, 07 Nov 2007 10:52:39 GMT</pubDate></item><item><title><![CDATA[Reply to Enum Wert zur Laufzeit ermitteln on Wed, 07 Nov 2007 11:35:00 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>Also verstehe ich dich richtig? Du hast eine Datei, in der schon die enums aufgelistet sind (als Header-Datei) und du willst jetzt auf die Enum-Namen zur Laufzeit zugreifen.</p>
</blockquote>
<p>Jo du verstehst mich richtig.</p>
<p>Th schrieb:</p>
<blockquote>
<p>Dann wäre es wohl wirklich das einfachste, dafür einen Parser zu verwenden, der die Datei liest und diese Werte dann in die von mir beschriebene Map schreibt.<br />
Wenn diese Datei konstant ist, dann kanst du sie ja vielleicht noch so formatieren, daß der Parser simpel zu schreiben ist:</p>
<pre><code class="language-cpp">ifstream iff(&quot;enums.h&quot;);
if(!iff) return;

std::string sEnum;
size_t nEnum;
char c;

while(!iff.eof())
{
  iff &lt;&lt; sEnum &lt;&lt; c;
  if(c != '=')
    break; // Error: kein Gleichheitszeichen

  iff &lt;&lt; hex &lt;&lt; nEnum &lt;&lt; c;
  if(c != ',')
    break; // Error: Komma fehlt

  map[sEnum] = nEnum;
}
</code></pre>
<p>Zu beachten dabei ist, daß ich davon ausgehe, daß vor dem Gleichheitszeichen immer ein Leerzeichen ist (ansonsten mußt du den Parser anpassen):</p>
<pre><code class="language-cpp">SPEICHERADRESSE1 = 0x00000000,
</code></pre>
<p>Wenn du auch enums ohne Zuweisung haben willst (wie z.B. &quot;SPEICHERADRESSE2,&quot;) dann mußt du einfach den vorherigen 'nEnum' Wert um eins addieren (bzw. zu Beginn am besten mit 0 initialisieren) und dementsprechend den Parser anpassen.</p>
</blockquote>
<p>Thx für den Parser, aber ganz so einfach ist es leider nicht. Die Dateien sind von dem System auf das ich zugreife und sollen nicht verändert werden. Damit scheidet das schon mal aus. Es handelt sich hierbei auch um 700kB Daten und das ist nicht so einfach zu händeln. Ich würde das gerne komplett automatisieren.<br />
Die Enums sind nicht einfach linear durchnummeriert sondern es gibt Sprünge und<br />
in den entsprechenden Dateien ist der Wert des ersten Enums per Funktion zugewießen. Also alles in allem nicht ganz einfach. Ich hab mir auch mal nen TCL-Parser gebaut aber so richtig dolle war der auch nicht.<br />
Wird wohl auf nen eigenen Lexer rauslaufen. <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="🙂"
    /> .. Hab halt gedacht, es gibt vielleicht eine einfache Lösung...</p>
<p>Th schrieb:</p>
<blockquote>
<p>Anschließend befinden sich die Daten in der Map (am besten als Klassenvariable deklariert) und du kannst dann damit nach einzelnen Namen mit find() suchen (O(log N)).<br />
Bei einem Array (oder std::vector) hättest du ja ein lineares Suchverhalten (O(N)), daher die Empfehlung für das Array (insebsondere bei mehreren Hundert oder mehr Einträgen).</p>
</blockquote>
<p>So aus dem Gefühl raus, vermute ich mal du wolltest mir die Map empfehlen weil hier das suchen schneller geht. Aber das ist erst mal nicht so das Thema, da ich Zeit habe und hier nicht so die Priorität ist. Wichtig ist die Funktion <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="🙂"
    /> erstmal.</p>
<p>Grüßle Oli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1399049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399049</guid><dc:creator><![CDATA[sambalmueslie]]></dc:creator><pubDate>Wed, 07 Nov 2007 11:35:00 GMT</pubDate></item></channel></rss>