<?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] Zeiger auf Memberfunktion &#x2F; LibCurl]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche gerade mich in LibCurl einzuarbeiten. Mit C-Code funktioniert es bisher ganz gut, aber sobald ich die Funktionalität in einer Klasse kapseln möchte, bekomme ich eine Zugriffsverletzung.</p>
<p>Ich vermute, dass ich da was mit dem Zeiger auf die Memberfunktion falsch mache. Ist aber nur eine Vermutung, ich kann mir gerade keinen Reim darauf machen, was da schief läuft.</p>
<p>Hier mal der C-Code</p>
<pre><code class="language-cpp">#include &lt;tchar.h&gt;
#include &quot;curl/curl.h&quot;

FILE* datei;
bool startSaving = true;
size_t saveToFile( char *ptr, size_t size, size_t nmemb, void *userdata);
unsigned int start();

int _tmain(int argc, _TCHAR* argv[])
{
	start();
}

size_t saveToFile( char *ptr, size_t size, size_t nmemb, void *userdata)
{
	if(startSaving)
	{
		startSaving = false;
		printf(&quot;Lade herunter...&quot;);
	}
	fwrite(ptr,size,nmemb,datei);
	return size*nmemb;
}
unsigned int start()
{
	CURLcode returnCode;
	CURL* curl = curl_easy_init( );
	if(curl==NULL)
	{
		printf(&quot;Fehler: curl==NULL\n&quot;);
		return 1;
	}
	returnCode = curl_easy_setopt(curl,CURLOPT_URL,&quot;http://192.168.0.8/install_1.exe&quot;);
	if(returnCode!=CURLE_OK)
	{
		printf(&quot;Fehler: curl_easy_setopt(curl,CURLOPT_URL,\&quot;http://192.168.0.8/install_1.exe\&quot;)\n&quot;);
		return 2;
	}
	returnCode = curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,saveToFile);
	if(returnCode!=CURLE_OK)
	{
		printf(&quot;Fehler: curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,saveToFile)\n&quot;);
		return 3;
	}

	datei = fopen(&quot;D:\\install_1.exe&quot;,&quot;wb&quot;);
	if(datei==NULL)
	{
		printf(&quot;Fehler: Konnte Datei nicht oeffnen\n&quot;);
		return 4;		
	}
	returnCode = curl_easy_perform(curl);
	if(returnCode!=CURLE_OK)
	{
		printf(&quot;Fehler: curl_easy_perform(curl)\n&quot;);
		return 5;
	}

	curl_easy_cleanup(curl);

	fclose(datei);
	system(&quot;pause&quot;);
	return 0;
}
</code></pre>
<p>und hier der entsprechende C++ Code:</p>
<pre><code class="language-cpp">#include &lt;tchar.h&gt;
#include &quot;curl/curl.h&quot;

class Downloader
{
	private:
		FILE* datei;
		bool startSaving;
		size_t saveToFile( char *ptr, size_t size, size_t nmemb, void *userdata);
	public:
		Downloader();
		unsigned int start();
};
Downloader::Downloader()
{
	startSaving = true;
}

int _tmain(int argc, _TCHAR* argv[])
{ 
	Downloader* dl = new Downloader();
	dl-&gt;start();
}

size_t Downloader::saveToFile( char *ptr, size_t size, size_t nmemb, void *userdata)
{
	if(startSaving)
	{
		startSaving = false;
		printf(&quot;Lade herunter...&quot;);
	}
	fwrite(ptr,size,nmemb,datei);
	return size*nmemb;
}
unsigned int Downloader::start()
{
	CURLcode returnCode;
	CURL* curl = curl_easy_init( );
	if(curl==NULL)
	{
		printf(&quot;Fehler: curl==NULL\n&quot;);
		return 1;
	}
	returnCode = curl_easy_setopt(curl,CURLOPT_URL,&quot;http://192.168.0.8/install_1.exe&quot;);
	if(returnCode!=CURLE_OK)
	{
		printf(&quot;Fehler: curl_easy_setopt(curl,CURLOPT_URL,\&quot;http://192.168.0.8/install_1.exe\&quot;)\n&quot;);
		return 2;
	}

	returnCode = curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,&amp;Downloader::saveToFile);
	if(returnCode!=CURLE_OK)
	{
		printf(&quot;Fehler: curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,saveToFile)\n&quot;);
		return 3;
	}

	datei = fopen(&quot;D:\\install_1.exe&quot;,&quot;wb&quot;);
	if(datei==NULL)
	{
		printf(&quot;Fehler: Konnte Datei nicht oeffnen\n&quot;);
		return 4;		
	}
	returnCode = curl_easy_perform(curl);
	if(returnCode!=CURLE_OK)
	{
		printf(&quot;Fehler: curl_easy_perform(curl)\n&quot;);
		return 5;
	}

	curl_easy_cleanup(curl);

	fclose(datei);
	system(&quot;pause&quot;);
	return 0;
}
</code></pre>
<p>Wenn ich die C-Variante ausführe, steht in der Konsole &quot;Lade herunter...&quot;, das Programm läuft weiter und im Windows-Explorer sehe ich wie eine Datei angelegt wird und die immer größer wird. Passt also...</p>
<p>In der C++ Variante sehe ich auch in der Konsole &quot;Lade herunter...&quot; stehen, aber unmittelbar danach stürzt mir mein Programm ab mit einer Zugriffsverletzung.</p>
<p>Meiner Vermutung nach ist der Knackpunkt eben Zeile 51 im C++ Code.</p>
<pre><code class="language-cpp">returnCode = curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,&amp;Downloader::saveToFile);
</code></pre>
<p>Wenn ich da nur</p>
<pre><code class="language-cpp">returnCode = curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,saveToFile);
</code></pre>
<p>hinschreibe, meckert der Compiler und sagt, ich solle eben <strong>&amp;Downloader::saveToFile</strong> hinschreiben.</p>
<p>Irgendwie funktioniert es ja auch, denn sonst würde die Konsolen-Ausgabe ja nicht kommen.<br />
Aber wieso stürzt es dann ab?</p>
<p>EDIT:<br />
DIe Zeilen</p>
<pre><code>printf(&quot;Fehler: Konnte Datei nicht oeffnen\n&quot;);curl_easy_perform(curl);
</code></pre>
<p>geändert in</p>
<pre><code>printf(&quot;Fehler: Konnte Datei nicht oeffnen\n&quot;);
</code></pre>
<p>... hat aber nichts mit dem Fehler zu tun...</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302413/gelöst-zeiger-auf-memberfunktion-libcurl</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 08:29:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302413.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Apr 2012 09:16:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Zeiger auf Memberfunktion &#x2F; LibCurl on Wed, 18 Apr 2012 14:00:28 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche gerade mich in LibCurl einzuarbeiten. Mit C-Code funktioniert es bisher ganz gut, aber sobald ich die Funktionalität in einer Klasse kapseln möchte, bekomme ich eine Zugriffsverletzung.</p>
<p>Ich vermute, dass ich da was mit dem Zeiger auf die Memberfunktion falsch mache. Ist aber nur eine Vermutung, ich kann mir gerade keinen Reim darauf machen, was da schief läuft.</p>
<p>Hier mal der C-Code</p>
<pre><code class="language-cpp">#include &lt;tchar.h&gt;
#include &quot;curl/curl.h&quot;

