<?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[Pointer auf Funktion die Funktionspointer returned [Erledigt]]]></title><description><![CDATA[<p>Morgen an alle <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Da meine C++ Kenntnisse leider etwas eingerostet sind komme ich mit Funktionspointern nicht so richtig klar und erhalte eine Access Violation beim Ausführen meines Codes. Das aber erst nachdem ich das Programm per Ausschaltknopf beende weil ich in irgendeiner Art Endlosschleife feststecke.</p>
<p>Die Struktur sieht Folgendermaßen aus:<br />
Klassenfunktion nimmt eine vom Benutzer spezifizierte Funktion Execute an, die sie dann ausführt. Execute muss so definiert sein, dass sie einen Funktionspointer auf eine Funktion Output returned, die die Bildschirmausgabe erzeugt. Die Funktion Output wird dann als Argument zu einer weiteren Klassenfunktion gegeben, die sie dann ausführt.<br />
Code:</p>
<pre><code>typedef void (*PtrOperation) (void *);       //Mit typedef gehts übersichtlicher

int Window::Run(HINSTANCE hInstance, int nShowCmd, int Width, int Height, int Depth, 
				PtrOperation (*Execute) (const MSG&amp; M) )
{
	// [...] Windows-Kram

	while(true)
	{
                //Execute returned Pointer auf eine Funktion die einen void* Pointer annimmt, Screen.Write nimmt sie an und führt sie aus.
		Screen.Write (Execute (CheckInput (Msg) ) ); 
                //Kommentiere ich den Aufruf von Write aus, läuft alles.

		if(Msg.message == WM_QUIT || Msg.message == WM_KEYDOWN)
		{
			break;
		}
	}
	return 0;
}
</code></pre>
<p>Execute ist vorläufig ein Dummy, der nichts macht und nur den Pointer auf die Outputfunktion zurückgibt. Output ist ebenfalls ein Dummy.</p>
<p>PtrOperation Execute (const MSG &amp;M)<br />
{<br />
int i=5;</p>
<p>return &amp;Output;<br />
}<br />
Write ruft die Funktion gar nicht erst aus, erhalte Fehler schon vorher. Aufruf auskommentiert.</p>
<pre><code>void Surface::Write (PtrOperation Output)
{
	VideoMem-&gt;Lock (0, &amp;SurfaceDescription, DDLOCK_SURFACEMEMORYPTR, 0);

	//Output (SurfaceDescription.lpSurface); 

	VideoMem-&gt;Release ();
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/248840/pointer-auf-funktion-die-funktionspointer-returned-erledigt</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 18:16:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/248840.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 30 Aug 2009 06:46:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer auf Funktion die Funktionspointer returned [Erledigt] on Sun, 30 Aug 2009 12:01:07 GMT]]></title><description><![CDATA[<p>Morgen an alle <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Da meine C++ Kenntnisse leider etwas eingerostet sind komme ich mit Funktionspointern nicht so richtig klar und erhalte eine Access Violation beim Ausführen meines Codes. Das aber erst nachdem ich das Programm per Ausschaltknopf beende weil ich in irgendeiner Art Endlosschleife feststecke.</p>
<p>Die Struktur sieht Folgendermaßen aus:<br />
Klassenfunktion nimmt eine vom Benutzer spezifizierte Funktion Execute an, die sie dann ausführt. Execute muss so definiert sein, dass sie einen Funktionspointer auf eine Funktion Output returned, die die Bildschirmausgabe erzeugt. Die Funktion Output wird dann als Argument zu einer weiteren Klassenfunktion gegeben, die sie dann ausführt.<br />
Code:</p>
<pre><code>typedef void (*PtrOperation) (void *);       //Mit typedef gehts übersichtlicher

int Window::Run(HINSTANCE hInstance, int nShowCmd, int Width, int Height, int Depth, 
				PtrOperation (*Execute) (const MSG&amp; M) )
{
	// [...] Windows-Kram

	while(true)
	{
                //Execute returned Pointer auf eine Funktion die einen void* Pointer annimmt, Screen.Write nimmt sie an und führt sie aus.
		Screen.Write (Execute (CheckInput (Msg) ) ); 
                //Kommentiere ich den Aufruf von Write aus, läuft alles.

		if(Msg.message == WM_QUIT || Msg.message == WM_KEYDOWN)
		{
			break;
		}
	}
	return 0;
}
</code></pre>
<p>Execute ist vorläufig ein Dummy, der nichts macht und nur den Pointer auf die Outputfunktion zurückgibt. Output ist ebenfalls ein Dummy.</p>
<p>PtrOperation Execute (const MSG &amp;M)<br />
{<br />
int i=5;</p>
<p>return &amp;Output;<br />
}<br />
Write ruft die Funktion gar nicht erst aus, erhalte Fehler schon vorher. Aufruf auskommentiert.</p>
<pre><code>void Surface::Write (PtrOperation Output)
{
	VideoMem-&gt;Lock (0, &amp;SurfaceDescription, DDLOCK_SURFACEMEMORYPTR, 0);

	//Output (SurfaceDescription.lpSurface); 

	VideoMem-&gt;Release ();
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769114</guid><dc:creator><![CDATA[Kontrasubjekt]]></dc:creator><pubDate>Sun, 30 Aug 2009 12:01:07 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Funktion die Funktionspointer returned [Erledigt] on Sun, 30 Aug 2009 11:14:08 GMT]]></title><description><![CDATA[<p>Also grundsätzlich zu Funktionspointer wäre dieses Tutorial hier empfehlenswert:<br />
<a href="http://www.newty.de/fpt/index.html" rel="nofollow">http://www.newty.de/fpt/index.html</a></p>
<p>Bei deinem Code komme ich jetzt nicht ganz draus..<br />
Du sagst, dass diese Funktion hier der Dummy ist, welcher an die Funktion <code>Window::Run</code> übergeben wird, oder? - Die hat aber nicht die gleiche Signatur, wie von dir vorgeschrieben für <code>PtrOperation</code></p>
<blockquote>
<pre><code class="language-cpp">PtrOperation Execute (const MSG &amp;M)
{
int i=5;

return &amp;Output;
}
</code></pre>
</blockquote>
<p>Wenn ich das falsch verstanden habe, dann zeig doch bitte mal ein, wenn möglich lauffähiges Beispiel, damit wir den Code komplett nachvollziehen können. (oder zeige wenigstens die Funktion, die du übergibst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769190</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 30 Aug 2009 11:14:08 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Funktion die Funktionspointer returned [Erledigt] on Sun, 30 Aug 2009 12:06:14 GMT]]></title><description><![CDATA[<p>Uff. Der Fehler lag woanders: bei DirectDraw hab ich statt Unlock() Release() benutzt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Problem gelöst, sorry für die Umstände. Dachte es wäre ein Problem bei den Funktionspointern.</p>
<p>Btw bei dem tutorial war ich schon <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Edit:</p>
<blockquote>
<p>Du sagst, dass diese Funktion hier der Dummy ist, welcher an die Funktion Window::Run übergeben wird, oder? - Die hat aber nicht die gleiche Signatur, wie von dir vorgeschrieben für PtrOperation</p>
</blockquote>
<p>Doch, die Signatur bei Run () ist: Pointer auf Funktion die const MSG&amp; bekommt und einen Zeiger auf Funktion mit void* als Parameter und void im return zurückgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1769217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1769217</guid><dc:creator><![CDATA[Kontrasubjekt]]></dc:creator><pubDate>Sun, 30 Aug 2009 12:06:14 GMT</pubDate></item></channel></rss>