<?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[callback mit zusätzlichem parameter]]></title><description><![CDATA[<p>Hi,</p>
<p>meine C++ kenntnisse sind begrenzt, deshalb schonmal sorry falls die frage dumm gestellt ist.</p>
<p>ich möchte eine funktion aus einer bibliothek benutzen welche unter anderem eine funktion als argument übernimmt, also:<br />
void ziel(void (*func)(double x));</p>
<p>dafür muss ich also eine funtion &quot;void f(double x)&quot; schreiben, dann &quot;ziel(f);&quot; und es klappt.</p>
<p>nun möchte ich aber einen zusätzlichen parameter drin haben, also f(x,a).<br />
anschaulich möchte ich also f2(x)=f(x,a=const) und dann &quot;ziel(f2);&quot;</p>
<p>ich möchte also während der laufzeit jede menge funktionen f2(x) erzeugen indem ich f(x,a) für feste a aufrufe, und die dann an ziel übergeben.</p>
<p>wie geht das?</p>
<p>Danke schonmal !</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302934/callback-mit-zusätzlichem-parameter</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 00:51:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302934.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 May 2012 11:39:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Tue, 01 May 2012 11:39:31 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>meine C++ kenntnisse sind begrenzt, deshalb schonmal sorry falls die frage dumm gestellt ist.</p>
<p>ich möchte eine funktion aus einer bibliothek benutzen welche unter anderem eine funktion als argument übernimmt, also:<br />
void ziel(void (*func)(double x));</p>
<p>dafür muss ich also eine funtion &quot;void f(double x)&quot; schreiben, dann &quot;ziel(f);&quot; und es klappt.</p>
<p>nun möchte ich aber einen zusätzlichen parameter drin haben, also f(x,a).<br />
anschaulich möchte ich also f2(x)=f(x,a=const) und dann &quot;ziel(f2);&quot;</p>
<p>ich möchte also während der laufzeit jede menge funktionen f2(x) erzeugen indem ich f(x,a) für feste a aufrufe, und die dann an ziel übergeben.</p>
<p>wie geht das?</p>
<p>Danke schonmal !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207177</guid><dc:creator><![CDATA[PicassoYo]]></dc:creator><pubDate>Tue, 01 May 2012 11:39:31 GMT</pubDate></item><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Tue, 01 May 2012 11:48:57 GMT]]></title><description><![CDATA[<p>Geht nicht. Die Signatur Deiner Bibliotheksfunktion ist ja vorgegeben. Wäre die zB:<br />
void bibFunk(int x);<br />
könntest Du sie auch nicht einfach mit<br />
bibFunk(x, y);<br />
aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207179</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Tue, 01 May 2012 11:48:57 GMT</pubDate></item><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Tue, 01 May 2012 11:56:30 GMT]]></title><description><![CDATA[<p>Hallo. <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>
<p>Das geht so leider nicht schön. Man könnte Lambdas oder std::bind nutzen um ein Funktionsobjekt zu erzeugen, aber da die Funktionszeiger statt Templates nutzen, hilft dir das nicht. Du kannst natürlich weiterhin mit statischen Membern + Funktionen arbeiten.</p>
<pre><code class="language-cpp">struct blubb
{
  static int i = 5;
  static void func(double d)
  {
    // Mach was mit d und i
  }
};
</code></pre>
<p>Aber wie gesagt, das ist halt recht unschön. Aber wenn die Bibliothek kein vernünftiges Interface anbietet, kann man da nichts machen. Mit fällt gerade auch nicht ein, wie man das wrappen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207183</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 01 May 2012 11:56:30 GMT</pubDate></item><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Tue, 01 May 2012 11:59:50 GMT]]></title><description><![CDATA[<p>Bitte mehr Informationen. Ist die Bibliothek wirklich auf Funktionszeiger beschränkt oder hast Du da ein Wörtchen mitzureden? Es gibt da nämlich noch andere Möglichkeiten, die weniger beschränkt sind.</p>
<p>Wenn es wirklich reine Funktionszeiger sein müssen, dann klappt das nur mit integralen, zur Compile-Zeit bekannten Konstanten:</p>
<pre><code class="language-cpp">template&lt;int A&gt;
void f2(int x) {return f(x,A);}

:::

int main()
{
  ziel(f2&lt;42&gt;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2207184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207184</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 01 May 2012 11:59:50 GMT</pubDate></item><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Tue, 01 May 2012 12:26:45 GMT]]></title><description><![CDATA[<p>es geht ganz konkret um diese funktion:<br />
<a href="http://www.alglib.net/translator/man/manual.cpp.html#sub_autogkintegrate" rel="nofollow">http://www.alglib.net/translator/man/manual.cpp.html#sub_autogkintegrate</a></p>
<p>und wenn ich schon so konkret werde, dann gleich richtig:</p>
<pre><code class="language-cpp">class FE{
public:
  void func(double&amp; y, double x, int n);

//wie schreibe ich diese Funktion und wo?
  void func_helper(double x, double xminusa, double bminusx, double &amp;y, void *ptr);

  void integrateFunc();
};

void FE::func(double&amp; y, double x, int n){
  y = n*x;
}

void FE::func_helper(double x, double xminusa, double bminusx, double &amp;y, void *ptr){
  func(y,x,n);
}

void FE::integrateFunc(){
  double a = -1.0;
  double b = 1.0;
  alglib::autogkstate s;
  double v;
  alglib::autogkreport rep;

  int n=3; //dieses n muss er beim aufruf von func_helper noch kennen ! nur wie?
  alglib::autogksmooth(a, b, s);
  alglib::autogkintegrate(s, func_helper); //das hier brauch ich. das drumrum steht im example des links.
  alglib::autogkresults(s, v, rep);
}
</code></pre>
<p>jetzt möchte ich es schaffen für viele n die funktion aufzurufen. idealerweise ohne irgendwelche funktionen zu schreiben die außerhalb der klasse sitzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207198</guid><dc:creator><![CDATA[PicassoYo]]></dc:creator><pubDate>Tue, 01 May 2012 12:26:45 GMT</pubDate></item><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Tue, 01 May 2012 15:53:31 GMT]]></title><description><![CDATA[<p>Du hast hier anfangs etwas sehr interessantes verschwiegen ... nämlich, dass die Bibliothek nicht so</p>
<pre><code class="language-cpp">void ziel(void (*func)(double x));
</code></pre>
<p>sondern so</p>
<pre><code class="language-cpp">void ziel(void (*func)(double x, void*),void*);
</code></pre>
<p>gestrickt ist. Das heißt, Du hast die Möglichkeit eigene Daten über diesen void*-Zeiger an die Funktion zu geben. Das ist typisch für solche Callback-Schnittstellen in C. In modernem C++ hätte man das wahrscheinlich eleganter über Templates oder so etwas wie std::function&lt;&gt; erledigt.</p>
<p>Außerdem scheint Dir nicht klar zu sein, dass Elementfunktionen mit solchen Funktionszeigern inkompatibel sind. Um Elementfunktionen aufrufen zu können, brauchst Du natürlich auch ein passendes Objekt dazu. Woher soll die Bibliothek ein passendes Objekt hernehmen?</p>
<p>Hier ist mal ein Tipp, der dir auf die Sprünge helfen sollte:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void altmodische_schnittstelle(int (*func)(int,void*), void* user_data)
{
  for (int i=0; i&lt;10; ++i) {
    std::cout &lt;&lt; func(i,user_data) &lt;&lt; '\n';
  }
}

int multipliziere(int a, int b)
{
  return a*b;
}

struct meine_daten
{
  int faktor;
};

int meine_funktion(int x, void* daten)
{
  meine_daten &amp; md = *static_cast&lt;meine_daten*&gt;(daten);
  return multipliziere(x,md.faktor);
}

int main()
{
  meine_daten md = {11};
  altmodische_schnittstelle(meine_funktion,&amp;md);
}
</code></pre>
<p>In &quot;modern&quot; kann das Ganze aber so aussehen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;functional&gt;

void neumodische_schnittstelle(std::function&lt;int(int)&gt; func)
{
  for (int i=0; i&lt;10; ++i) {
    std::cout &lt;&lt; func(i) &lt;&lt; '\n';
  }
}

int multipliziere(int a, int b)
{
  return a*b;
}

int main()
{
  using namespace std::placeholders;
  int n = 11;
  altmodische_schnittstelle(std::bind(multipliziere,_1,n));
}
</code></pre>
<p>wahlweise auch mit einer Lambdafunktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207266</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 01 May 2012 15:53:31 GMT</pubDate></item><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Tue, 01 May 2012 15:53:13 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>In &quot;modern&quot; kann das Ganze aber so aussehen:</p>
</blockquote>
<p>Oder mit einem Template, was wesentlich effizienter sein dürfte, wenn die Funktion sehr oft aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207267</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 01 May 2012 15:53:13 GMT</pubDate></item><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Tue, 01 May 2012 15:55:04 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Oder mit einem Template, was wesentlich effizienter sein dürfte, wenn die Funktion sehr oft aufgerufen wird.</p>
</blockquote>
<p>Das erwähnte ich bereits weiter oben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207269</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 01 May 2012 15:55:04 GMT</pubDate></item><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Tue, 01 May 2012 15:59:28 GMT]]></title><description><![CDATA[<p>Äh.. stimmt. Aber ein kleines Beispiel hätte doch nicht weh getan: <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>
<pre><code class="language-cpp">template &lt;typename F&gt;
void neumodische_schnittstelle(F func)
{
  for (int i=0; i&lt;10; ++i) {
    std::cout &lt;&lt; func(i) &lt;&lt; '\n';
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2207271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207271</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 01 May 2012 15:59:28 GMT</pubDate></item><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Tue, 01 May 2012 18:54:53 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Hier ist mal ein Tipp, der dir auf die Sprünge helfen sollte:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void altmodische_schnittstelle(int (*func)(int,void*), void* user_data)
{
  for (int i=0; i&lt;10; ++i) {
    std::cout &lt;&lt; func(i,user_data) &lt;&lt; '\n';
  }
}

int multipliziere(int a, int b)
{
  return a*b;
}

struct meine_daten
{
  int faktor;
};

int meine_funktion(int x, void* daten)
{
  meine_daten &amp; md = *static_cast&lt;meine_daten*&gt;(daten);
  return multipliziere(x,md.faktor);
}

int main()
{
  meine_daten md = {11};
  altmodische_schnittstelle(meine_funktion,&amp;md);
}
</code></pre>
</blockquote>
<p>danke das ist schonmal sehr gut.<br />
es gibt allerdings noch das problem dass das ganze innerhalb einer klasse passiert. also</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void altmodische_schnittstelle(int (*func)(int,void*), void* user_data)
{
  for (int i=0; i&lt;10; ++i) {
    std::cout &lt;&lt; func(i,user_data) &lt;&lt; '\n';
  }
}

class FE{
 public:
  int multipliziere(int a, int b)
  {
    return a*b;
  }

  struct meine_daten
  {
    int faktor;
  };

  int meine_funktion(int x, void* daten)
  {
    meine_daten &amp; md = *static_cast&lt;meine_daten*&gt;(daten);
    return multipliziere(x,md.faktor);
  }

  void zweite_funktion()
  {
    meine_daten md = {11};
	altmodische_schnittstelle(&amp;FE::meine_funktion,&amp;md);
  }
};
int main()
{
  FE blue;
  blue.zweite_funktion();
}
</code></pre>
<p>der fehler ist &quot;error C2664: 'altmodische_schnittstelle': Konvertierung des Parameters 1 von 'int (__thiscall FE::* )(int,void *)' in 'int (__cdecl *)(int,void *)' nicht möglich&quot;</p>
<p>google sagte mir dass ich das problem nicht innerhalb der klasse gelöst kriege, also eine funktion ausserhalb der klasse nutzen muss und da dann reinterpret_cast.</p>
<p>ich würde aber sehr ungern die klasse nach außen öffnen.</p>
<p>was kann ich tun damit es trotzdem klappt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207341</guid><dc:creator><![CDATA[PicassoYo]]></dc:creator><pubDate>Tue, 01 May 2012 18:54:53 GMT</pubDate></item><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Tue, 01 May 2012 19:02:16 GMT]]></title><description><![CDATA[<p>Nimm eine statische Funktion und pack den this pointer mit in die Userdaten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207346</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 01 May 2012 19:02:16 GMT</pubDate></item><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Wed, 02 May 2012 09:42:36 GMT]]></title><description><![CDATA[<blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void altmodische_schnittstelle(int (*func)(int,void*), void* user_data)
{
  for (int i=0; i&lt;10; ++i) {
    std::cout &lt;&lt; func(i,user_data) &lt;&lt; '\n';
  }
}

class FE{
 public:
  int multipliziere(int a, int b)
  {
    return a*b;
  }

  struct meine_daten
  {
    int faktor;
  };

  int meine_funktion(int x, void* daten)
  {
    meine_daten &amp; md = *static_cast&lt;meine_daten*&gt;(daten);
    return multipliziere(x,md.faktor);
  }

  void zweite_funktion()
  {
    meine_daten md = {11};
	altmodische_schnittstelle(&amp;FE::meine_funktion,&amp;md);
  }
};

int main()
{
  FE blue;
  blue.zweite_funktion();
}
</code></pre>
</blockquote>
<p>Das Beispiel ist &quot;innerhalb der Klasse&quot; schon recht sinnfrei. Du hast da nirgends irgendwelche Datenelemente, die genutzt werden können. Wie gesagt, Dir ist auch der Unterschied zwischen einer nicht-statischen Elementfunktion und einer freien Funktion nicht klar.</p>
<p>Das hier ist wohl eher Deine Situation inklusive Lösung:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void altmodische_schnittstelle(int (*func)(int,void*), void* user_data)
{
  for (int i=0; i&lt;10; ++i) {
    std::cout &lt;&lt; func(i,user_data) &lt;&lt; '\n';
  }
}

class DeineKlasse
{
  int dies;
  int unddas;
public:
  :::
  int nicht_statische_funktion(int x, int y) const;
};

int DeineKlasse::nicht_statische_funktion(int x, int y) const;
{
  return dies*x + unddas*y;
}

struct kontext
{
  DeineKlasse* objekt_zeiger;
  int y;
};

int freie_funktion(int x, void* userdata)
{
  kontext&amp; k = *static_cast&lt;kontext*&gt;(userdata);
  return k.objekt_zeiger-&gt;nicht_statische_funktion(x,k.y);
}

int main()
{
  DeineKlasse deinObjekt :::
  :::
  kontext k = {&amp;deinObjekt,11};
  altmodische_schnittstelle(freie_funktion,&amp;k);
}
</code></pre>
<p>Und weil's in &quot;modern&quot; so schön ist, hier nochmal eine zumindest oberflächlich Funktionstemplate-freie aber typsichere und ohne void* auskommende Version:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;functional&gt;

void neumodische_schnittstelle(std::function&lt;int(int)&gt; func)
{
  for (int i=0; i&lt;10; ++i) {
    std::cout &lt;&lt; func(i) &lt;&lt; '\n';
  }
}

class DeineKlasse
{
  int dies;
  int unddas;
public:
  :::
  int nicht_statische_funktion(int x, int y) const;
};

int DeineKlasse::nicht_statische_funktion(int x, int y) const;
{
  return dies*x + unddas*y;
}

int main()
{
  using namespace std::placeholders;
  DeineKlasse deinObjekt :::
  :::
  neumodische_schnittstelle(
    std::bind(&amp;DeineKlasse::nicht_statische_funktion, // welche Funktion?
              &amp;deinObjekt, // auf welchem Objekt soll die Funktion aufgerufen werden?
              _1, // Platzhalter, Wert für x kommt aus der Bibliothek
              11) // die Konstante für y, die Du vorgeben willst
  );
}
</code></pre>
<p>Alternativer Aufruf per Lambda-Ausdruck (IMHO zu bevorzugen):</p>
<pre><code class="language-cpp">neumodische_schnittstelle([&amp;](int x){
    return deinObjekt.nicht_statische_funktion(x,11);  
  });
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2207470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207470</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 02 May 2012 09:42:36 GMT</pubDate></item><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Wed, 02 May 2012 09:31:40 GMT]]></title><description><![CDATA[<p>eine loesung mit struct und einer static function wollte ich gerade hier posten, da sehe ich ihr habt das auch schon vorgeschlagen <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>
<p>vielen dank, ihr habt mir sehr geholfen !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2207473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207473</guid><dc:creator><![CDATA[PicassoYo]]></dc:creator><pubDate>Wed, 02 May 2012 09:31:40 GMT</pubDate></item><item><title><![CDATA[Reply to callback mit zusätzlichem parameter on Wed, 02 May 2012 14:26:25 GMT]]></title><description><![CDATA[<p><strong>PicassoYo,</strong> noch was als Beispiel :</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 

void altmodische_schnittstelle(int (*func)(int,void*), void* user_data) 
{ 
  for (int i=0; i&lt;10; ++i) { 
    std::cout &lt;&lt; func(i,user_data) &lt;&lt; '\n'; 
  } 
} 
struct multiplikator
{
   int faktor;

   static int callback (int x, void* _this )
   {
      return x * static_cast&lt; multiplikator*&gt;(_this)-&gt;faktor;
   }
};

int main() 
{ 
  multiplikator  m = { 11 };

  altmodische_schnittstelle (multiplikator::callback, &amp;m);

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2207615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2207615</guid><dc:creator><![CDATA[me_s]]></dc:creator><pubDate>Wed, 02 May 2012 14:26:25 GMT</pubDate></item></channel></rss>