<?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[Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste]]></title><description><![CDATA[<p>Ich möchte eine Reihe von Funktionen zur Laufzeit erstellen und in einen Vektor (oder ein Array) schreiben</p>
<p>Die bisherige Lösung sieht so aus:</p>
<pre><code>typedef void (*pFunktion)(long);  // Definition des Typs

...
void Func0(long input)            
{
vMETAPANEL[0].TriggerToolbar0(input);
} 

void Func1(long input)            
{
vMETAPANEL[1].TriggerToolbar0(input);
} 

// ... usf  bis 100

pFunktion Function[100]; 

void InitFunctions()
{
Function[0] ) &amp;Func0;
Function[1] ) &amp;Func1;
// usw.
}
</code></pre>
<p>Man sieht: Func1 unterscheidet sich von Func0 nur dadurch, dass es eine andere Instanz einer in einem Vektor gespeocherten Klasse anspricht, also nur eine Variable hochzählt.</p>
<p>So wie ich das jetzt angelegt habe, funktioniert's - aber ist natürlich extrem umständlich. Gibt es da keine bessere Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/217869/funktionen-zur-laufzeit-erstellen-funktionszeiger-liste</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 05:05:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/217869.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 Jul 2008 14:55:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sat, 12 Jul 2008 14:56:14 GMT]]></title><description><![CDATA[<p>Ich möchte eine Reihe von Funktionen zur Laufzeit erstellen und in einen Vektor (oder ein Array) schreiben</p>
<p>Die bisherige Lösung sieht so aus:</p>
<pre><code>typedef void (*pFunktion)(long);  // Definition des Typs

...
void Func0(long input)            
{
vMETAPANEL[0].TriggerToolbar0(input);
} 

void Func1(long input)            
{
vMETAPANEL[1].TriggerToolbar0(input);
} 

// ... usf  bis 100

pFunktion Function[100]; 

