<?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[problem mit funktionszeiger]]></title><description><![CDATA[<p>hallo zusammen,</p>
<p>ich arbeite gerade an meinem ersten größeren c++-projekt und könnte hier etwas hilfe gebrauchen. und zwar möchte ich einer funktion eine andere memberfunktion als parameter übergeben.<br />
hier erstmal der code:</p>
<pre><code class="language-cpp">float quad2d::gauss2d(float (*func)(float x, float y))
{
	nrfunc=func;
	return gauss(f1);
}

float quad2d::f1(float x)
{
	xsav=x;
	return gauss(&amp;quad2d::f2);
}

float quad2d::f2(float y)
{
	return (*nrfunc)(xsav,y);
}
</code></pre>
<pre><code class="language-cpp">class quad2d : public quad {
public:
	...
private:
	...
	float xsav;
	float (*nrfunc)(float,float);
	float f1(float), f2(float);
};
</code></pre>
<pre><code class="language-cpp">class quad {
public:
	float gauss (float (*)(float));
protected:
	...
};
</code></pre>
<p>das problem liegt beim aufrauf der gauss()-funktion. ich hab nu auf verschiedene arten versucht die funktion zu übergeben, zwei hab ich hier mal angegeben. ich bekomme dabei immer fehlermeldungen in der art:</p>
<blockquote>
<p>error C2664: 'quad::gauss': Konvertierung des Parameters 1 von 'float (__thiscall quad2d::* )(float)' in 'float (__cdecl *)(float)' nicht möglich<br />
1&gt; Es gibt keinen Kontext, in dem diese Konvertierung möglich ist</p>
</blockquote>
<p>ich hab doch nun eigentlich jeweils einen funktionszeiger mir float-parameter und float-rückgabe. der einzige unterschied ist cdecl und thiscall, von denen ich nicht wirklich verstanden habe was sie bedeuten.<br />
wenn jmd hinweise zur aufklärung dieses falles hat, und dabei auch gleich etwas zu meinem verständnis zu objektorientierter programmierung beitragen könnte, wäre ich dafür sehr dankbar. <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>gruß christian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/183487/problem-mit-funktionszeiger</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 07:44:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183487.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 05 Jun 2007 13:01:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to problem mit funktionszeiger on Tue, 05 Jun 2007 13:01:15 GMT]]></title><description><![CDATA[<p>hallo zusammen,</p>
<p>ich arbeite gerade an meinem ersten größeren c++-projekt und könnte hier etwas hilfe gebrauchen. und zwar möchte ich einer funktion eine andere memberfunktion als parameter übergeben.<br />
hier erstmal der code:</p>
<pre><code class="language-cpp">float quad2d::gauss2d(float (*func)(float x, float y))
{
	nrfunc=func;
	return gauss(f1);
}

float quad2d::f1(float x)
{
	xsav=x;
	return gauss(&amp;quad2d::f2);
}

float quad2d::f2(float y)
{
	return (*nrfunc)(xsav,y);
}
</code></pre>
<pre><code class="language-cpp">class quad2d : public quad {
public:
	...
private:
	...
	float xsav;
	float (*nrfunc)(float,float);
	float f1(float), f2(float);
};
</code></pre>
<pre><code class="language-cpp">class quad {
public:
	float gauss (float (*)(float));
protected:
	...
};
</code></pre>
<p>das problem liegt beim aufrauf der gauss()-funktion. ich hab nu auf verschiedene arten versucht die funktion zu übergeben, zwei hab ich hier mal angegeben. ich bekomme dabei immer fehlermeldungen in der art:</p>
<blockquote>
<p>error C2664: 'quad::gauss': Konvertierung des Parameters 1 von 'float (__thiscall quad2d::* )(float)' in 'float (__cdecl *)(float)' nicht möglich<br />
1&gt; Es gibt keinen Kontext, in dem diese Konvertierung möglich ist</p>
</blockquote>
<p>ich hab doch nun eigentlich jeweils einen funktionszeiger mir float-parameter und float-rückgabe. der einzige unterschied ist cdecl und thiscall, von denen ich nicht wirklich verstanden habe was sie bedeuten.<br />
wenn jmd hinweise zur aufklärung dieses falles hat, und dabei auch gleich etwas zu meinem verständnis zu objektorientierter programmierung beitragen könnte, wäre ich dafür sehr dankbar. <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>gruß christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299291</guid><dc:creator><![CDATA[djang0]]></dc:creator><pubDate>Tue, 05 Jun 2007 13:01:15 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit funktionszeiger on Tue, 05 Jun 2007 13:16:57 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ohne mir das genau angesehen zu haben: Weißt Du, dass Memberfunktionspointer etwas anderes sind als &quot;reine&quot; Funktionspointer (nicht kompatibel) ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299310</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 05 Jun 2007 13:16:57 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit funktionszeiger on Tue, 05 Jun 2007 13:22:29 GMT]]></title><description><![CDATA[<p>ja sowas ähnliches hab ich befürchtet. gibt es denn keine möglichkeit den zeiger zu konvertieren oder muss ich dann die aufrufende (gauss) funktion ändern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299316</guid><dc:creator><![CDATA[djang0]]></dc:creator><pubDate>Tue, 05 Jun 2007 13:22:29 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit funktionszeiger on Tue, 05 Jun 2007 13:43:18 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Du kannst eine Wrapperfunktion drumrumstricken, aber insgesamt scheint mir, Du könntest virtual functions besser brauchen...<br />
Wer übergibt eigentlich Deinem quad-Objekt den Aufrufparameter ? Kannst Du mir mal den Aufruf zeigen ?</p>
<p>Nur mal so ins Grobe geschrieben:</p>
<pre><code class="language-cpp">class quad {
public:
    float gauss (float);
protected:
    virtual float f1(float) { // irgenwas quad-maessiges tun 
    }
    virtual float f2(float) { // irgenwas quad-maessiges tun 
    }
};

float quad::gauss (float f) {
   // do something
   f1(f);
   // do something
   return f2(f);
}

class quad2d : public quad {
protected:
    // überladen die quad::f1 und quad::
    float f1(float) { // irgenwas quad2d-maessiges tun 
    }
    float f2(float) { // irgenwas quad2d-maessiges tun 
    }
};

int main() {
   quad q;
   q.gauss(1.2); // macht quadmaeßiges

   quad2d q2;
   q2.gauss(2.3); // macht quad2dmaeßiges
   return 0;
}
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299321</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 05 Jun 2007 13:43:18 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit funktionszeiger on Tue, 05 Jun 2007 13:49:23 GMT]]></title><description><![CDATA[<p>hmm also wenn die Memberfunktionszeiger nur innerhalb deiner Klasse genutzt werden ... und die Memberfunktion in dieser Klasse ist ... also du bsw. eine Basisklasse hast mit einem std::vector voll Memberfunktion, die in einer bestimmten Situation aufgerufen werden sollen, und du davon dann eine Klasse ableitest und dem vector neue Funktionen der abgeleiteten Klasse hinzufügst ... geht das ... mitm this-Zeiger ... sonnst musst du einfach immer einen Zeiger auf ein Objekt der entsprechenden Klasse mitgeben ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299333</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 05 Jun 2007 13:49:23 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit funktionszeiger on Tue, 05 Jun 2007 13:55:31 GMT]]></title><description><![CDATA[<p>danke, dann werd ich mir die virtual-functions nochmal genauer angucken.<br />
ich weiß nicht ganz was du mit den aufrufparametern meinst. das objekt soll ne numerische integration durchführen. die grenzen übergeb ich über den konstruktor und die zu integrierende funktion eben über den zeiger. Z.B. so:</p>
<pre><code class="language-cpp">float funktion (float x){ return x; }

int main ()
{
	float a=0, b=1, result;
	int n=10;
	quad integrand(a,b,n);

	result=integrand.gauss(funktion);

	cout &lt;&lt; result;

	return 0;
}
</code></pre>
<p>das original für die funktion hab ich in c-code vorliegen und da klappt es auch, hab ich schon probiert. ich wollts nun nur nochmal zu übungszwecken und der vollständigkeit halber in c++ übersetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299341</guid><dc:creator><![CDATA[djang0]]></dc:creator><pubDate>Tue, 05 Jun 2007 13:55:31 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit funktionszeiger on Tue, 05 Jun 2007 14:17:29 GMT]]></title><description><![CDATA[<p>ich kapier nicht ganz was du willst. was du in deinem beispielcode jetzt gezeigt hast sind normale Funktionszeiger. =&gt; typedef float (*fnGauss)(const float);</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299356</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 05 Jun 2007 14:17:29 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit funktionszeiger on Tue, 05 Jun 2007 14:28:20 GMT]]></title><description><![CDATA[<p>Ah !!</p>
<p>OK, jetzt weiß ich, worum es Dir geht !<br />
Du gibst von außen eine (Art Callback-)Funktion mit, die von quad genutzt werden soll.<br />
Braucht quad2d nun 2 Funktionen von außen und Du hofftest, mit dem Erben von quad auf Wiederverwendung ? Das scheint mir nicht besonders glücklich, weil offensichtlich für quad2d auch nicht gauss(), sondern gauss2d() aufgerufen werden sollen.</p>
<p>Brauchen quad(2d) überhaupt einen eigenen Status ? Mir scheint das ganze Gebiet eher wenig für einen OO-Umsetzung geeignet und denke, dass Deine bisherige Version gar nicht so schlecht ist. Aber Du könntest mit Funktionsoverloading arbeiten (wenn Du ein C++-Feature dabeihaben willst):</p>
<pre><code class="language-cpp">float gauss(float, float, int, float (*func)(float x)) { // 1-D-Implementierung }
float gauss(float, float, int, float (*func)(float x, float y))  { // 2-D-Implementierung }

float funktion(float x){ return x; }
float funktion2d(float x, float y ){ return x*y; }

int main ()
{
	float a=0, b=1, result;
	int n=10;

	result=gauss(a,b,n, funktion); // ruft 1-D-Variante auf
	result=gauss(a,b,n, funktion2d); // ruft 2-D-Variante auf

	cout &lt;&lt; result;

	return 0;
}
</code></pre>
<p>Ein wenig &quot;Eye-Candy&quot; kannst Du sonst noch über operator-Overloading einbauen:</p>
<pre><code class="language-cpp">struct gauss {
   float operator()(float, float, int, float (*func)(float x)) { // 1-D-Implementierung }
   float operator()(float, float, int, float (*func)(float x, float y))  { // 2-D-Implementierung }
};

float funktion(float x){ cout &lt;&lt; &quot;funktion\n&quot;; return x; }
float funktion2d(float x, float y ){ cout &lt;&lt; &quot;funktion2d\n&quot;; return x+y; }

int main (int argc, char **argv)
{
    float a=0, b=1, result;
    int n=10;
    gauss g;

    result=g(a,b,n, funktion); // ruft 1-D-Variante auf
    cout &lt;&lt; result &lt;&lt; &quot;\n&quot;;
    result=g(a,b,n, funktion2d); // ruft 2-D-Variante auf

    cout &lt;&lt; result &lt;&lt; &quot;\n&quot;;
    return 0;
}
</code></pre>
<p>... aber wirklich weiter bringt es auch nicht (sieht aber ganz lustig aus und ist &quot;... echt C++ig, Mann !&quot; :D).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299358</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 05 Jun 2007 14:28:20 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit funktionszeiger on Tue, 05 Jun 2007 14:31:25 GMT]]></title><description><![CDATA[<p>boost::function<br />
boost::bind</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299367</guid><dc:creator><![CDATA[Helium]]></dc:creator><pubDate>Tue, 05 Jun 2007 14:31:25 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit funktionszeiger on Tue, 05 Jun 2007 15:14:31 GMT]]></title><description><![CDATA[<p>joa mein ziel war halt das ganze möglichst c++ig zu machen <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="😃"
    /> . da muss natürlich auch vererbung mit rein, egal obs sinn macht oder nicht. aber man kann sichs wohl auch selber schwer machen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
ich habs nun einfach erstmal so gelöst, dass ich die rekursiven funktionsaufrufe mit den problematischen memberzeigern (auf f1 und f2) durch ne for-schleife ersetzt habe. klappt genauso gut, auch wenns nicht ganz so toll aussieht.<br />
trotzdem danke für die hilfe, hat mich wieder etwas tiefer in die OOP (bzw deren sinnvolle nutzung <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="😉"
    /> ) gebracht.</p>
<p>gruß christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299404</guid><dc:creator><![CDATA[djang0]]></dc:creator><pubDate>Tue, 05 Jun 2007 15:14:31 GMT</pubDate></item><item><title><![CDATA[Reply to problem mit funktionszeiger on Tue, 05 Jun 2007 22:59:16 GMT]]></title><description><![CDATA[<p>djang0 schrieb:</p>
<blockquote>
<p>...hat mich wieder etwas tiefer in die OOP ...gebracht.</p>
<p>gruß christian</p>
</blockquote>
<p>Naja, wohl eher nicht. <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 />
In C++ kann man eben nicht nur OO programmieren, sondern hat auch einiges in der Hand zum generischen Programmieren - und das ist bisweilen wichtiger/übersichtlicher/besser geeignet für das jeweilige Problem.<br />
Wenn Du OOP ausprobieren willst, solltest Du Dir auch eine Aufgabe suchen, die diesen Einsatz anbietet.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299665</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 05 Jun 2007 22:59:16 GMT</pubDate></item></channel></rss>