<?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[boost::function::target gibt Segmentation Fault]]></title><description><![CDATA[<p>Hi,<br />
den ganzen Abend habe ich mich damit beschäftigt, einer normalen GLUT Callbackfunktion einen Funktionspointer mit vorgegebenen Parametern zu übergeben.<br />
Inzwischen bin ich mein Testcode gelandet und so weit gekommen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/function.hpp&gt;

struct obj
{
    void foo(int x) { std::cout &lt;&lt; x &lt;&lt; std::endl; }
};

void call(void (*func)())
{
    func();
}

typedef void (*func_t)();

int main(int, char**)
{
    obj x;
    boost::function&lt;void ()&gt; f = boost::bind(&amp;obj::foo, boost::ref(x), 100);
    func_t g = *f.target&lt;func_t&gt;(); // Segmentation Fault
    call(g);

    return 0;
}
</code></pre>
<p>Warum bekomm ich da einen Segmentation Fault?!</p>
<p>Grüße,<br />
Raz</p>
<p>Ach ja: Ubuntu 10.10, g++ 4.4.4, boost 1.43</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/282539/boost-function-target-gibt-segmentation-fault</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 02:49:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/282539.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 21 Feb 2011 21:32:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::function::target gibt Segmentation Fault on Mon, 21 Feb 2011 21:37:32 GMT]]></title><description><![CDATA[<p>Hi,<br />
den ganzen Abend habe ich mich damit beschäftigt, einer normalen GLUT Callbackfunktion einen Funktionspointer mit vorgegebenen Parametern zu übergeben.<br />
Inzwischen bin ich mein Testcode gelandet und so weit gekommen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/function.hpp&gt;

struct obj
{
    void foo(int x) { std::cout &lt;&lt; x &lt;&lt; std::endl; }
};

void call(void (*func)())
{
    func();
}

typedef void (*func_t)();

int main(int, char**)
{
    obj x;
    boost::function&lt;void ()&gt; f = boost::bind(&amp;obj::foo, boost::ref(x), 100);
    func_t g = *f.target&lt;func_t&gt;(); // Segmentation Fault
    call(g);

    return 0;
}
</code></pre>
<p>Warum bekomm ich da einen Segmentation Fault?!</p>
<p>Grüße,<br />
Raz</p>
<p>Ach ja: Ubuntu 10.10, g++ 4.4.4, boost 1.43</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024453</guid><dc:creator><![CDATA[Razoron]]></dc:creator><pubDate>Mon, 21 Feb 2011 21:37:32 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function::target gibt Segmentation Fault on Mon, 21 Feb 2011 21:51:20 GMT]]></title><description><![CDATA[<p>Da <code>boost::function</code> um einiges mächtiger ist als normale Funktionszeiger, kannst du erstere nicht immer in letztere umwandeln.</p>
<p>Die Memberfunktion <code>target()</code> gibt einen Nullzeiger zurück, falls der angegebene Typ nicht mit dem internen übereinstimmt. Der interne Typ ist entweder der Funktionszeiger, mit dem das <code>function</code> -Objekt initialisiert wurde, oder die Adresse des Funktionsobjekts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024459</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 21 Feb 2011 21:51:20 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function::target gibt Segmentation Fault on Tue, 22 Feb 2011 17:10:53 GMT]]></title><description><![CDATA[<p>Okay, danke für die schnelle Antwort. Du hast Recht, target gibt NULL zurück. Dann sag mir mal bitte, warum in dem Beispiel target NULL zurück gibt.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/mem_fn.hpp&gt;
#include &lt;boost/function.hpp&gt;

struct obj
{
    void foo(int x) { std::cout &lt;&lt; x &lt;&lt; std::endl; }
};

void call(void (*func)())
{
    func();
}

typedef void (*func_t)();

int main(int, char**)
{
    obj x;
    boost::function&lt;void ()&gt; f = boost::bind(boost::mem_fn(&amp;obj::foo), boost::ref(x), 100);
    if(f.target&lt;func_t&gt;() == NULL)
        std::cout &lt;&lt; &quot;NULL&quot; &lt;&lt; std::endl;

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2024865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024865</guid><dc:creator><![CDATA[Razoron]]></dc:creator><pubDate>Tue, 22 Feb 2011 17:10:53 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function::target gibt Segmentation Fault on Tue, 22 Feb 2011 17:11:54 GMT]]></title><description><![CDATA[<p>Razoron schrieb:</p>
<blockquote>
<p>Dann sag mir mal bitte, warum in dem Beispiel target NULL zurück gibt.</p>
</blockquote>
<p>Ich habe doch geschrieben, wann <code>target()</code> einen Nullzeiger zurückgibt. Der Zeigertyp auf das von <code>bind()</code> erstellte Funktionsobjekt unterscheidet sich vom Typ des Funktionszeigers.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024870</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 22 Feb 2011 17:11:54 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function::target gibt Segmentation Fault on Tue, 22 Feb 2011 17:17:03 GMT]]></title><description><![CDATA[<p>Aber der Typ vom Funktionszeiger und der vom bind zurückgegebenen sollte doch gleich sein, also:</p>
<pre><code class="language-cpp">void (*)()
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2024876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024876</guid><dc:creator><![CDATA[Razoron]]></dc:creator><pubDate>Tue, 22 Feb 2011 17:17:03 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function::target gibt Segmentation Fault on Tue, 22 Feb 2011 17:19:24 GMT]]></title><description><![CDATA[<p>Offensichtlich nicht, da <code>bind()</code> ein Funktions<strong>objekt</strong> (also eine Instanz einer Klasse mit überladenem <code>operator()</code> ) zurückgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024879</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 22 Feb 2011 17:19:24 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function::target gibt Segmentation Fault on Tue, 22 Feb 2011 17:29:59 GMT]]></title><description><![CDATA[<p>Okay, dann hab ich wohl bind noch nicht richtig verstanden? bind gibt also ein neues Objekt, also ein neue Instanz, bei dem Beispiel vom Typ obj, zurück?</p>
<p>EDIT: Ah, dein edit gelesen.<br />
Also müsste das theoretisch so funktionieren:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/mem_fn.hpp&gt;
#include &lt;boost/function.hpp&gt;

struct obj
{
    void foo(int x) { std::cout &lt;&lt; x &lt;&lt; std::endl; }
};

void call(void (*func)())
{
    func();
}

typedef void (*func_t)(int x);

int main(int, char**)
{
    obj x;
    obj nw = &amp;boost::bind(boost::mem_fn(&amp;obj::foo), boost::ref(x), 100);
    nw(); // Würde nw.foo(100) bewirken?

    return 0;
}
</code></pre>
<p>Aber ich bin eh auf dem Holzweg...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024880</guid><dc:creator><![CDATA[Razoron]]></dc:creator><pubDate>Tue, 22 Feb 2011 17:29:59 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function::target gibt Segmentation Fault on Tue, 22 Feb 2011 17:34:20 GMT]]></title><description><![CDATA[<p>Razoron schrieb:</p>
<blockquote>
<p>Okay, dann hab ich wohl bind noch nicht richtig verstanden?</p>
</blockquote>
<p><code>bind()</code> ist recht komplex. Es handelt sich um eine Überladung von sehr vielen Funktionstemplates (zumindest solange keine Variadic Templates aus C++0x unterstützt werden). Dass <code>bind()</code> derart mächtig ist, beruht auf der generischen Erzeugung von Funktionsobjekten. Funktionen hingegen kann man nicht einfach so zusammenbasteln.</p>
<p>Der Rückgabetyp von <code>bind()</code> ist <em>implementation-defined</em>, aber konvertierbar in ein <code>function</code> -Objekt mit einer passenden Signatur. Du wirst es nicht schaffen, einen Funktionszeiger zu erzeugen, der dieses Funktionsobjekt aufrufen kann.</p>
<p>Razoron schrieb:</p>
<blockquote>
<p>Also müsste das theoretisch so funktionieren</p>
</blockquote>
<p>Nein. Du darfst nicht die Adresse eines temporären Objekts nehmen, ausserdem sind Zeiger und <code>obj</code> inkompatible Typen und haben eigentlich nichts miteinander zu tun.</p>
<p>Ich rate dir, die Dokumentation zu <code>function</code> und <code>bind</code> ausführlich anzuschauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024887</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 22 Feb 2011 17:34:20 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function::target gibt Segmentation Fault on Tue, 22 Feb 2011 17:36:28 GMT]]></title><description><![CDATA[<p>boost::bind gibt ein nach boost::function&lt;void()&gt; konvertierbares Objekt zurück. Das ist eine Funktionsobjekt, dessen operator () die Selbe Signatur hat, wie deine Funktion, abgesehen vom 'gebundenen' Parameter. <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 />
Deshalb ist es auch nicht ratsam, Funktionen zu schreiben, die Funktionszeiger als Parameter nehmen, sondern ein boost::function Objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024888</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Tue, 22 Feb 2011 17:36:28 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function::target gibt Segmentation Fault on Tue, 22 Feb 2011 17:44:55 GMT]]></title><description><![CDATA[<p>Okay, danke für die Information. Mein Ziel ist es ja, eine Methode einer Klasse mit gebundenen Parametern als ein normalen Funktionspointer an eine GLUT Funktion zu übergeben, z.B. glutDisplayFunc(). Ist das überhaupt möglich oder muss ich die umständliche Variante nehmen, eine statische Funktion schreiben, die dann durch glutGetWindow() und Suchen in einem Set von allen Fenstern die entsprechende Klasse findet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024890</guid><dc:creator><![CDATA[Razoron]]></dc:creator><pubDate>Tue, 22 Feb 2011 17:44:55 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function::target gibt Segmentation Fault on Tue, 22 Feb 2011 18:17:51 GMT]]></title><description><![CDATA[<p>Razoron schrieb:</p>
<blockquote>
<p>Ist das überhaupt möglich</p>
</blockquote>
<p>Nein. Mit C++0x und Lambda-Ausdrücken könntest du das aber hinkriegen, da diese in Funktionszeiger konvertierbar sind (übrigens ein sehr nettes Feature :)).</p>
<p>Razoron schrieb:</p>
<blockquote>
<p>oder muss ich die umständliche Variante nehmen</p>
</blockquote>
<p>Nimmt dein Callback irgendwelche Parameter, z.B. <code>void*</code> ? Dann könntest du andere Argumente da hineinquetschen. Ansonsten wird es mühsam; ich sehe keine Möglichkeit, die ohne statische oder globale Variablen auskommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024898</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 22 Feb 2011 18:17:51 GMT</pubDate></item><item><title><![CDATA[Reply to boost::function::target gibt Segmentation Fault on Tue, 22 Feb 2011 18:49:26 GMT]]></title><description><![CDATA[<p>Danke für Aufklärung. Dann ist das wohl das Falsche. Ich hab den Standardt bei meinem Compiler eh schon auf C++0x gesetzt, die auto variablen sind echt praktisch :D. Dann werd ich mich mal mit Lambda-Ausdrücken beschäftigen.</p>
<p>glutDisplayFunc nimmt void (*)() als Operator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024909</guid><dc:creator><![CDATA[Razoron]]></dc:creator><pubDate>Tue, 22 Feb 2011 18:49:26 GMT</pubDate></item></channel></rss>