void InitFunctions()
{
Function[0] ) &amp;Func0;
Function[1] ) &amp;Func1;
// usw.
}
</code></pre>
<p>Man sieht: Func1 unterscheidet sich von Func0 nur dadurch, dass es eine andere Instanz einer in einem Vektor gespeocherten Klasse anspricht, also nur eine Variable hochzählt.</p>
<p>So wie ich das jetzt angelegt habe, funktioniert's - aber ist natürlich extrem umständlich. Gibt es da keine bessere Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546250</guid><dc:creator><![CDATA[Percy2000]]></dc:creator><pubDate>Sat, 12 Jul 2008 14:56:14 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sat, 12 Jul 2008 15:02:09 GMT]]></title><description><![CDATA[<p>std::tr1::bind vereinfacht das erheblich (wobei wahrscheinlich sogar std::mem_fun schon reichen würde).</p>
<p>Aber wofür machst du das überhaupt? Was tust du mit einem solchen Array?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546253</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 12 Jul 2008 15:02:09 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sat, 12 Jul 2008 15:05:34 GMT]]></title><description><![CDATA[<p>und wieso nicht sowas??</p>
<pre><code class="language-cpp">void Func(int iIndex, long lInput)
{ vMETAPANEL[iIndex].TriggerToolbar0(lInput); };
</code></pre>
<p>Bei deinem Funktionsarray musst du ja auch über einen Indexzeiger zugreifen. Irgendwie versteh ich das Problem nicht.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546255</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 12 Jul 2008 15:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sat, 12 Jul 2008 15:05:41 GMT]]></title><description><![CDATA[<p>Schon mal mit Klassen und Objekten gearbeitet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546256</guid><dc:creator><![CDATA[frage@u]]></dc:creator><pubDate>Sat, 12 Jul 2008 15:05:41 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sat, 12 Jul 2008 15:24:29 GMT]]></title><description><![CDATA[<p>ist mir schon klar, dass das eine sehr stumpfsinnige Frage ist, die ich anbiete.</p>
<p>Der Grund dafür liegt dartin, dass ich auf eine Event-Funktion aus einer Library zugreife,die mir nur diesen Typ erlaubt:</p>
<p>void Func(long lInput) // wobei der long Wert die Adresse der Funktion übernimt</p>
<p>Ich verstecke also den Index im Funktionsnamen - und um das halbwegs erträglich zu machen, schreibe ich dann den Array.</p>
<p>Der Hintergrund ist natürlich: Übergabe eines Methodenzeigers - aber wie man sieht, gerät mir der Mangel an Argmumenten einfach zum Problem.</p>
<p>Danke schön für die Anteilnahme, vieleicht doch jemand da, der meine Begriffsblockade auflöst.</p>
<p>Das habe ich leider gar nicht verstanden:<br />
std::tr1::bind</p>
<p>Wie müsste ich das machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546264</guid><dc:creator><![CDATA[Percy2000]]></dc:creator><pubDate>Sat, 12 Jul 2008 15:24:29 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sat, 12 Jul 2008 15:30:08 GMT]]></title><description><![CDATA[<p>Wieso übergibst du nicht einen Pointer auf ein Objekt als Parameter, statt nen Funktionspointer. Ist das wirklich long als Parameter? Klingt für mich etwas gefährlich davon auszugehen, dass ein Pointer immer in long passt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546269</guid><dc:creator><![CDATA[frage@u]]></dc:creator><pubDate>Sat, 12 Jul 2008 15:30:08 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sat, 12 Jul 2008 15:34:56 GMT]]></title><description><![CDATA[<p>Naja, auch wenn ich nicht ganz verstehe, wieso du nur so eine Funktion mit dieser Signatur verwenden kannst, so gäbe es vielleicht eine Möglichkeit:</p>
<pre><code class="language-cpp">template&lt;int iIndex&gt;
void Func(long lInput)
{ vMETAPANEL[iIndex].TriggerToolbar0(lInput); };

// Verwendung:
funktion_zur_api_oder_was_auch_immer(&amp;Func&lt;0&gt;);
funktion_zur_api_oder_was_auch_immer(&amp;Func&lt;3&gt;);
</code></pre>
<p>Es müsste aber zur Compilezeit bekannt sein, was für eine Nummer, wann aufgerufen wird.</p>
<p>Ansonsten kannst du vielleicht so die Sache ein wenig schneller erstellen lassen:</p>
<pre><code class="language-cpp">void InitFunctions()
{
    Function[0] = &amp;Func&lt;0&gt;;
    Function[1] = &amp;Func&lt;1&gt;;
    // usw.
}
</code></pre>
<p>Aber wie gesagt, verstanden habe ich deine Problemstellung nicht und von mir aus gesehen ist hier irgendwo ein Designfehler.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546272</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 12 Jul 2008 15:34:56 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sat, 12 Jul 2008 20:25:04 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Aber wie gesagt, verstanden habe ich deine Problemstellung nicht und von mir aus gesehen ist hier irgendwo ein Designfehler.</p>
</blockquote>
<p>Ist es, aber in der Bibliothek <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>
<p>@Standardkundige, ist sowas konform?</p>
<pre><code class="language-cpp">void tolle_funktion_die_aufruft (int Index)
{
    struct Bla
    {
        static void func (long Input)
        {
            vMETAPANEL[Index].TriggerToolbar0(Input);
        }
    }

    gangsta_bibliotheks_funktion (&amp;Bla::func);
}
</code></pre>
<p>Wobei das wohl spätestens dann ziemlich in die Hose geht, wenn gangsta_bibliotheks_funktion den Zeiger speichert ...</p>
<p>Hmm, Percy, ich glaub' dir bleibt tatsächlich kaum was anderes übrig (bind würde nur helfen, wenn beliebige Funktionsobjekte erlaubt wären). Um dir die Arbeit etwas zu vereinfachen und den Code zu verkürzen, könntest du ihn mit <a href="http://boost.org/libs/preprocessor" rel="nofollow">Boost.Preprocessor</a> oder mit tollen Metaprogrammen erzeugen lassen.</p>
<pre><code class="language-cpp">template &lt;unsigned I&gt;
struct meta_function_init
{
    static void func (long Input)
    {
        vMETAPANEL[I].TriggerToolbar0(Input);
    }

    meta_function_init (std::vector&lt;function&gt;&amp; array)
    {
        meta_function_init&lt;I - 1&gt; blubb (array);
        array.push_back (&amp;meta_function_init::func);
    }
}

template &lt;&gt;
struct meta_function_init&lt;0&gt;
{
    static void func (long Input)
    {
        vMETAPANEL[0].TriggerToolbar0(Input);
    }

    meta_function_init (std::vector&lt;function&gt;&amp; array)
    {
        array.push_back (&amp;meta_function_init::func);
    }
};
</code></pre>
<p>Und dann</p>
<pre><code class="language-cpp">void InitFunctions ()
{
    meta_function_init&lt;TOLLE_GROßE_KONSTANTE&gt; initer (array);
}
</code></pre>
<p>/edit: Danke Dravere <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/1546328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546328</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 12 Jul 2008 20:25:04 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sat, 12 Jul 2008 18:59:44 GMT]]></title><description><![CDATA[<p>*hüstel*<br />
.filmor? Hast du da nicht irgendwas vergessen? Deine Methoden sind nicht static und somit Member-Funktionen und können daher nicht ohne Objekt aufgerufen werden <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="😉"
    /><br />
Wenn man allerdings vor das <code>void func(long lInput)</code> ein <code>static</code> einbauen würde, dann denke ich, sollte sowas funktionieren.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546372</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 12 Jul 2008 18:59:44 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sat, 12 Jul 2008 19:11:41 GMT]]></title><description><![CDATA[<p>Percy2000 schrieb:</p>
<blockquote>
<p>Der Grund dafür liegt dartin, dass ich auf eine Event-Funktion aus einer Library zugreife,die mir nur diesen Typ erlaubt:</p>
<p>void Func(long lInput) // wobei der long Wert die Adresse der Funktion übernimt</p>
</blockquote>
<p>Bedank dich bei den Idioten, die diese API entworfen haben. Da man keine zusätzlichen Daten übergeben kann hast du ganz einfach verloren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546379</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sat, 12 Jul 2008 19:11:41 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sun, 13 Jul 2008 01:14:28 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13532">@Percy2000</a><br />
Ich kenne das Problem, und ich kenne eigentlich nur eine komplett generische Lösung: Thunks zu erzeugen, indem man Speicher alloziert und da Code reinschreibt, und den Zeiger dann auf einen Funktionszeiger castet. Ist natürlich komplett überhaupt nicht portierbar und ziemlich ... hässlich.</p>
<p>Wenn du wissen willst wie sowas aussieht guck dir die Implementierung der Window-Klassen in der ATL an, da werden solche dynamisch erzeugten Thunks verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546490</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 13 Jul 2008 01:14:28 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sun, 13 Jul 2008 16:52:33 GMT]]></title><description><![CDATA[<p>@hustbear:</p>
<p>die idee ist gut. Wenn man aber codesnippets prozessorspezifisch compiled, die dann, je nach art kombiniert, in den speicher gelegt werden, dürfte das auch portierbar sein. Man müsste sich dann bloß noch n kleenes köpfchen für den datenaustausch zwischen den snippets machen. (Gibts da keine lib für??)<br />
Gibt es aber i.A. keine javascript ähnliche func. eval() für c/c++ ??</p>
<p>grüüüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546715</guid><dc:creator><![CDATA[zeusosc]]></dc:creator><pubDate>Sun, 13 Jul 2008 16:52:33 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sun, 13 Jul 2008 17:34:10 GMT]]></title><description><![CDATA[<p>Ich glaub nicht, dass es darum geht Code zur Laufzeit zu erzeugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546729</guid><dc:creator><![CDATA[abbbbb]]></dc:creator><pubDate>Sun, 13 Jul 2008 17:34:10 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen zur Laufzeit erstellen &#x2F;&#x2F; Funktionszeiger-Liste on Sun, 13 Jul 2008 22:07:12 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14077">@zeusosc</a>: Es geht hier eigentlich nur darum Thunks zu erzeugen (wenn überhaupt), und dafür reicht ein &quot;snippet&quot; pro Prozessor und Funktionstyp (Anzahl &amp; Typ der Parameter + Returntyp).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1546862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1546862</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 13 Jul 2008 22:07:12 GMT</pubDate></item></channel></rss>