<?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[Funktion casten!]]></title><description><![CDATA[<p>Heyho,</p>
<p>ich schlage mich gerade mit einer API herum. Diese ist in C geschrieben, Einbindung der Funktionen etc. läuft aber schon korrekt.</p>
<p>ich will eine Funktion nutzen, die in einem Header wie folgt definiert ist:</p>
<pre><code class="language-cpp">PUBLIC  tBool apSetMotIntervalFunc PROTO((IN tIntFunc interval_func ));
</code></pre>
<p>sie erwartet also als Parameter eine <strong>'tIntFunc'</strong>.</p>
<p>in einem anderen Header:</p>
<pre><code class="language-cpp">typedef int (*tIntFunc)();
</code></pre>
<p>wenn ich das richtig verstehe, dann definiert dies einen Pointer, der <strong>tIntFunc</strong> heisst, auf eine Funktion, die keine Parameter bekommt, und einen int als Rückgabewert hat, oder?!</p>
<p>ich habe nun ewig viel versucht, aber ich bekomme es nicht hin!</p>
<p>Meineklasse:</p>
<pre><code class="language-cpp">void Klasse::setzeIntervalFunktion(){
//(...)
	tIntFunc intfunc;
	intfunc = (tIntFunc)IntervalFunction();

	if(!apSetMotIntervalFunc( intfunc )){
		return false;
	}
//(...)
}

int Klasse::IntervalFunction{
  // Funktionsinhalt
}
</code></pre>
<p>dies ist die einzige variante, an der der compiler überhaupt durchgeht, aber nur mit einer warnung:</p>
<pre><code>warning C4312: 'type cast' : conversion from 'int' to 'tIntFunc' of greater size
</code></pre>
<p>wie sich zeigt, warnt er zu Recht, denn wenn ich nun starte, schmiert mein Programm genau an dieser Stelle ab.</p>
<p>Was muss ich machen, um das zum laufen zu kriegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/142207/funktion-casten</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 14:51:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/142207.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Mar 2006 17:02:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktion casten! on Tue, 28 Mar 2006 17:04:20 GMT]]></title><description><![CDATA[<p>Heyho,</p>
<p>ich schlage mich gerade mit einer API herum. Diese ist in C geschrieben, Einbindung der Funktionen etc. läuft aber schon korrekt.</p>
<p>ich will eine Funktion nutzen, die in einem Header wie folgt definiert ist:</p>
<pre><code class="language-cpp">PUBLIC  tBool apSetMotIntervalFunc PROTO((IN tIntFunc interval_func ));
</code></pre>
<p>sie erwartet also als Parameter eine <strong>'tIntFunc'</strong>.</p>
<p>in einem anderen Header:</p>
<pre><code class="language-cpp">typedef int (*tIntFunc)();
</code></pre>
<p>wenn ich das richtig verstehe, dann definiert dies einen Pointer, der <strong>tIntFunc</strong> heisst, auf eine Funktion, die keine Parameter bekommt, und einen int als Rückgabewert hat, oder?!</p>
<p>ich habe nun ewig viel versucht, aber ich bekomme es nicht hin!</p>
<p>Meineklasse:</p>
<pre><code class="language-cpp">void Klasse::setzeIntervalFunktion(){
//(...)
	tIntFunc intfunc;
	intfunc = (tIntFunc)IntervalFunction();

	if(!apSetMotIntervalFunc( intfunc )){
		return false;
	}
//(...)
}

int Klasse::IntervalFunction{
  // Funktionsinhalt
}
</code></pre>
<p>dies ist die einzige variante, an der der compiler überhaupt durchgeht, aber nur mit einer warnung:</p>
<pre><code>warning C4312: 'type cast' : conversion from 'int' to 'tIntFunc' of greater size
</code></pre>
<p>wie sich zeigt, warnt er zu Recht, denn wenn ich nun starte, schmiert mein Programm genau an dieser Stelle ab.</p>
<p>Was muss ich machen, um das zum laufen zu kriegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1025723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1025723</guid><dc:creator><![CDATA[DrOetker]]></dc:creator><pubDate>Tue, 28 Mar 2006 17:04:20 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion casten! on Tue, 28 Mar 2006 17:13:29 GMT]]></title><description><![CDATA[<p>Du möchtest die Funktion auch nicht aufrufen, sondern ihre Adresse erhalten - dafür darfst Du die Parameterliste &quot;()&quot; nicht aufführen bei der Zuweisung.</p>
<p>Aber dazu kommt, ich gehe mal davon aus IntervalFunction ist keine Funktion, sondern eine Methode, richtig? Dann ist nämlich der Typ der Funktion nicht int(<em>)() sondern int(Klasse::</em>)(), also nicht kompatibel zu dem was apSetMotIntervalfunc erwartet.</p>
<pre><code class="language-cpp">extern &quot;C&quot;
int IntervalFunction();

void Klasse::setzeIntervalFunktion(){
//(...)
    tIntFunc intfunc;
    intfunc = (tIntFunc)IntervalFunction;

    if(!apSetMotIntervalFunc( intfunc )){
        return false;
    }
//(...)
}

extern &quot;C&quot;
int IntervalFunction(){
  // Funktionsinhalt
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1025730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1025730</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 28 Mar 2006 17:13:29 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion casten! on Tue, 28 Mar 2006 17:23:05 GMT]]></title><description><![CDATA[<p>das wäre aber schlecht, da ich meine klassenmember in der intervalfunktion benötige...</p>
<p>aber da ist noch etwas anderes im Argen, nun meldet der Compiler:</p>
<pre><code>error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'tIntFunc'
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1025738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1025738</guid><dc:creator><![CDATA[DrOetker]]></dc:creator><pubDate>Tue, 28 Mar 2006 17:23:05 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion casten! on Tue, 28 Mar 2006 17:26:39 GMT]]></title><description><![CDATA[<p>So ist das Leben <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>Wenn immer nur ein Callback zugleich aktiv ist kannst (bzw. musst) Du Dir das Objekt irgendwie in den Callback passen, z.B. über eine globale Variable oder über eine statische Variable + friend-Beziehung. &quot;Schöne&quot; Callback-APIs bieten meist an einen void-Zeiger mit zu übergeben, da könnte man auf diesem Wege das Objekt transportieren (aber die Callback-Funktion selbst wär immernoch static).</p>
<p>EDIT: Zu dem Compilerfehler: Vergessen IntervalFunction in der Klassenbeschreibung zu entfernen? Sonst gibt es die zweimal und die innerhalb der Klasse har Vorrang gegenüber der globalen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1025743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1025743</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 28 Mar 2006 17:26:39 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion casten! on Tue, 28 Mar 2006 18:02:35 GMT]]></title><description><![CDATA[<p>Ich habe vorhin noch etwas an der Objektstruktur modifiziert, und eine relativ einfache Möglichkeit gefunden, um die Klassenmember zu verwenden, da ich eh ein statisches Element für eine andere Datenhaltung verwende. Auf dem Umweg darüber benutze ich sie (es handelt sich eh nur im Werte, int und strings).</p>
<p>Ich denke, mit deiner Vermutung hast Du Recht. War eben wohl schon zu genervt! Werde ich morgen gleich ausprobieren, vielen Dank für Deine schnelle Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1025771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1025771</guid><dc:creator><![CDATA[DrOetker]]></dc:creator><pubDate>Tue, 28 Mar 2006 18:02:35 GMT</pubDate></item></channel></rss>