<?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[Zeiger vom Typ void (__cdecl*) auf eine Objektmethode]]></title><description><![CDATA[<p>Sehr geehrte Damen und Herren,<br />
ich habe folgendes Problem. Eine Timer Interrupt Funktion fordert einen Zeiger auf eine Funktion, die in bestimmten Invervallen ausgefuehrt werden soll. Eine einfache Funktion besitzt als Adresse den Typ:</p>
<pre><code>void (__cdecl*) (*proc)
</code></pre>
<p>Leider moechte ich eine Methode einer Klasse bzw. eines Objekts aufrufen, und in bestimmten Intervallen abarbeiten lassen.<br />
Die Adresse der Methode erhalte ich wie folgt:</p>
<pre><code>&amp;class::methode
</code></pre>
<p>Leider Gottes ist diese Methode von dem folgenden Typ:</p>
<pre><code>void (__thiscall) (*proc)
</code></pre>
<p>Ich vermute es liegt daran, das diese Funktion eine zu C standartisierte Methode benoetigt (daher C-DECLARED) und da es in C keine Objektorientierung gibt, wird kein Zeiger der Art __cdecl geliefert.<br />
Ist es irgendwie moeglich die Adresse einer Methode wie eine Adresse einer gewoehnlichen Funktion nach C Standard zu handlen?</p>
<p>MfG D. Jeuck</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/164228/zeiger-vom-typ-void-__cdecl-auf-eine-objektmethode</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 18:19:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/164228.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Nov 2006 12:22:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger vom Typ void (__cdecl*) auf eine Objektmethode on Mon, 06 Nov 2006 13:07:12 GMT]]></title><description><![CDATA[<p>Sehr geehrte Damen und Herren,<br />
ich habe folgendes Problem. Eine Timer Interrupt Funktion fordert einen Zeiger auf eine Funktion, die in bestimmten Invervallen ausgefuehrt werden soll. Eine einfache Funktion besitzt als Adresse den Typ:</p>
<pre><code>void (__cdecl*) (*proc)
</code></pre>
<p>Leider moechte ich eine Methode einer Klasse bzw. eines Objekts aufrufen, und in bestimmten Intervallen abarbeiten lassen.<br />
Die Adresse der Methode erhalte ich wie folgt:</p>
<pre><code>&amp;class::methode
</code></pre>
<p>Leider Gottes ist diese Methode von dem folgenden Typ:</p>
<pre><code>void (__thiscall) (*proc)
</code></pre>
<p>Ich vermute es liegt daran, das diese Funktion eine zu C standartisierte Methode benoetigt (daher C-DECLARED) und da es in C keine Objektorientierung gibt, wird kein Zeiger der Art __cdecl geliefert.<br />
Ist es irgendwie moeglich die Adresse einer Methode wie eine Adresse einer gewoehnlichen Funktion nach C Standard zu handlen?</p>
<p>MfG D. Jeuck</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1169542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1169542</guid><dc:creator><![CDATA[LMwoot]]></dc:creator><pubDate>Mon, 06 Nov 2006 13:07:12 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger vom Typ void (__cdecl*) auf eine Objektmethode on Mon, 06 Nov 2006 12:26:29 GMT]]></title><description><![CDATA[<p>Dein Problem ist weniger das fehlende __cdecl, sondern vielmehr das __thiscall. Klassenmethoden in C++ bekommen einen zusätzlichen Parameter namens 'this' übergeben, der auch noch verwaltet werden muß. Deshalb kannst du diese Methoden auch nicht ohne ein vorhandenes Objekt aufrufen.</p>
<p>Als Lösung könntest du die betroffene Methode static definieren und dir eine andere Methode überlegen, an ein Klassenobjekt zu gelangen (z.B. Singleton).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1169547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1169547</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 06 Nov 2006 12:26:29 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger vom Typ void (__cdecl*) auf eine Objektmethode on Mon, 06 Nov 2006 13:05:43 GMT]]></title><description><![CDATA[<p>Vielen Dank fuer die schnelle Antwort.</p>
<p>Leider ist es mir nicht moeglich aus einer static Methode die Variablen innerhalb der Methode zu aendern.<br />
Erstere Gedanken von mir war ein Funktor, jedoch wird auch bei diesem ein Zeiger mit dem Typ __thiscall geliefert.<br />
Ein weiterer Versuch war eine friend Funktion der Klasse.<br />
Diese wurde auch mit dem richtigen Zeigertyp geliefert. Leider war es mir mit dieser Funktion nicht moeglich Zugriff auf die Variablen innerhalb einer Klasse zu bekommen.<br />
Hier der eigentlich abzuarbeitende Code:</p>
<pre><code>void class::methode
{
 if(ypos&gt;0) --ypos;
}
</code></pre>
<p>alternativ(und als richtiger Zeigertyp):</p>
<pre><code>class xyz
{
 ...
 friend void func(void);
 ...
};
void func()
{
 ...
}
</code></pre>
<p>und hier der Prototyp der der Timer Funktion:</p>
<pre><code>void tfunc(void (__cdecl*)(*proc)(), int interval);
</code></pre>
<p>Ich waere fuer weitere Vorschlaege sehr dankbar.</p>
<p>Gruss D. Jeuck</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1169589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1169589</guid><dc:creator><![CDATA[LMwoot]]></dc:creator><pubDate>Mon, 06 Nov 2006 13:05:43 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger vom Typ void (__cdecl*) auf eine Objektmethode on Mon, 06 Nov 2006 13:21:44 GMT]]></title><description><![CDATA[<p>Ich zitiere mich mal selber:</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Als Lösung könntest du die betroffene Methode static definieren und dir eine andere Methode überlegen, an ein Klassenobjekt zu gelangen (z.B. Singleton).</p>
</blockquote>
<p>Zum Beispiel könnte deine Versorgungsmethode eine Objekt als lokale Variable verwenden:</p>
<pre><code class="language-cpp">class Test
{
public:
  static void work()
  {
    Test my_this;
    my_this.x = 4711;
  }
private:
  int x;
};
</code></pre>
<p>Aber gerade im Zusammenhang mit Callback-Funktionen werden der Funktion doch meistens zusätzliche Parameter übergeben, die du ausnutzen kannst:</p>
<pre><code class="language-cpp">class Test
{
public:
  static void work(void* data)
  {
    Test* my_this = (Test*)data;
    ...
  }
  ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1169610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1169610</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 06 Nov 2006 13:21:44 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger vom Typ void (__cdecl*) auf eine Objektmethode on Tue, 07 Nov 2006 02:26:05 GMT]]></title><description><![CDATA[<p>Es gibt ein paar lästige Funktionen die leider kein void* Parameter können. So Sachen wie atexit(). Sehr lästig. Kann man dann bloss noch über Thunks machen, aber das wird ganz schnell ganz garstig (abgesehen davon dass es so schlimm Plattformabhängig ist dass es schlimmer nichtmehr geht).</p>
<p>Habe ich mir bis jetzt noch nie angetan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170143</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 07 Nov 2006 02:26:05 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger vom Typ void (__cdecl*) auf eine Objektmethode on Tue, 07 Nov 2006 04:53:05 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Test 
{ 
public: 
  static void work(void* data) 
  { 
    Test* my_this = (Test*)data; 
    ... 
  } 
  ... 
};
</code></pre>
<p>Das würde ich lassen, ist eine ganz große Fehlerquelle. Woher willst du wissen ob der Zeiger überhaupt noch dahin zeigt wo er hinzeigen soll?</p>
<blockquote>
<p>Leider war es mir mit dieser Funktion nicht moeglich Zugriff auf die Variablen innerhalb einer Klasse zu bekommen.</p>
</blockquote>
<p>Das ist eigenartig, war das nicht der Sinn der friend-Deklaration? Eine friend-Funktion kann doch auf private Daten der friend-Klasse zugreifen. Die Funktion muss selbstverständlich so aussehen:</p>
<pre><code class="language-cpp">void func(xyz&amp; instanz)
{
   xyz.privateDaten = blaaa;
}
</code></pre>
<p>Mein Tipp ist: Benutze eine andere Timer-Bibliothek. Zum Beispiel die aus boost.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170148</guid><dc:creator><![CDATA[DEvent]]></dc:creator><pubDate>Tue, 07 Nov 2006 04:53:05 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger vom Typ void (__cdecl*) auf eine Objektmethode on Tue, 07 Nov 2006 12:37:58 GMT]]></title><description><![CDATA[<p>Boost? Wo/wie/seit wann gibts da Timer (ausser die &quot;Boost.Timer&quot; Teile die genau nix können)? Link?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170406</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 07 Nov 2006 12:37:58 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger vom Typ void (__cdecl*) auf eine Objektmethode on Tue, 07 Nov 2006 13:50:53 GMT]]></title><description><![CDATA[<p>Was sollen sie den können? boost::timer ruft jedes delta time eine Objektmethode auf. Was willst du mehr?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170475</guid><dc:creator><![CDATA[DEvent]]></dc:creator><pubDate>Tue, 07 Nov 2006 13:50:53 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger vom Typ void (__cdecl*) auf eine Objektmethode on Tue, 07 Nov 2006 13:54:14 GMT]]></title><description><![CDATA[<p>Vielen Dank fuer die vielen Antworten. Jedoch moechte ich schon gerne bei der Allegro API bleiben. Fuer kleinere Projekte ist sie garnicht so schlecht.</p>
<p>Habe immernoch das Problem, das ich an die Timer Funktion keine Funktionsadresse mit Parametern uebergeben kann. Eine Friend Funktion kann nur dann die privaten Daten einer Klasse auslesen, wenn die Adresse der Klasse an sie als Parameter uebergeben wird. Das ist also in meinem Fall nicht moeglich.</p>
<p>Hab eine Moeglichkeit gefunden, die funktioniert und das is, wenn ich die eine Integer Variable die gezaehlt werden soll global anlege. Finde die Loesung nur en bisschen arg mistig.</p>
<p>Was noch sein kann, das ich die Funktion mit Parameter einfach falsch geschrieben habe. Es ist doch wie folgt oder?:</p>
<pre><code>timer_function(&amp;func(param1), timer_in_cpu_ticks);
</code></pre>
<p>Ich bin mir nicht sicher ob der Teil stimmt <strong>&amp;func(param1)</strong></p>
<p>LG D Jeuck</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170477</guid><dc:creator><![CDATA[LMwoot]]></dc:creator><pubDate>Tue, 07 Nov 2006 13:54:14 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger vom Typ void (__cdecl*) auf eine Objektmethode on Tue, 07 Nov 2006 14:04:29 GMT]]></title><description><![CDATA[<blockquote>
<p>Was sollen sie den können? boost::timer ruft jedes delta time eine Objektmethode auf. Was willst du mehr?</p>
</blockquote>
<p><a href="http://boost.org/libs/timer/timer.htm#Class%20timer" rel="nofollow">http://boost.org/libs/timer/timer.htm#Class timer</a><br />
Das ist Boost.Timer, und das kann *nix*.<br />
Und sicher keine Methoden von irgendwem aufrufen.<br />
Wenns da noch was anderes gibt bitte ich an dieser Stelle jetzt nochmals um einen Link. Das will ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170486</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 07 Nov 2006 14:04:29 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger vom Typ void (__cdecl*) auf eine Objektmethode on Tue, 07 Nov 2006 14:05:42 GMT]]></title><description><![CDATA[<p>LMwoot schrieb:</p>
<blockquote>
<p>Ein weiterer Versuch war eine friend Funktion der Klasse.<br />
Diese wurde auch mit dem richtigen Zeigertyp geliefert. Leider war es mir mit dieser Funktion nicht moeglich Zugriff auf die Variablen innerhalb einer Klasse zu bekommen.</p>
</blockquote>
<p>hier hast du irgendetwas nicht verstanden. variablen innerhalb einer klasse gibt es nicht, außer sie sind static. du kannst eine klasse instanziieren, dann hast du eine instanz. jede instanz hat ihre *eigenen* variablen. wie sollte denn jetzt eine friend funktion wissen, welche variable von welcher instanz du haben willst? lösung: du übergibst der friend funktion einfach eine referenz auf eine instanz mit.</p>
<p>die signatur der memberfunktion wäre dann übrigens</p>
<pre><code class="language-cpp">struct foo
{
void bar () { cout &lt;&lt; &quot;huhu\n&quot;; }
};

int main ()
{
void (foo::*zeiger) ();
zeiger = &amp;foo::bar;
foo instanz;

(instanz.*zeiger)();

}
</code></pre>
<p>merke: ein funktionszeiger auf eine memberfunktion braucht immer eine instanz.</p>
<p>du kannst eine memberfunktion auch zu einem funktionsobjekt umwandeln, siehe dazu &quot;mem_fun&quot; - wenn du an deiner timer funktion bleiben willst, wird dir also wohl nichts anderes übrig bleiben, als eine eigene nicht-member-funktion zu schreiben, die auf irgendeine andere weise die richtige instanz für die memberfunktion verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170487</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Tue, 07 Nov 2006 14:05:42 GMT</pubDate></item></channel></rss>