FILE* datei;
bool startSaving = true;
size_t saveToFile( char *ptr, size_t size, size_t nmemb, void *userdata);
unsigned int start();

int _tmain(int argc, _TCHAR* argv[])
{
	start();
}

size_t saveToFile( char *ptr, size_t size, size_t nmemb, void *userdata)
{
	if(startSaving)
	{
		startSaving = false;
		printf(&quot;Lade herunter...&quot;);
	}
	fwrite(ptr,size,nmemb,datei);
	return size*nmemb;
}
unsigned int start()
{
	CURLcode returnCode;
	CURL* curl = curl_easy_init( );
	if(curl==NULL)
	{
		printf(&quot;Fehler: curl==NULL\n&quot;);
		return 1;
	}
	returnCode = curl_easy_setopt(curl,CURLOPT_URL,&quot;http://192.168.0.8/install_1.exe&quot;);
	if(returnCode!=CURLE_OK)
	{
		printf(&quot;Fehler: curl_easy_setopt(curl,CURLOPT_URL,\&quot;http://192.168.0.8/install_1.exe\&quot;)\n&quot;);
		return 2;
	}
	returnCode = curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,saveToFile);
	if(returnCode!=CURLE_OK)
	{
		printf(&quot;Fehler: curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,saveToFile)\n&quot;);
		return 3;
	}

	datei = fopen(&quot;D:\\install_1.exe&quot;,&quot;wb&quot;);
	if(datei==NULL)
	{
		printf(&quot;Fehler: Konnte Datei nicht oeffnen\n&quot;);
		return 4;		
	}
	returnCode = curl_easy_perform(curl);
	if(returnCode!=CURLE_OK)
	{
		printf(&quot;Fehler: curl_easy_perform(curl)\n&quot;);
		return 5;
	}

	curl_easy_cleanup(curl);

	fclose(datei);
	system(&quot;pause&quot;);
	return 0;
}
</code></pre>
<p>und hier der entsprechende C++ Code:</p>
<pre><code class="language-cpp">#include &lt;tchar.h&gt;
#include &quot;curl/curl.h&quot;

class Downloader
{
	private:
		FILE* datei;
		bool startSaving;
		size_t saveToFile( char *ptr, size_t size, size_t nmemb, void *userdata);
	public:
		Downloader();
		unsigned int start();
};
Downloader::Downloader()
{
	startSaving = true;
}

int _tmain(int argc, _TCHAR* argv[])
{ 
	Downloader* dl = new Downloader();
	dl-&gt;start();
}

size_t Downloader::saveToFile( char *ptr, size_t size, size_t nmemb, void *userdata)
{
	if(startSaving)
	{
		startSaving = false;
		printf(&quot;Lade herunter...&quot;);
	}
	fwrite(ptr,size,nmemb,datei);
	return size*nmemb;
}
unsigned int Downloader::start()
{
	CURLcode returnCode;
	CURL* curl = curl_easy_init( );
	if(curl==NULL)
	{
		printf(&quot;Fehler: curl==NULL\n&quot;);
		return 1;
	}
	returnCode = curl_easy_setopt(curl,CURLOPT_URL,&quot;http://192.168.0.8/install_1.exe&quot;);
	if(returnCode!=CURLE_OK)
	{
		printf(&quot;Fehler: curl_easy_setopt(curl,CURLOPT_URL,\&quot;http://192.168.0.8/install_1.exe\&quot;)\n&quot;);
		return 2;
	}

	returnCode = curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,&amp;Downloader::saveToFile);
	if(returnCode!=CURLE_OK)
	{
		printf(&quot;Fehler: curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,saveToFile)\n&quot;);
		return 3;
	}

	datei = fopen(&quot;D:\\install_1.exe&quot;,&quot;wb&quot;);
	if(datei==NULL)
	{
		printf(&quot;Fehler: Konnte Datei nicht oeffnen\n&quot;);
		return 4;		
	}
	returnCode = curl_easy_perform(curl);
	if(returnCode!=CURLE_OK)
	{
		printf(&quot;Fehler: curl_easy_perform(curl)\n&quot;);
		return 5;
	}

	curl_easy_cleanup(curl);

	fclose(datei);
	system(&quot;pause&quot;);
	return 0;
}
</code></pre>
<p>Wenn ich die C-Variante ausführe, steht in der Konsole &quot;Lade herunter...&quot;, das Programm läuft weiter und im Windows-Explorer sehe ich wie eine Datei angelegt wird und die immer größer wird. Passt also...</p>
<p>In der C++ Variante sehe ich auch in der Konsole &quot;Lade herunter...&quot; stehen, aber unmittelbar danach stürzt mir mein Programm ab mit einer Zugriffsverletzung.</p>
<p>Meiner Vermutung nach ist der Knackpunkt eben Zeile 51 im C++ Code.</p>
<pre><code class="language-cpp">returnCode = curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,&amp;Downloader::saveToFile);
</code></pre>
<p>Wenn ich da nur</p>
<pre><code class="language-cpp">returnCode = curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,saveToFile);
</code></pre>
<p>hinschreibe, meckert der Compiler und sagt, ich solle eben <strong>&amp;Downloader::saveToFile</strong> hinschreiben.</p>
<p>Irgendwie funktioniert es ja auch, denn sonst würde die Konsolen-Ausgabe ja nicht kommen.<br />
Aber wieso stürzt es dann ab?</p>
<p>EDIT:<br />
DIe Zeilen</p>
<pre><code>printf(&quot;Fehler: Konnte Datei nicht oeffnen\n&quot;);curl_easy_perform(curl);
</code></pre>
<p>geändert in</p>
<pre><code>printf(&quot;Fehler: Konnte Datei nicht oeffnen\n&quot;);
</code></pre>
<p>... hat aber nichts mit dem Fehler zu tun...</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203144</guid><dc:creator><![CDATA[SchlechterInformatiker]]></dc:creator><pubDate>Wed, 18 Apr 2012 14:00:28 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Zeiger auf Memberfunktion &#x2F; LibCurl on Wed, 18 Apr 2012 11:37:37 GMT]]></title><description><![CDATA[<p>Klassenmethoden haben noch einen (im Code nicht sichtbaren) this* Parameter.<br />
Deine Funktionsignatur sieht also in Wirklichkeit so aus:</p>
<p>size_t Downloader::saveToFile(Downloader* this, char *ptr, size_t size, size_t nmemb, void *userdata);</p>
<p>Damit kommt die lib natürlich nicht zurecht. Das Problem kannst du beheben, indem du die Funktion statisch machst, aber dann hast du auch nur wieder eine freie Funktion wie in deinem ersten Beispiel.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203218</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Wed, 18 Apr 2012 11:37:37 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Zeiger auf Memberfunktion &#x2F; LibCurl on Wed, 18 Apr 2012 12:11:03 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">size_t saveToFile( char *ptr, size_t size, size_t nmemb, void *userdata);
</code></pre>
<p>Ratet mal, wozu <code>userdata</code> da ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203238</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 18 Apr 2012 12:11:03 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Zeiger auf Memberfunktion &#x2F; LibCurl on Wed, 18 Apr 2012 14:00:09 GMT]]></title><description><![CDATA[<p>Ei jei jei...</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15576">@KN4CK3R</a>: Das mit dem this-Zeiger habe ich mittlerweile nach stundenlanger Recherche auch mitbekommen. Trotzdem vielen Dank.<br />
Das Problem ist halt, wenn ich die Funktion statisch mache, dann kann ich nicht auf die Variablen des Objekts zugreifen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22298">@TyRoXx</a>: Sehr guter Tip, danke!</p>
<p>Und ich dachte mir für einen Bruchteil einer Sekunde noch: &quot;wie schön wäre es wenn ich einen Zeiger auf mein Objekt als zusätzlichen Parameter übergeben könnte&quot;. Hab aber nicht weiter verfolgt ob und wie man <em><em>void</em> userdata</em>* setzen kann. Hätte nicht gedacht dass ich das irgendwo bestimmen kann was mit <em><em>void</em> userdata</em>* reinkommt - dabei schreit die Bezeichnung &quot;userdata&quot; geradezu danach, individuelle Daten zu übergeben...<br />
Tatsächlich stehts in der Doku drin dass man das setzen kann. We liest ist im Vorteil... Aber ich bin nicht darauf gekommen dass ich das als Zeiger auf mein Objekt verwenden könnte. Damit ist die statische Funktion auch kein Problem mehr.</p>
<p>Also ein einfacher weiterer Aufruf war die Lösung:</p>
<pre><code class="language-cpp">curl_easy_setopt(curl,CURLOPT_WRITEDATA,this);
</code></pre>
<p>und dann eben in saveToFile(...)</p>
<pre><code class="language-cpp">Downloader* dl = (Downloader*)userdata;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2203276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203276</guid><dc:creator><![CDATA[SchlechterInformatiker]]></dc:creator><pubDate>Wed, 18 Apr 2012 14:00:09 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Zeiger auf Memberfunktion &#x2F; LibCurl on Wed, 18 Apr 2012 15:01:34 GMT]]></title><description><![CDATA[<p>SchlechterInformatiker schrieb:</p>
<blockquote>
<p>und dann eben in saveToFile(...)</p>
<pre><code class="language-cpp">Downloader* dl = (Downloader*)userdata;
</code></pre>
</blockquote>
<p>Mach da mal den C-Cast weg, und schreib es mit einem static_cast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203303</guid><dc:creator><![CDATA[krawallbruder]]></dc:creator><pubDate>Wed, 18 Apr 2012 15:01:34 GMT</pubDate></item></channel></rss>