<?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[C Bibliothek mit functionspointern mit c++ Klasse vereinen]]></title><description><![CDATA[<p>Ich habe eine C-Bibliothek von NationalInstruments die eine von einer PCI Karte Daten ausliest. Dabei sorgt der Systemtreiber dafür das in regelmäßigen Abständen eine Funktion aufgerufen wird (aus der Bibliothek) die die Daten entgegennimmt.</p>
<p>Das ganze sieht in C dann so aus (Ausschnitt):</p>
<pre><code class="language-cpp">int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData);
int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData);

int main(void)
{
	...
	DAQmxRegisterEveryNSamplesEvent(taskHandle,
		DAQmx_Val_Acquired_Into_Buffer,
		1000,0,EveryNCallback,NULL);
	DAQmxRegisterDoneEvent(taskHandle,0,DoneCallback,NULL);
	DAQmxStartTask(taskHandle);
	getchar();
	return 0;
}

int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)
{
...
}

int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData)
{
...
}
</code></pre>
<p>Es werden also Functionspointer übergeben mit den Funktionen die später genutzt werden sollen.</p>
<p>Das Format dieser Funktionen ist dabei eindeutig festgelegt als:</p>
<pre><code class="language-cpp">typedef int32 (CVICALLBACK *DAQmxEveryNSamplesEventCallbackPtr)(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData);
typedef int32 (CVICALLBACK *DAQmxDoneEventCallbackPtr)(TaskHandle taskHandle, int32 status, void *callbackData);
</code></pre>
<p>wobei</p>
<pre><code class="language-cpp">#define CVICALLBACK     __cdecl
</code></pre>
<p>Jetzt habe ich aber eine Klassenstruktur und echten C++ Code und möchte dort das ganze integrieren. Ich möchte also aus solchen Funktionen heraus die Ergebnisdaten in der Klasse speichern können. Nur sehe ich nicht wie ich das realisieren sollte ohne das die Funktionen member der Klasse sind.</p>
<p>Bin für jede Idee dankbar.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262204/c-bibliothek-mit-functionspointern-mit-c-klasse-vereinen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 19:47:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262204.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 02 Mar 2010 15:56:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C Bibliothek mit functionspointern mit c++ Klasse vereinen on Tue, 02 Mar 2010 15:56:35 GMT]]></title><description><![CDATA[<p>Ich habe eine C-Bibliothek von NationalInstruments die eine von einer PCI Karte Daten ausliest. Dabei sorgt der Systemtreiber dafür das in regelmäßigen Abständen eine Funktion aufgerufen wird (aus der Bibliothek) die die Daten entgegennimmt.</p>
<p>Das ganze sieht in C dann so aus (Ausschnitt):</p>
<pre><code class="language-cpp">int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData);
int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData);

int main(void)
{
	...
	DAQmxRegisterEveryNSamplesEvent(taskHandle,
		DAQmx_Val_Acquired_Into_Buffer,
		1000,0,EveryNCallback,NULL);
	DAQmxRegisterDoneEvent(taskHandle,0,DoneCallback,NULL);
	DAQmxStartTask(taskHandle);
	getchar();
	return 0;
}

int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)
{
...
}

int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData)
{
...
}
</code></pre>
<p>Es werden also Functionspointer übergeben mit den Funktionen die später genutzt werden sollen.</p>
<p>Das Format dieser Funktionen ist dabei eindeutig festgelegt als:</p>
<pre><code class="language-cpp">typedef int32 (CVICALLBACK *DAQmxEveryNSamplesEventCallbackPtr)(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData);
typedef int32 (CVICALLBACK *DAQmxDoneEventCallbackPtr)(TaskHandle taskHandle, int32 status, void *callbackData);
</code></pre>
<p>wobei</p>
<pre><code class="language-cpp">#define CVICALLBACK     __cdecl
</code></pre>
<p>Jetzt habe ich aber eine Klassenstruktur und echten C++ Code und möchte dort das ganze integrieren. Ich möchte also aus solchen Funktionen heraus die Ergebnisdaten in der Klasse speichern können. Nur sehe ich nicht wie ich das realisieren sollte ohne das die Funktionen member der Klasse sind.</p>
<p>Bin für jede Idee dankbar.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863388</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Tue, 02 Mar 2010 15:56:35 GMT</pubDate></item><item><title><![CDATA[Reply to C Bibliothek mit functionspointern mit c++ Klasse vereinen on Tue, 02 Mar 2010 16:20:42 GMT]]></title><description><![CDATA[<p>Das ist immer wieder das gleiche Schema F. Haben wir hier bestimmt auch schon mehrfach beschrieben.</p>
<p>Du gibst nicht nur einen Funktionszeiger an, sondern kannst auch einen beliebigen void* übergeben, der von der API einfach weitergereicht wird.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">struct foo {
  int mehrdaten;
  int32 blah(TaskHandle, int32);
};

extern &quot;C&quot; {
   int32 CVICALLBACK mein_DoneCallback(
         TaskHandle taskHandle,
         int32 status,
         void *callbackData)
   {
      return static_cast&lt;foo*&gt;(callbackData)-&gt;blah(taskHandle,status);
   }
}

int main() {
   ...
   foo f;
   ...
   DAQmxRegisterDoneEvent(taskHandle,0,mein_DoneCallback,&amp;f);
   ...                                                   ^^
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1863411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863411</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 02 Mar 2010 16:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to C Bibliothek mit functionspointern mit c++ Klasse vereinen on Tue, 02 Mar 2010 16:27:29 GMT]]></title><description><![CDATA[<p>Wichtig dabei ist, dass man bei den Zeigerkonvertierungen aufpasst. Angenommen, X sei eine Basisklasse und Y davon abgeleitet, dann gilt:</p>
<pre><code>X* -------&gt; void* -&gt; X*  (OK)
Y* -------&gt; void* -&gt; X*  (NICHT OK)
Y* -&gt; X* -&gt; void* -&gt; X*  (OK)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1863416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863416</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 02 Mar 2010 16:27:29 GMT</pubDate></item><item><title><![CDATA[Reply to C Bibliothek mit functionspointern mit c++ Klasse vereinen on Tue, 02 Mar 2010 16:46:33 GMT]]></title><description><![CDATA[<p>Dann sollte also das hier funktionieren?:</p>
<pre><code class="language-cpp">extern &quot;C&quot; {
    int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle,
                                     int32 everyNsamplesEventType,
                                     uInt32 nSamples,
                                     void *callbackData)
    {
        if (callbackData) {
            static_cast&lt;Task*&gt;(callbackData)-&gt;readData();
        }
        return 0;
    }
}

void Task::run()
{
    DAQmxRegisterEveryNSamplesEvent(d-&gt;taskHandle,DAQmx_Val_Acquired_Into_Buffer,1000,0,EveryNCallback,(void *)this);
    //DAQmxRegisterDoneEvent(d-&gt;taskHandle,0,DoneCallback,(void *)this);

    DAQmxStartTask (d-&gt;taskHandle);
}

void Task::readData()
{
...
}
</code></pre>
<p>kompiliert auf jeden Fall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863425</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Tue, 02 Mar 2010 16:46:33 GMT</pubDate></item></channel></rss>