<?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[[gelöst] pointer aus int zu klasse casten]]></title><description><![CDATA[<p>Hallo,<br />
ich hoffe der Titel sagt schon das aus, was ich machen will <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>ich habe einen Pointer auf eine Klasse als int vorliegen...dieser wurde so erzeugt:</p>
<pre><code class="language-cpp">LuaPageControl PageControl(L,GTK_WIDGET(iParent));
int(&amp;PageControl);
</code></pre>
<p>die Klasse LuaPageControl wurde so deklariert:</p>
<pre><code class="language-cpp">class LuaPageControl:public LuaControl,public CPageControl
{
  private:
    //GtkWidget *PageControl;
  protected:

  public:
    LuaPageControl(lua_State *l,GtkWidget *parent): LuaControl(l), CPageControl(parent)
    {}
    ~LuaPageControl() {};
};
</code></pre>
<p>ich möchte nun in einer anderen (statischen) Funktion diesen pointer wieder dereferenzieren...</p>
<pre><code class="language-cpp">static int do_PageControlAddPage(lua_State *L)
{
 int iPageControl=luaL_checkinteger(L,1);
 const char *caption=luaL_checkstring(L,2);

 g_print(&quot;Adding Page To Pagecontrol (0x%x) with label '%s'...\n&quot;,iPageControl,caption);

 LuaPageControl PageControl=(LuaPageControl)iPageControl;

 GtkWidget *vbox=PageControl.AddPage(caption,-1);

 lua_pushinteger(L,int(vbox));//put handle of content to stack
 return 1;//return 1 value (handle)
}
</code></pre>
<p>wie zu erkennen ist, ist iPageControl der Pointer als int.<br />
als Fehlermeldung bekomme ich:</p>
<blockquote>
<p>lgui.cxx: In function ‘int do_PageControlAddPage(lua_State*)’:<br />
lgui.cxx:92: error: no matching function for call to ‘LuaPageControl::LuaPageControl(int&amp;)’<br />
lgui.cxx:58: note: candidates are: LuaPageControl::LuaPageControl(lua_State*, GtkWidget*)<br />
lgui.cxx:52: note: LuaPageControl::LuaPageControl(const LuaPageControl&amp;)</p>
</blockquote>
<p>ich habe auch schon versucht den Pointer mittels &amp;PageControl=iPageControl zu setzen, was leider auch nicht geklappt hat <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>weis jemand, wie ich diesen Cast durchführen kann?</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272636/gelöst-pointer-aus-int-zu-klasse-casten</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 18:28:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272636.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 Aug 2010 08:32:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] pointer aus int zu klasse casten on Wed, 29 Sep 2010 17:26:38 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich hoffe der Titel sagt schon das aus, was ich machen will <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>ich habe einen Pointer auf eine Klasse als int vorliegen...dieser wurde so erzeugt:</p>
<pre><code class="language-cpp">LuaPageControl PageControl(L,GTK_WIDGET(iParent));
int(&amp;PageControl);
</code></pre>
<p>die Klasse LuaPageControl wurde so deklariert:</p>
<pre><code class="language-cpp">class LuaPageControl:public LuaControl,public CPageControl
{
  private:
    //GtkWidget *PageControl;
  protected:

  public:
    LuaPageControl(lua_State *l,GtkWidget *parent): LuaControl(l), CPageControl(parent)
    {}
    ~LuaPageControl() {};
};
</code></pre>
<p>ich möchte nun in einer anderen (statischen) Funktion diesen pointer wieder dereferenzieren...</p>
<pre><code class="language-cpp">static int do_PageControlAddPage(lua_State *L)
{
 int iPageControl=luaL_checkinteger(L,1);
 const char *caption=luaL_checkstring(L,2);

 g_print(&quot;Adding Page To Pagecontrol (0x%x) with label '%s'...\n&quot;,iPageControl,caption);

 LuaPageControl PageControl=(LuaPageControl)iPageControl;

 GtkWidget *vbox=PageControl.AddPage(caption,-1);

 lua_pushinteger(L,int(vbox));//put handle of content to stack
 return 1;//return 1 value (handle)
}
</code></pre>
<p>wie zu erkennen ist, ist iPageControl der Pointer als int.<br />
als Fehlermeldung bekomme ich:</p>
<blockquote>
<p>lgui.cxx: In function ‘int do_PageControlAddPage(lua_State*)’:<br />
lgui.cxx:92: error: no matching function for call to ‘LuaPageControl::LuaPageControl(int&amp;)’<br />
lgui.cxx:58: note: candidates are: LuaPageControl::LuaPageControl(lua_State*, GtkWidget*)<br />
lgui.cxx:52: note: LuaPageControl::LuaPageControl(const LuaPageControl&amp;)</p>
</blockquote>
<p>ich habe auch schon versucht den Pointer mittels &amp;PageControl=iPageControl zu setzen, was leider auch nicht geklappt hat <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>weis jemand, wie ich diesen Cast durchführen kann?</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1942908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1942908</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Wed, 29 Sep 2010 17:26:38 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pointer aus int zu klasse casten on Sun, 22 Aug 2010 08:45:09 GMT]]></title><description><![CDATA[<p>Da ist ein reinterpret_cast angesagt.</p>
<p>Aber: Warum? Das macht alles gar keinen Sinn. Außer vielleicht als sehr gutes Negativbeispiel.</p>
<p>Außerdem: Viel Spaß auf 64 Bit Systemen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1942911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1942911</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 22 Aug 2010 08:45:09 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pointer aus int zu klasse casten on Sun, 22 Aug 2010 08:54:28 GMT]]></title><description><![CDATA[<p>Da du in dem int die Adresse transportierst, müsste es doch so lauten:</p>
<pre><code class="language-cpp">LuaPageControl* PageControl=(LuaPageControl*)iPageControl;
</code></pre>
<p>bzw. besseres C++ ohne C-style cast</p>
<pre><code class="language-cpp">LuaPageControl* PageControl=reinterpret_cast&lt;LuaPageControl*&gt;(iPageControl);
</code></pre>
<p>Aber so etwas mit einem int zu machen ist schon merkwürdig. Wenn es wenigstens ein void* wäre.</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1942915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1942915</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 22 Aug 2010 08:54:28 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pointer aus int zu klasse casten on Sun, 22 Aug 2010 09:48:07 GMT]]></title><description><![CDATA[<p>erstmal danke. es compiliert nun...</p>
<p>lua kennt kein void* nur Typen wie &quot;int&quot; &quot;const char*&quot; und &quot;bool&quot;</p>
<p>habe leider keine Möglichkeit gefunden, den zugriff auf die klasse anders zu realisieren.</p>
<p>ich müsste doch jetzt eigentlich mittels</p>
<pre><code class="language-cpp">PageControl-&gt;AddPage(caption,-1);
</code></pre>
<p>auf das Feld zugreifen können, oder? das macht er auch, nur dass ich scheinbar nicht auf private felder der klasse (innerhalb der addpage-Methode) zugreifen kann.</p>
<pre><code class="language-cpp">GtkWidget *CPageControl::AddPage(const char *caption,int position)
{
  g_print(&quot;Adding Page (CPageControl)\n&quot;);
	GtkWidget *label=gtk_accel_label_new(caption);
  GtkWidget *vbox=gtk_vbox_new(2,false);
	gtk_widget_show(vbox);
	g_print(&quot;now inserting (%x)\n&quot;,int(PageControl));

	gtk_notebook_insert_page(GTK_NOTEBOOK(PageControl),vbox,label,position);
	g_print(&quot;inserted\n&quot;);
  return vbox;
}
</code></pre>
<p>die gtk_notebook-zeile bringt das programm zum abstürzen, Pagecontrol ist auf irgendetwas gesetzt, aber nicht das feld der klasse.<br />
rufe ich die methode direkt nach dem constructor auf, funktioniert es.</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1942927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1942927</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Sun, 22 Aug 2010 09:48:07 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pointer aus int zu klasse casten on Sun, 22 Aug 2010 10:39:52 GMT]]></title><description><![CDATA[<p><em>frank</em> schrieb:</p>
<blockquote>
<p>lua kennt kein void* nur Typen wie &quot;int&quot; &quot;const char*&quot; und &quot;bool&quot;</p>
</blockquote>
<p>Eigentlich kennt Lua keins davon. nil, boolean, number, string, function, userdata, thread und table sind die Datentypen in Lua. userdata wäre das richtige für Pointer.</p>
<pre><code class="language-cpp">lua_pushlightuserdata(L, vbox);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1942933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1942933</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Sun, 22 Aug 2010 10:39:52 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pointer aus int zu klasse casten on Sun, 22 Aug 2010 11:17:37 GMT]]></title><description><![CDATA[<p>userdata bringt mir aktuell mehr probleme:</p>
<pre><code class="language-cpp">lua_pushlightuserdata(L,PageControl);
</code></pre>
<blockquote>
<p>error: cannot convert ‘LuaPageControl’ to ‘void*’</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1942942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1942942</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Sun, 22 Aug 2010 11:17:37 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pointer aus int zu klasse casten on Sun, 22 Aug 2010 12:43:24 GMT]]></title><description><![CDATA[<p>Du musst dich schon entscheiden, ob du ein Objekt oder einen Zeiger auf ein Objekt pushen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1942966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1942966</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Sun, 22 Aug 2010 12:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pointer aus int zu klasse casten on Mon, 23 Aug 2010 13:37:25 GMT]]></title><description><![CDATA[<p>Nukularfüsiker schrieb:</p>
<blockquote>
<p>Du musst dich schon entscheiden, ob du ein Objekt oder einen Zeiger auf ein Objekt pushen willst.</p>
</blockquote>
<p>mhm...klar mit &amp; die Adresse holen <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>das problem ist, dass ich dann nicht die adresse direkt verwenden kann sondern diese erstmal dereferenzieren muss...und mein &quot;objekt&quot; selbst ist eigentlich schon ein Pointer:</p>
<pre><code class="language-cpp">GtkWidget *PageControl;
bzw.
GtkWidget *vbox=gtk_vbox_new(2,false);
</code></pre>
<p>mit &amp; hätte ich dann also den pointer auf nen pointer <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="😞"
    /><br />
vorher hab ich ja den objektzeiger selbst auf int gecastet..nur wie gehts das mit void*? einfach mit * gehts nicht (error: ‘void*’ is not a pointer-to-object type)</p>
<p>trotzdem besteht das ursprungsproblem immer noch...der code sieht jetzt so aus:</p>
<pre><code class="language-cpp">static int do_CreatePageControl(lua_State *L)
{
  gpointer iParent=lua_touserdata(L,1);

  g_print(&quot;Adding Pagecontrol to Parent 0x%x...\n&quot;,iParent);

  LuaPageControl PageControl(L,GTK_WIDGET(iParent));

  PageControl.AddPage(&quot;Test&quot;,-1);

  GtkWidget *button=gtk_button_new_with_label(&quot;Test&quot;);
  gtk_widget_show(button);
  gtk_box_pack_start(GTK_BOX(iParent),button, TRUE, TRUE, 0);

  button=gtk_button_new_with_label(&quot;Test2&quot;);
  gtk_widget_show(button);
  gtk_box_pack_start(GTK_BOX(iParent),button, TRUE, TRUE, 0);

  lua_pushlightuserdata(L,&amp;PageControl);//put pointer of Pagecontrol to stack
  //lua_pushinteger(L,int(&amp;PageControl));//put pointer of Pagecontrol to stack
  return 1;//return 1 value (handle)
}

static int do_PageControlAddPage(lua_State *L)
{
  gpointer iPageControl=lua_touserdata(L,1);
  const char *caption=luaL_checkstring(L,2);

  g_print(&quot;Adding Page To Pagecontrol (0x%x) with label '%s'...\n&quot;,iPageControl,caption);

  LuaPageControl* PageControl=reinterpret_cast&lt;LuaPageControl*&gt;(iPageControl);

  GtkWidget *vbox=PageControl-&gt;AddPage(caption,-1);

  //lua_pushinteger(L,int(vbox));//put handle of content to stack
  lua_pushlightuserdata(L,&amp;vbox);//put pointer of vbox on stack
  return 1;//return 1 value (handle)
}
</code></pre>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943358</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Mon, 23 Aug 2010 13:37:25 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pointer aus int zu klasse casten on Mon, 23 Aug 2010 13:41:54 GMT]]></title><description><![CDATA[<p><em>frank</em> schrieb:</p>
<blockquote>
<p>vorher hab ich ja den objektzeiger selbst auf int gecastet..nur wie gehts das mit void*?</p>
</blockquote>
<p>Da ist kein Cast notwendig.</p>
<blockquote>
<p>trotzdem besteht das ursprungsproblem immer noch...</p>
</blockquote>
<p>Vermutlich ist dein Problem, dass PageControl wird beim verlassen der Funktion zerstört wird. Du musst das Ding mit new anlegen, damit es länger lebt. Und wenn du es nicht mehr brauchst, mit delete wieder löschen. Kleines Einmaleins... vielleicht mal ein C++-Grundlagenbuch lesen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943381</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Mon, 23 Aug 2010 13:41:54 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pointer aus int zu klasse casten on Mon, 23 Aug 2010 14:58:51 GMT]]></title><description><![CDATA[<p>Nukularfüsiker schrieb:</p>
<blockquote>
<p><em>frank</em> schrieb:</p>
<blockquote>
<p>vorher hab ich ja den objektzeiger selbst auf int gecastet..nur wie gehts das mit void*?</p>
</blockquote>
<p>Da ist kein Cast notwendig.</p>
</blockquote>
<p>das object direkt übergeben an lua_pushlightuserdata ist ja nicht möglich...</p>
<p>wie gesagt, vorher hab ich den Objectzeiger direkt nach int gecastet &quot;int(Pagecontrol)&quot;</p>
<p>mhm, das mit der automatischen freigabe könnte das problem sein...muss ich mal schauen, ob ich das irgendwie lösen kann...<br />
btw. das Grundlagenbuch (Einstieg in C++) liegt neben mir...und ich schau auch rein <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ß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943428</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Mon, 23 Aug 2010 14:58:51 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pointer aus int zu klasse casten on Mon, 23 Aug 2010 15:10:01 GMT]]></title><description><![CDATA[<p><em>frank</em> schrieb:</p>
<blockquote>
<p>wie gesagt, vorher hab ich den Objectzeiger direkt nach int gecastet &quot;int(Pagecontrol)&quot;</p>
</blockquote>
<p>Das funktioniert nicht. Der Compiler mag das zulassen, aber es kommt kein sinnvolles Ergebnis dabei raus.</p>
<p>Die Lösung ist simpel:</p>
<pre><code class="language-cpp">LuaPageControl *pageControl = new LuaPageControl(L,GTK_WIDGET(iParent));
lua_pushlightuserdata(L, pageControl);
</code></pre>
<p>Das sollte funktionieren. Du musst dir aber überlegen, wo du das dazugehörige delete unterbringst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943436</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Mon, 23 Aug 2010 15:10:01 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] pointer aus int zu klasse casten on Tue, 24 Aug 2010 12:33:44 GMT]]></title><description><![CDATA[<p>ok, ich schau mal, wo ich das delete unterbringen kann...muss das wahrscheinlich über die GUI machen (gui-element freigeben und über angehängen Pointer auf klasse diese auch freigeben), da LUA keine Unload-methode aufruft</p>
<p>die anderen Sachen konnte ich lösen...es sieht jetzt so aus:</p>
<pre><code class="language-cpp">//hauptprogramm:
void *SciTEGTK::GetSidebarHandle()

{
  g_print(&quot;Sidebar-Handle (Scite): 0x%x\n&quot;,int(SidebarContainer));

  return SidebarContainer;

}

//modul:
static int do_CreatePageControl(lua_State *L)
{
  gpointer iParent=lua_touserdata(L,1);

  LuaPageControl *PageControl=new LuaPageControl(L,GTK_WIDGET(iParent));

  lua_pushlightuserdata(L,PageControl);//put pointer of Pagecontrol to stack
  return 1;//return 1 value (handle)
}
//...
static int do_PageControlAddPage(lua_State *L)
{
  gpointer iPageControl=lua_touserdata(L,1);
  const char *caption=luaL_checkstring(L,2);

  LuaPageControl* PageControl=reinterpret_cast&lt;LuaPageControl*&gt;(iPageControl);

  GtkWidget *vbox=PageControl-&gt;AddPage(caption,-1);

  lua_pushlightuserdata(L,&amp;vbox);//put pointer of vbox on stack
  return 1;//return 1 value (handle)
}
</code></pre>
<p>der komplette/aktuellste code ist auf <a href="http://scite-gui.googlecode.com" rel="nofollow">http://scite-gui.googlecode.com</a></p>
<p>Danke an alle, die mir geholfen haben</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1943752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1943752</guid><dc:creator><![CDATA[_frank_]]></dc:creator><pubDate>Tue, 24 Aug 2010 12:33:44 GMT</pubDate></item></channel></rss>