<?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[Funktionspointer casten]]></title><description><![CDATA[<p>Hallo,</p>
<p>ist das casten eines statischen Memberfunktionspointers oder eines Funktionspointers einer freien Funktion in Richtung uintXX_t und wieder in den Orginaltyp zurück Standardkonform?</p>
<p>In C++ sowas hier</p>
<pre><code class="language-cpp">#include &quot;stdint.h&quot;

void f(){}

typedef void (*fnc)();

int main(int argc, char **argv){
    uint32_t add=(uint32_t)&amp;f;
    (*(fnc)add)();
}
</code></pre>
<p>Ich meine funktionieren tut es, aber das es erlaubt oder gültig ist, sagt es ja noch lange nicht aus.</p>
<p>Danke und Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274250/funktionspointer-casten</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 17:00:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274250.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Sep 2010 13:29:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 13:29:50 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ist das casten eines statischen Memberfunktionspointers oder eines Funktionspointers einer freien Funktion in Richtung uintXX_t und wieder in den Orginaltyp zurück Standardkonform?</p>
<p>In C++ sowas hier</p>
<pre><code class="language-cpp">#include &quot;stdint.h&quot;

void f(){}

typedef void (*fnc)();

int main(int argc, char **argv){
    uint32_t add=(uint32_t)&amp;f;
    (*(fnc)add)();
}
</code></pre>
<p>Ich meine funktionieren tut es, aber das es erlaubt oder gültig ist, sagt es ja noch lange nicht aus.</p>
<p>Danke und Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955948</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Wed, 22 Sep 2010 13:29:50 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 13:33:47 GMT]]></title><description><![CDATA[<p>Standardkonform: Klar, reinterpret_cast ist eine erlaubte Operation.<br />
Portabel: Nein. Bei mir funktioniert das zum Beispiel schon nicht mehr, weil die Pointer bei mir nicht in uint_32 passen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955950</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 22 Sep 2010 13:33:47 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 13:41:03 GMT]]></title><description><![CDATA[<p>Nein.<br />
Bei DOS gab es zum Beispiel das Speichermodell Medium, wo Funktionszeiger länger waren als Datenzeiger. Und Compact, wo es andersrum war.</p>
<p>Aber stopfe doch in einen Funktionszeiger!</p>
<pre><code class="language-cpp">#include &quot;stdint.h&quot;

void g(int);
typedef void (*g_t)(int);

typedef void (*anyfnc_t)();

int main(int argc, char **argv){
    fnc_t add=(fnc_t)&amp;g;
    (*(g_t)add)(5);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1955955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955955</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 22 Sep 2010 13:41:03 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 13:48:09 GMT]]></title><description><![CDATA[<p>Das ist meines Wissens nach erlaubt, sofern der Zieltyp &quot;groß genug&quot; ist. Also, es könnte sein, dass auf einem System der Typ uint32_t nicht groß genug zum Speichern einer Adresse Objekt/Funktions-Adresse ist. In dem Fall sollte ein Compiler eine Fehlermeldung ausspucken. Ich weiß allerdings nicht, ob das mit der Fehlermeldung garantiert wird oder ob das Programm dann einfach nicht mehr funktioniert. Der GCC meckert dann jedenfalls.</p>
<p>Ein solcher Cast ist äquivalent zu <code>reinterpret_cast&lt;uint32_t&gt;(&amp;funktion)</code> . Ich würde das auch so aufschreiben, damit deutlich wird, was für eine schmutzige Sache da passiert. <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>5.2.10 Reinterpret cast:</p>
<blockquote>
<p>...<br />
A pointer can be explicitly converted to any integral type large enough to hold it. The mapping function is implementationdefined. [ Note: it is intended to be unsurprising to those who know the addressing structure of the underlying machine. -end note ]<br />
...</p>
</blockquote>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955957</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 22 Sep 2010 13:48:09 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 13:49:27 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Bei DOS gab es zum Beispiel das Speichermodell Medium, wo Funktionszeiger länger waren als Datenzeiger. Und Compact, wo es andersrum war.</p>
</blockquote>
<p>War denn Dein DOS C++ Compiler überhaupt standardkonform? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1955961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955961</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 22 Sep 2010 13:49:27 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 13:58:34 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Bei DOS gab es zum Beispiel das Speichermodell Medium, wo Funktionszeiger länger waren als Datenzeiger. Und Compact, wo es andersrum war.</p>
</blockquote>
<p>War denn Dein DOS C++ Compiler überhaupt standardkonform? <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>
</blockquote>
<p>Logischerweise nicht.<br />
Aber rate mal, weshalb der Standard nicht garantiert, daß Datenzeiger und Funktionszeiger gleich lang sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955967</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 22 Sep 2010 13:58:34 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 14:14:14 GMT]]></title><description><![CDATA[<p>Danke schon mal für die vielen guten Antworten. Das Daten und Funktionszeiger unterschiedliche Größen haben können, ist mir bekannt. Das Beispiel mit uint32_t war halt gerade mal auf meiner Plattform so. Ich werde natürlich auf den richtigen Typen einstellen, der in der Lage ist die Daten vollständig aufzunehmen. Läßt sich ja relativ einfach mit C++Metaprogrammingmitteln herausbekommen.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955977</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Wed, 22 Sep 2010 14:14:14 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 14:21:13 GMT]]></title><description><![CDATA[<p>mysterio schrieb:</p>
<blockquote>
<p>Danke schon mal für die vielen guten Antworten. Das Daten und Funktionszeiger unterschiedliche Größen haben können, ist mir bekannt. Das Beispiel mit uint32_t war halt gerade mal auf meiner Plattform so. Ich werde natürlich auf den richtigen Typen einstellen, der in der Lage ist die Daten vollständig aufzunehmen. Läßt sich ja relativ einfach mit C++Metaprogrammingmitteln herausbekommen.<br />
Danke</p>
</blockquote>
<p>Du willst also einen int-Typ für Hashtables.<br />
Dann paßt unsigned long. Oder size_t. Oder decltype(sizeof(0)).<br />
Den Typen würde ich gar nicht berechnen, sondern per Hand festlegen und nur mit einem static_assert absichern. Der ändert sich nämlich nicht oft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955984</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 22 Sep 2010 14:21:13 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 14:23:43 GMT]]></title><description><![CDATA[<p>mysterio schrieb:</p>
<blockquote>
<p>Danke schon mal für die vielen guten Antworten. Das Daten und Funktionszeiger unterschiedliche Größen haben können, ist mir bekannt. Das Beispiel mit uint32_t war halt gerade mal auf meiner Plattform so. Ich werde natürlich auf den richtigen Typen einstellen, der in der Lage ist die Daten vollständig aufzunehmen. Läßt sich ja relativ einfach mit C++Metaprogrammingmitteln herausbekommen.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Moment! Du hast nicht nur interessehalber gefragt, sondern willst das ernsthaft benutzen? Wozu?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955986</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 22 Sep 2010 14:23:43 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 14:24:41 GMT]]></title><description><![CDATA[<p>mysterio schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>ist das casten eines statischen Memberfunktionspointers oder eines Funktionspointers einer freien Funktion in Richtung uintXX_t und wieder in den Orginaltyp zurück Standardkonform?</p>
</blockquote>
<p>Zeiger auf nicht-statische Memberfunktionen sind keine Zeiger, und eine solche Konvertierung in integrale Werte ist für sie nicht vorgesehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955987</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 22 Sep 2010 14:24:41 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 14:30:25 GMT]]></title><description><![CDATA[<p>Ja, ich möchte es benutzen und es handelt sich nur um statische Methoden sowie frei Funktionen, die sich ja pointermäßig nicht unterscheiden. Muss jetzt leider erstmal weg. Werde nachher noch mal schreiben, wo ich dies brauch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1955992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1955992</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Wed, 22 Sep 2010 14:30:25 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 17:29:45 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>mysterio schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>ist das casten eines statischen Memberfunktionspointers oder eines Funktionspointers einer freien Funktion in Richtung uintXX_t und wieder in den Orginaltyp zurück Standardkonform?</p>
</blockquote>
<p>Zeiger auf nicht-statische Memberfunktionen sind keine Zeiger, und eine solche Konvertierung in integrale Werte ist für sie nicht vorgesehen.</p>
</blockquote>
<p>Darf man Zeiger auf nicht-statische Memberfunktionen mit memcpy() rumkopieren?<br />
Falls ja könnte man sie ja relativ einfach in ein Byte Array kopieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956070</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 22 Sep 2010 17:29:45 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 17:59:12 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Darf man Zeiger auf nicht-statische Memberfunktionen mit memcpy() rumkopieren?<br />
Falls ja könnte man sie ja relativ einfach in ein Byte Array kopieren.</p>
</blockquote>
<p>Gute Frage, würde mich auch mal interessieren. Wenn ich aber so darüber nachdenke: Warum eigentlich nicht. Die Frage ist halt wie man dies dann castet, um wieder auf den richtigen Typ zurück zu kommen, obwohl mir da der union-cast-Trick einfallen würde. Habe sowas aber noch nicht/nie getestet.</p>
<p>Ich hatte ja auch versprochen, dass ich sage, wo ich den Kram brauche. Es geht in den Betriebssystemkontext und dort um Interruptvektortabellen. In dieser Tabelle sind die Einträge einfach als uint32_t definiert, ja <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> leider ist dies so. Kann ich auch nicht ändern, weil Code ist nicht von mir und auch nicht in meinem Verantwortungsbereich. Ich kann da halt nur was reinschreiben. Was dort halt stehen soll sind Sprungziele. Das ganze kommt wohl ursprünglich aus der Assemblerwelt. Diese Sprungziele sind aber ähnlich einfachen Funktionen (insbesondere solche ohne Parameter). Grundvoraussetzung ist noch, das sie keinen prolog/epilog besitzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956083</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Wed, 22 Sep 2010 17:59:12 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionspointer casten on Wed, 22 Sep 2010 20:00:33 GMT]]></title><description><![CDATA[<p>In dem Fall ist sowieso ziemlich egal was Standardkonform oder Portierbar ist.</p>
<p>Mach einfach einen reinterpret_cast auf uint32_t und guck was passiert.</p>
<blockquote>
<p>Grundvoraussetzung ist noch, das sie keinen prolog/epilog besitzen.</p>
</blockquote>
<p>Naja, die Funktionen müssen genau den Calling-Conventions oder allgemeiner den Vorgaben entsprechen, die das jeweilige OS verwendet/macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1956158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1956158</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 22 Sep 2010 20:00:33 GMT</pubDate></item></channel></rss>