<?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[Funktionszeiger]]></title><description><![CDATA[<p>Hallo,<br />
ich stehe im Moment vor folgendem (wahrscheinlich sehr atypischen) Problem:</p>
<p>Ich möchte gerne mit Funktionszeigern arbeiten, von denen ich nicht weiß, die die Argumentliste aussieht. Ist das in C++ überhaupt möglich?</p>
<p>Der ungefähre Ablauf:</p>
<ol>
<li>Member-Variable auf eine Funktion mit unbekannter Argumentliste</li>
</ol>
<pre><code class="language-cpp">void (*funktionszeiger)(&lt;Was kommt hier hin?&gt;)
</code></pre>
<ol start="2">
<li>Nacheinander Zuweisungen einer beliebigen konkreten Funktion.</li>
</ol>
<pre><code class="language-cpp">void add(int i, int j);
void output(std::string s);

funktionszeiger = &amp;add;
(*funktionszeiger)(1,2);
[...]
funktionszeiger = &amp;output;
(*funktionszeiger)(&quot;Test&quot;);
</code></pre>
<p>Hierbei sollen diese Zuweisungen und die Aufrufe möglich sein.<br />
Ich hätte kein Problem damit, wenn ich die Aufrufe &quot;(*funktionszeiger)(1,2)&quot; in einen try-catch-Block packen muss, um Abstürze zu verhindern.</p>
<p>Ich hoffe Ihr könnt mir helfen und versteht mein Problem.</p>
<p>Gruß JoKl</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/205518/funktionszeiger</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 03:03:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/205518.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 15 Feb 2008 09:45:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionszeiger on Fri, 15 Feb 2008 09:45:05 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich stehe im Moment vor folgendem (wahrscheinlich sehr atypischen) Problem:</p>
<p>Ich möchte gerne mit Funktionszeigern arbeiten, von denen ich nicht weiß, die die Argumentliste aussieht. Ist das in C++ überhaupt möglich?</p>
<p>Der ungefähre Ablauf:</p>
<ol>
<li>Member-Variable auf eine Funktion mit unbekannter Argumentliste</li>
</ol>
<pre><code class="language-cpp">void (*funktionszeiger)(&lt;Was kommt hier hin?&gt;)
</code></pre>
<ol start="2">
<li>Nacheinander Zuweisungen einer beliebigen konkreten Funktion.</li>
</ol>
<pre><code class="language-cpp">void add(int i, int j);
void output(std::string s);

funktionszeiger = &amp;add;
(*funktionszeiger)(1,2);
[...]
funktionszeiger = &amp;output;
(*funktionszeiger)(&quot;Test&quot;);
</code></pre>
<p>Hierbei sollen diese Zuweisungen und die Aufrufe möglich sein.<br />
Ich hätte kein Problem damit, wenn ich die Aufrufe &quot;(*funktionszeiger)(1,2)&quot; in einen try-catch-Block packen muss, um Abstürze zu verhindern.</p>
<p>Ich hoffe Ihr könnt mir helfen und versteht mein Problem.</p>
<p>Gruß JoKl</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456346</guid><dc:creator><![CDATA[JoKl]]></dc:creator><pubDate>Fri, 15 Feb 2008 09:45:05 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger on Fri, 15 Feb 2008 09:52:27 GMT]]></title><description><![CDATA[<p>JoKl schrieb:</p>
<blockquote>
<p>Ich möchte gerne mit Funktionszeigern arbeiten, von denen ich nicht weiß, die die Argumentliste aussieht. Ist das in C++ überhaupt möglich?</p>
</blockquote>
<p>Welchen Sinn hätte es solche Konstrukte zu verwenden?<br />
Ich gehe hier von ein Fehler im Design aus...</p>
<p>Und Speicherzugriffsfehler etc. lösen keine Exception im C++ Sinne aus, Abstürze sind vorprogrammiert.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456352</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 15 Feb 2008 09:52:27 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger on Fri, 15 Feb 2008 09:53:47 GMT]]></title><description><![CDATA[<p>Nein, das geht so nicht. Ein Funktionszeiger hat immer eine feste Signatur, d.h. er benoetigt eine feste Anzahl Parameter von einem bestimmten Typ.<br />
boost::function bietet etwas mehr Funktionalitaet (im Zusammenhang mit boost::bind), aber was du genau vor hast geht so nicht (ausser vllt ueber eine menge dreckiger casts ;D).</p>
<p>Gruss,<br />
DeSoVoDaMu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456353</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Fri, 15 Feb 2008 09:53:47 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger on Fri, 15 Feb 2008 09:55:56 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Welchen Sinn hätte es solche Konstrukte zu verwenden?<br />
Ich gehe hier von ein Fehler im Design aus...</p>
</blockquote>
<p>OK, der Sinn ist der folgende:<br />
Ich verwalte in einem Vector eine Liste von Funktionszeiger von Funktionen unterschiedlichen Typs. Jedem Funktionszeiger ist über einen Integer eine ID zugeordnet. Nun interpretiere ich eine Sequenz von Integern und nachfolgender Parameterliste und möchte gerne in Abhängigkeit von der ID die entsprechende Funktion mit den angegebenen Parametern aufzurufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456355</guid><dc:creator><![CDATA[JoKl]]></dc:creator><pubDate>Fri, 15 Feb 2008 09:55:56 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger on Fri, 15 Feb 2008 10:18:47 GMT]]></title><description><![CDATA[<p>JoKl schrieb:</p>
<blockquote>
<p>...<br />
...Jedem Funktionszeiger ist über einen Integer eine ID zugeordnet. Nun interpretiere ich eine Sequenz von Integern und nachfolgender Parameterliste und möchte gerne in Abhängigkeit von der ID die entsprechende Funktion mit den angegebenen Parametern aufzurufen.</p>
</blockquote>
<p>asc schrieb:</p>
<blockquote>
<p>...Ich gehe hier von ein Fehler im Design aus...</p>
</blockquote>
<p>:p <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 />
Der Einsatz von &quot;Typ-IDs&quot; (&quot;Wenn a dann mach dies - wenn b, dann mach das - ...&quot;) sollte einen immer stutzig machen ud nach anderen Lösungen suchen lassen.</p>
<p>Wenn es unbedingt sein muss, kannst Du Letztlich natürlich immer void (*f)(void*) nehmen und je nach Funktion ein unschiedliche structs übergeben, die die jeweiligen Parameter bündeln ...</p>
<p>Aber: &quot;Typsicherheit ist Dein Freund !&quot; - und zwar ein sehr mächtiger. Es wäre unklug, sich von ihr nicht helfen zu lassen.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456371</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 15 Feb 2008 10:18:47 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger on Fri, 15 Feb 2008 10:43:14 GMT]]></title><description><![CDATA[<p>JoKl schrieb:</p>
<blockquote>
<p>OK, der Sinn ist der folgende:<br />
Ich verwalte in einem Vector eine Liste von Funktionszeiger von Funktionen unterschiedlichen Typs. Jedem Funktionszeiger ist über einen Integer eine ID zugeordnet. Nun interpretiere ich eine Sequenz von Integern und nachfolgender Parameterliste und möchte gerne in Abhängigkeit von der ID die entsprechende Funktion mit den angegebenen Parametern aufzurufen.</p>
</blockquote>
<p>Zu welchem Zweck machst du das? Eventuell kann man dir Alternativen vorschlagen, wenn du uns das Kernproblem erklaerst, das du damit loesen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456393</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 15 Feb 2008 10:43:14 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger on Fri, 15 Feb 2008 10:43:51 GMT]]></title><description><![CDATA[<p>[quote=&quot;JoKl Jedem Funktionszeiger ist über einen Integer eine ID zugeordnet.[/quote]</p>
<p>dann codier doch da gleich die übergabe- und den rückgabeparameter mit rein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456395</guid><dc:creator><![CDATA[proggingm@nia]]></dc:creator><pubDate>Fri, 15 Feb 2008 10:43:51 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger on Fri, 15 Feb 2008 13:44:06 GMT]]></title><description><![CDATA[<p>Der Zweck ist der folgende:<br />
Es soll ein Zeileninterpreter geschrieben werden, der aus einer Textdatei ein Skript abarbeitet. Die Befehle in der Datei sehen so aus:</p>
<p>Befehl1 12 abc 3.4<br />
Befehl2 acs<br />
Befehl3 100</p>
<p>Ich möchte jetzt eine Klasse schreiben, der ich Zeiger auf Funktionen mit beliebiger Signatur übergeben möchte und zusammen mit dem Bezeichner in einem Vektor speichern. Der Vector sieht dann ungefähr so aus:<br />
((&quot;Befehl1&quot;, ZeigerAufFunktionA), (&quot;Befehl2&quot;, ZeigerAufFunktionB), ...)</p>
<p>ZeigerAufFunktionA zeigt dann auf eine Funktion, die als Parameter einen int, einen String und einen double Wert erwartet.</p>
<p>Jetzt möchte ich im Fall, dass der Bezeichner &quot;Befehl1&quot; ist, die Funktion &quot;ZeigerAufFunktionA&quot; mit Parametern 12, abc, 3.4 aufrufen.</p>
<p>Ich bin über jeden anderen Ansatz dankbar</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456521</guid><dc:creator><![CDATA[JoKl]]></dc:creator><pubDate>Fri, 15 Feb 2008 13:44:06 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger on Fri, 15 Feb 2008 13:58:26 GMT]]></title><description><![CDATA[<p>C++ und funktionspointer ist generell was, was sich beisst.</p>
<p>Funktionspointer sind C ... und wenn du nich gerade eine C Schnittstelle bedienen musst (Callbacks ets), oder von der Performance zu ganz schmutzigen hacks gezwungen wirst, solltest Du auch keine funktionspointer verwenden.<br />
Der &quot;Ersatz&quot; fuer funktionspointer auf OOP Ebene sind virtuelle methoden. (ne vtable ist halt sowas wiene funktoinspointerliste).<br />
Also wenn du c++ willst, solltest du OOP korrekt mit Polymorphie arbeiten.</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456538</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Fri, 15 Feb 2008 13:58:26 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger on Fri, 15 Feb 2008 15:23:14 GMT]]></title><description><![CDATA[<p>Was beist sich da? Nix. Wenn sich da was groß beißen würde, gäbe es keine dazu passende Funktionen im Standard ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456588</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Fri, 15 Feb 2008 15:23:14 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger on Fri, 15 Feb 2008 15:45:26 GMT]]></title><description><![CDATA[<p>Ich würds in etwa wie folgt machen:</p>
<ol>
<li>Schreib eine Basisklasse für alle ausführbaren Befehle</li>
</ol>
<pre><code class="language-cpp">struct Executable {
  virtual void Execute() = 0;
  virtual std::istream&amp; GetParams(std::istream&amp;) = 0;
};

std::istream&amp; operator&gt;&gt;(std::istream&amp; is, Executable&amp; ex) 
{
  return ex.GetParams(is);
}
</code></pre>
<ol start="2">
<li>Schreib für jeden Befehl eine Abgeleitete Klasse, die die nötigen Parameter selbst aus einem String oder einem Stream holen kann.</li>
</ol>
<pre><code class="language-cpp">class Befehl1 : public Executable {
  int i_;
  std::string str_;
  float flt_;
public:
  void Execute() {/*...*/}
  std::istream&amp; GetParams(std::istream&amp; is) 
  {
    is &gt;&gt; i_ &gt;&gt; str_ &gt;&gt; flt; return is;
  }   
};
</code></pre>
<ol start="3">
<li>Schreib zu den Klassen jeweils eine simple Erzeugerfunktion</li>
</ol>
<pre><code class="language-cpp">Executable* makeBefehl1()
{ return new Befehl1; }
</code></pre>
<ol start="4">
<li>Schmeiß die Erzeugerfunktionen in eine map</li>
</ol>
<pre><code class="language-cpp">typedef Executable* (ExMaker*)();
std::map&lt;std::string, ExMaker&gt; makerMap; 

makerMap[&quot;Befehl1&quot;] = &amp;makeBefehl1;
</code></pre>
<ol start="5">
<li>Für den Zeileninterpreter geht dann folgendes:</li>
</ol>
<pre><code class="language-cpp">int main()
{
  std::ifstream scriptfile(&quot;script.txt&quot;);
  std::string befehlsname;
  while(scriptfile &gt;&gt; befehlsname) {
    ExMaker maker = makerMap[befehlsname];
    std::auto_ptr&lt;Executable&gt; pex(maker());
    scriptfile &gt;&gt; *pex; //oder pex-&gt;GetParams(scriptfile);
    pex-&gt;Execute();
  }
}
</code></pre>
<p>Der Code sucht sich die richtige Makerfunktion raus, die dir ein Befehlsobjekt des richtigen Typs erzeugt. Das Objekt besorgt sich dann die nachfolgenden Parameter aus dem Stream (es weiß ja selbst genau wie viele es braucht) und wird danach ausgeführt.</p>
<p>Das alles ist nur als Skizze zu sehen, natürlich würde man die makerMap nicht als globlaes Objekt anlegen, Fehler werden auch nicht abgefangen usw.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456609</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 15 Feb 2008 15:45:26 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger on Fri, 15 Feb 2008 16:34:01 GMT]]></title><description><![CDATA[<p>Hey,<br />
danke für die ausführliche Antwort. Ich glaub, dass mir das weiterhelfen wird.</p>
<p>Gruß<br />
jokl</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456654</guid><dc:creator><![CDATA[JoKl]]></dc:creator><pubDate>Fri, 15 Feb 2008 16:34:01 GMT</pubDate></item></channel></rss>