<?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] Problem mit Funktionszeiger]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes würde ich gerne umsetzen, doch leider bekomme ich die Sache mit den Funktionszeigern nicht in den Griff.</p>
<p>Ich habe 2 Klassen, Klasse1 und Klasse2.</p>
<p>In Klasse1 erzeuge ich ein Objekt von Klasse2. Ich möchte nun einer Funktion in in Klasse2, welche Klasse1 ja nicht kennt, einen Funktionszeiger einer Funktion aus Klasse1 übergeben, welche die Klasse2 bei Eintreten eines bestimmten Ereignisses aufruft.</p>
<p>Ist so etwas überhaupt umzusetzen?</p>
<p>z.B. (Code ungetestet - nur ein Beispiel)</p>
<pre><code class="language-cpp">#include &quot;Klasse2.h&quot;

class Klasse1
{
public:
   Klasse1();
   void incommingData(){ //foobar z.B. Ausgaben }; // Die Funktion evtl. Private??

private:
   Klasse2 kl2;
};

Klasse1::Klasse1()
{
   kl2.sindDieDatenDa(incommingData);
}
</code></pre>
<pre><code class="language-cpp">class Klasse2
{

public:
   sindDieDatenDa(void callBack())
   {
      // ....
      if(irgendwas)  // irgendein Event ist eingetreten. Daten am COM-Port empfangen
      {
         callBack(); 
      };
   }
};
</code></pre>
<p>Danke schon mal für eure Hilfe!!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/215265/gelöst-problem-mit-funktionszeiger</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 07:53:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215265.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 08 Jun 2008 15:27:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Tue, 10 Jun 2008 17:26:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes würde ich gerne umsetzen, doch leider bekomme ich die Sache mit den Funktionszeigern nicht in den Griff.</p>
<p>Ich habe 2 Klassen, Klasse1 und Klasse2.</p>
<p>In Klasse1 erzeuge ich ein Objekt von Klasse2. Ich möchte nun einer Funktion in in Klasse2, welche Klasse1 ja nicht kennt, einen Funktionszeiger einer Funktion aus Klasse1 übergeben, welche die Klasse2 bei Eintreten eines bestimmten Ereignisses aufruft.</p>
<p>Ist so etwas überhaupt umzusetzen?</p>
<p>z.B. (Code ungetestet - nur ein Beispiel)</p>
<pre><code class="language-cpp">#include &quot;Klasse2.h&quot;

class Klasse1
{
public:
   Klasse1();
   void incommingData(){ //foobar z.B. Ausgaben }; // Die Funktion evtl. Private??

private:
   Klasse2 kl2;
};

Klasse1::Klasse1()
{
   kl2.sindDieDatenDa(incommingData);
}
</code></pre>
<pre><code class="language-cpp">class Klasse2
{

public:
   sindDieDatenDa(void callBack())
   {
      // ....
      if(irgendwas)  // irgendein Event ist eingetreten. Daten am COM-Port empfangen
      {
         callBack(); 
      };
   }
};
</code></pre>
<p>Danke schon mal für eure Hilfe!!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525221</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Tue, 10 Jun 2008 17:26:16 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Sun, 08 Jun 2008 15:39:01 GMT]]></title><description><![CDATA[<p>Das geht grunsätzlich. Allerdings funktionieren Member Funktionszeiger nicht so trivial, wie normale Funktionszeiger. Zusätzlich brauchst du noch ein Objekt, auf welches du diesen anwenden kannst.</p>
<p>Dazu findet man aber hier im Forum, sowie bei google recht viel.</p>
<p>z.B:<br />
<a href="http://www.newty.de/fpt/index.html" rel="nofollow">http://www.newty.de/fpt/index.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525226</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 08 Jun 2008 15:39:01 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 05:54:14 GMT]]></title><description><![CDATA[<p>Hallo drakon,</p>
<p>danke für deine fixe Antwort. Habe gestern noch mal ein bißchen deinen Link angeschaut, Tante Google befragt und auch ein entsprechendes Beispiel gefunden und mir daraus in etwa folgendes gebaut:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class B;

typedef int (B::*funptr) (int);

class A {
 private:
  funptr ptr;
 public:
  void callFunction(funptr p, B* obj) { ptr = p; (*obj.*ptr)(); }
};

class B {
 public:
  int callHallo() { std::cout &lt;&lt; &quot;Hallo Welt!\n&quot;; }

  void run() 
  {
    A* obj = new A;
    obj-&gt;callFunction(&amp;B::callHallo(), this);
  }
};

int main() {
  B* obj = new B;
  obj-&gt;run();
}
</code></pre>
<p>Quelle: <a href="http://www.informatik-forum.at/showthread.php?t=15545" rel="nofollow">http://www.informatik-forum.at/showthread.php?t=15545</a></p>
<p>Da irgendwas nicht funktioniert hat (Programmabsturz beim Funktionsaufruf via Funktionszeiger), habe ich mal ein paar Ausgaben eingebaut. Der This-Pointer welcher an die Funktion &quot;callFunction()&quot; der Klasse A übergeben wird ist dort 0 und verursacht deshalb wohl den Absturz. Kanns mir irgendwie nicht erklären!?!?</p>
<p>Weißt du Rat?</p>
<p>Danke und sonnige Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525468</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Mon, 09 Jun 2008 05:54:14 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 05:59:22 GMT]]></title><description><![CDATA[<p>Stonecold_Mario schrieb:</p>
<blockquote>
<p>Da irgendwas nicht funktioniert hat (Programmabsturz beim Funktionsaufruf via Funktionszeiger), habe ich mal ein paar Ausgaben eingebaut.</p>
</blockquote>
<p>Du meinst, du konntest diesen Code kompilieren? Du musst einen sehr nachlässigen Compiler haben. Da sind drei Fehler drin:</p>
<p>- funptr passt nicht auf callHallo, weil die Parameter nicht übereinstimmen.<br />
- In callHallo fehlt eine return-Anweisung<br />
- Wenn du callHallo als Methodenzeiger übergibst, darfst du dahinter keine Klammern setzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525469</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 09 Jun 2008 05:59:22 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 06:26:28 GMT]]></title><description><![CDATA[<p>Hallo MFK,</p>
<p>danke für deine Antwort. Nein du hast recht, das hätte mein Kompiler natürlich auch nicht gebaut. Ich habe den Code aus der Quelle genommen und versucht ihn so anzupassen, dass er in etwa dem meinigen gleicht. Kompiliert habe ich ihn natürlich nicht. Hier mal ein kleine Korrektur:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class B;

typedef void (B::*funptr) (void);

class A {
 private:
  funptr ptr;
 public:
  void callFunction(funptr p, B* obj) { ptr = p; (*obj.*ptr)(); }
};

class B {
 public:
  void callHallo() { std::cout &lt;&lt; &quot;Hallo Welt!\n&quot;; }

  void run()
  {
    A* obj = new A;
    obj-&gt;callFunction(&amp;B::callHallo, this);
  }
};

int main() {
  B* obj = new B;
  obj-&gt;run();
}
</code></pre>
<p>So ist es vielleicht besser. Kann es leider gerade nicht kompilieren. Solltest du also noch einen Fehler finden kannst du ihn ja vielleicht selber eben fixen.</p>
<p>So nun aber zu meinem Problem, dass immer noch nicht gelöst ist. Weißt du Rat?</p>
<p>Gruß,<br />
Mario</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525475</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Mon, 09 Jun 2008 06:26:28 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 06:41:21 GMT]]></title><description><![CDATA[<p>Stonecold_Mario schrieb:</p>
<blockquote>
<p>So nun aber zu meinem Problem, dass immer noch nicht gelöst ist. Weißt du Rat?</p>
</blockquote>
<p>Nein. Der gezeigte Code funktioniert. Wenn du &quot;angepassten&quot; oder &quot;Beispiel&quot;-Code zeigst, solltest du sicherstellen, dass dieser Code auch das Fehlverhalten reproduziert. Ansonsten bringt das gar nichts.</p>
<p>So kann man nur vermuten, dass du im <em>echten</em> Code etwas falsch machst, diesen Fehler aber nicht in deine Beispiele überträgst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525479</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 09 Jun 2008 06:41:21 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 06:49:17 GMT]]></title><description><![CDATA[<p>Okay danke dir. Werde nachher nochmal den Beispielcode und auch meinen eigenen testen und mich dann wieder melden. Evtl. versuche ich mal meinen den betreffenden Teil meines Codes zu posten.</p>
<p>Gruß,<br />
Mario</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525482</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Mon, 09 Jun 2008 06:49:17 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 18:22:05 GMT]]></title><description><![CDATA[<p>Hallo MFK,</p>
<p>ich habe den Beispielcode von heute morgen mal probiert und dieser läuft bei mir auch. Sorry hatte gehofft, dass er den selben Fehler produziert. Mein Fehler ist aber immer noch da und ich weiß nicht so recht warum. Bin gerade dabei eine Lib für die Kommunikation mit ner Seriellen Schnittstelle zu bauen. Ich weiß, vergleichbares gibt es im Netz aber gerne auch verstehen was ich benutze und deshalb versuche ich es halt selber mal. Im Grunde funktioniert auch alles so weit nur die Sache mit dem Funktionszeiger nicht. Würde dir gerne das kleine Projekt mal zukommen lassen doch leider kann ich dem Beitrag scheinbar nicht anhängen.</p>
<p>Soll ich den kompletten Code hier posten?</p>
<p>Gruß,<br />
Mario</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525953</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Mon, 09 Jun 2008 18:22:05 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 18:25:58 GMT]]></title><description><![CDATA[<p>versuche den code soweit wie möglich zu kürzen, so dass der fehler aber trotzdem noch auftritt.<br />
ach, und poste zuallererst mal die fehlermeldung, die dir dein compiler ausgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525956</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Mon, 09 Jun 2008 18:25:58 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 18:41:37 GMT]]></title><description><![CDATA[<p>Okay hier mal der Code. BasisThread ist wie der Name schon sagt eine Basisklasse für einen Win32-Thread.</p>
<p>ReceiverThread.h</p>
<pre><code class="language-cpp">#ifndef RECEIVERTHREAD_H
#define RECEIVERTHREAD_H

#include &lt;windows.h&gt;

#include &quot;BasisThread.h&quot;

class SerialCommunicator;
typedef void (SerialCommunicator::*funptr) (void);

class ReceiverThread : public BasisThread
{
public:
	ReceiverThread();
	~ReceiverThread();

	void setData(HANDLE* inHandle, OVERLAPPED* inReadOverlapped, funptr p, SerialCommunicator* obj);

protected:
	virtual int run(void);

private: 
	HANDLE*		h_comm;
	OVERLAPPED*	m_readOverlapped;
	//void		callBack();	

	funptr ptr;
};

#endif // RECEIVERTHREAD_H
</code></pre>
<p>ReceiverThread.cpp</p>
<pre><code class="language-cpp">#include &quot;ReceiverThread.h&quot;

#include &lt;iostream&gt;

ReceiverThread::ReceiverThread() : BasisThread()
{

}

ReceiverThread::~ReceiverThread()
{

}

void ReceiverThread::setData(HANDLE* inHandle, OVERLAPPED* inReadOverlapped,  funptr p, SerialCommunicator* obj)
{
	ptr = p;
	std::cout &lt;&lt; &quot;ReceiverThread::setData(): obj = &quot; &lt;&lt; obj &lt;&lt; &quot; fun = &quot; &lt;&lt; p &lt;&lt; std::endl;
	(*obj.*ptr)();
	THREAD_SAFE_ACCESS
	{
		h_comm				= inHandle;
		m_readOverlapped	= inReadOverlapped;
	}
	END_THREAD_ACCESS
}

int ReceiverThread::run(void)
{
	while(1)
	{
           // Aufgabenerfüllung

	}
}
</code></pre>
<p>SerialCommunication.h</p>
<pre><code class="language-cpp">#ifndef SERIALCOMMUNICATION_H
#define SERIALCOMMUNICATION_H

#include &lt;windows.h&gt;

static const unsigned int RECEIVEBUFFER_LENGTH	= 256; 
static const unsigned int COMPORT_LENGTH		= 8;
static const unsigned int PREFIX_LENGTH			= 8;

// forward declaration
class ReceiverThread;

class Publisher
{
public:
	virtual void dataReceived() = 0; // callback if data received on COM-Port 
};

class SerialCommunicator
{

public:
	static enum sc_parity
	{
		sc_parity_evenparity = 0,
		sc_parity_markparity,
		sc_parity_noparity,
		sc_parity_oddparity,
		sc_parity_spaceparity
	};

	static enum sc_stopbits
	{
		sc_stopbits_onestopbit = 0,
		sc_stopbits_one5stopbit,
		sc_stopbits_twostopbit
	};

	SerialCommunicator(Publisher* pubObj);
	~SerialCommunicator();

	HANDLE openCommunication(const char* port);

	BOOL		setDCB(	HANDLE handle, 
						const int baudrate		= 9600, 
						const int bytesize		= 8, 
						sc_parity parity		= sc_parity_noparity, 
						sc_stopbits stopbits	= sc_stopbits_onestopbit);

	BOOL		setTimeOuts( unsigned int readIntervalTimeOut			= 100,
							 unsigned int readTotalTimeoutMultiplier	= 0,
							 unsigned int readTotalTimeoutConstant		= 1,
							 unsigned int writeTotalTimeoutMultiplier	= 0,
							 unsigned int writeTotalTimeoutConstant		= 0 );

	int			sendData( bool&amp; isWritten, 
						  const char* msg = NULL, 
						  bool withPrefix = false);

	char*		receiveData( int&amp; noOfReceivedBytes, 
							 BOOL&amp; isRead);

	const char* getComPort(); 

	BOOL		closeCommunication(HANDLE handle);
	void		incommingData();

private:

	HANDLE			h_comm;
	DCB				m_dcb;
	COMMTIMEOUTS	m_timeOuts;
	ReceiverThread* t_receiverThread;
	OVERLAPPED      m_readOverlapped;
	OVERLAPPED      m_writeOverlapped;
	char			m_comPort[COMPORT_LENGTH];
	char			m_progPrefix[PREFIX_LENGTH];
	Publisher*		p_publisherObject;
	char			m_receiveBuffer[RECEIVEBUFFER_LENGTH];
};

#endif //SERIALCOMMUNICATION_H
</code></pre>
<p>SerialCommunication.cpp</p>
<pre><code class="language-cpp">#include &quot;SerialCommunication.h&quot;

#include &lt;iostream&gt;
#include &lt;sstream&gt;

#include &quot;ReceiverThread.h&quot;

SerialCommunicator::SerialCommunicator(Publisher* pubObj) //: p_publisherObject(pubObj)
{
	p_publisherObject = static_cast&lt;Publisher*&gt;(pubObj); 
	memset(&amp;m_dcb, 0, sizeof(m_dcb));
	memset(&amp;m_timeOuts, 0, sizeof(m_timeOuts));
	memset(m_comPort, '\0', COMPORT_LENGTH);
	memset(&amp;m_readOverlapped, 0 ,sizeof(m_readOverlapped));
	memset(&amp;m_writeOverlapped, 0 ,sizeof(m_writeOverlapped));

	m_readOverlapped.hEvent		= CreateEvent( NULL, FALSE, FALSE, NULL ); 
	m_writeOverlapped.hEvent	= CreateEvent( NULL, FALSE, FALSE, NULL ); 

	h_comm				= INVALID_HANDLE_VALUE; // Initialisierung des Handle
	t_receiverThread	= new ReceiverThread();

	m_progPrefix[0] = char(0xE6);
	m_progPrefix[1] = char(0xB5);
	m_progPrefix[2] = char(0xBA);
	m_progPrefix[3] = char(0xB9);
	m_progPrefix[4] = char(0xB2);
	m_progPrefix[5] = char(0xB3);
	m_progPrefix[6] = char(0xA9);
	m_progPrefix[7] = '\0';
}

SerialCommunicator::~SerialCommunicator()
{
	closeCommunication(h_comm);
	delete t_receiverThread;
}

HANDLE SerialCommunicator::openCommunication(const char* port)
{
	closeCommunication(h_comm);
	strncpy_s(m_comPort, COMPORT_LENGTH -1, port,  COMPORT_LENGTH -1);

	h_comm = CreateFile( m_comPort, 
						  GENERIC_READ | GENERIC_WRITE, 
						  0, 
						  0,
						  OPEN_EXISTING,
						  FILE_FLAG_OVERLAPPED, // 0, ++++++++ WAS MACHT DAS FILE_FLAG_OVERLAPPED
						  0);

	if (h_comm == INVALID_HANDLE_VALUE)
	{

		//int error = GetLastError();
		CloseHandle(h_comm);
		return NULL;
	}
	else 
	{	
 		t_receiverThread-&gt;setData(&amp;h_comm, &amp;m_readOverlapped, &amp;SerialCommunicator::incommingData, this);
		std::cout &lt;&lt; &quot;SerialCommunicator::openCommunication(): obj = &quot; &lt;&lt; this &lt;&lt; &quot; fun = &quot; &lt;&lt; &amp;SerialCommunicator::incommingData &lt;&lt; std::endl;
		t_receiverThread-&gt;startThread();
		return h_comm;
	}
}

int SerialCommunicator::sendData(bool&amp; isWritten, const char* msg, bool withPrefix)
{
	std::ostringstream sstr;
	if(withPrefix)
	{
		sstr &lt;&lt; m_progPrefix &lt;&lt; msg;
		/*std::cout &lt;&lt; sstr.str().c_str() &lt;&lt; &quot; --- &quot; &lt;&lt; m_progPrefix &lt;&lt; &quot; --- &quot; &lt;&lt; msg &lt;&lt; std::endl;*/
	}
	else
	{
		sstr &lt;&lt; msg;
	}

	DWORD numberOfBytesWritten;
	if(WriteFile(h_comm, sstr.str().c_str(), sstr.str().length(), &amp;numberOfBytesWritten, &amp;m_writeOverlapped))
	{
		isWritten = true;
	}
	else
	{ 
		if(ERROR_IO_PENDING == GetLastError())
		{
			if( WAIT_OBJECT_0 == WaitForSingleObject( m_writeOverlapped.hEvent, 200 ) ) 
			{
				isWritten = true;
			}
			else 
			{
				isWritten = false;
			} 	
		}
		else
		{
			isWritten = false;
		}
	}
	return numberOfBytesWritten;
}

char* SerialCommunicator::receiveData(int&amp; noOfReceivedBytes, BOOL&amp; isRead)
{
	memset(m_receiveBuffer, '\0', RECEIVEBUFFER_LENGTH);
	DWORD NumberOfBytesRead;

	if(ReadFile(h_comm, m_receiveBuffer, RECEIVEBUFFER_LENGTH-1, &amp;NumberOfBytesRead, &amp;m_readOverlapped))
	{
		isRead = true;
	}
	else
	{
		if(ERROR_IO_PENDING == GetLastError())
		{
			if( WAIT_OBJECT_0 == WaitForSingleObject( m_readOverlapped.hEvent, 200 ) ) 
			{
				isRead = true;
			}
			else 
			{
				isRead = false;
			} 	
		}
		else
		{
			isRead = false;
		}
	}
	noOfReceivedBytes = NumberOfBytesRead;
	return m_receiveBuffer;
}

BOOL SerialCommunicator::setDCB(HANDLE hCom, const int baudrate, const int bytesize, sc_parity parity, sc_stopbits stopbits)
{
	//BOOL fSuccess = GetCommState(h_comm, &amp;m_dcb);
	m_dcb.BaudRate = baudrate;
	m_dcb.ByteSize = bytesize;

	switch(parity)
	{
		case sc_parity_evenparity:	m_dcb.Parity = EVENPARITY;	break;
		case sc_parity_markparity:	m_dcb.Parity = MARKPARITY;	break;
		case sc_parity_noparity:	m_dcb.Parity = NOPARITY;	break;
		case sc_parity_oddparity:	m_dcb.Parity = ODDPARITY;	break;
		case sc_parity_spaceparity: m_dcb.Parity = SPACEPARITY;	break;
		default:					m_dcb.Parity = NOPARITY;	break;
	}

	switch(stopbits)
	{
		case sc_stopbits_onestopbit:	m_dcb.StopBits = ONESTOPBIT;	break;
		case sc_stopbits_one5stopbit:	m_dcb.StopBits = ONE5STOPBITS;	break;
		case sc_stopbits_twostopbit:	m_dcb.StopBits = TWOSTOPBITS;	break;
		default:						m_dcb.StopBits = ONESTOPBIT;	break;
	}

	return SetCommState(h_comm, &amp;m_dcb);
}

BOOL SerialCommunicator::setTimeOuts( unsigned int readIntervalTimeOut,
									  unsigned int readTotalTimeoutMultiplier,
									  unsigned int readTotalTimeoutConstant,
									  unsigned int writeTotalTimeoutMultiplier,
									  unsigned int writeTotalTimeoutConstant )
{
	m_timeOuts.ReadIntervalTimeout			= readIntervalTimeOut;
	m_timeOuts.ReadTotalTimeoutMultiplier	= readTotalTimeoutMultiplier;
	m_timeOuts.ReadTotalTimeoutConstant		= readTotalTimeoutConstant;

	m_timeOuts.WriteTotalTimeoutMultiplier	= writeTotalTimeoutMultiplier;
	m_timeOuts.WriteTotalTimeoutConstant	= writeTotalTimeoutConstant;

	return SetCommTimeouts(h_comm,&amp;m_timeOuts);
}

const char* SerialCommunicator::getComPort()
{
	return m_comPort;
}

BOOL SerialCommunicator::closeCommunication(HANDLE handle)
{
	t_receiverThread-&gt;killThread();

	BOOL retVal = true;
	//if(handle != INVALID_HANDLE_VALUE)
	//{
		retVal	= CloseHandle(handle);
		handle	= INVALID_HANDLE_VALUE;
	//}
	return retVal;
}

void SerialCommunicator::incommingData()
{
	std::cout &lt;&lt; &quot;############################\n&quot;;
	p_publisherObject-&gt;dataReceived();
}
</code></pre>
<p>Ich habe versucht nur das Notwendigste zu posten. Kann sein dass irgendwo noch ne Klammer fehlt oder so. Das VS2005 Projekt kann ich per Mail verschicken.</p>
<p>Das Problem findet sich in ReceiverThread::setData(...);</p>
<p>Danke für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525974</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Mon, 09 Jun 2008 18:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 18:44:17 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p>versuche den code soweit wie möglich zu kürzen, so dass der fehler aber trotzdem noch auftritt.<br />
<strong>ach, und poste zuallererst mal die fehlermeldung, die dir dein compiler ausgibt.</strong></p>
</blockquote>
<p>340 Zeilen sind nicht sehr gekürzt..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525977</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 09 Jun 2008 18:44:17 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 18:44:22 GMT]]></title><description><![CDATA[<p>Der Kompiler gibt keine Fehlermeldung aus. Alles lässt sich wunderbar bauen.</p>
<p>Wenn ich in in der setData-Funktion von ReceiverThread bin, ist der übergebene this-Pointer (hier *obj) gleich 0.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525978</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Mon, 09 Jun 2008 18:44:22 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 18:50:41 GMT]]></title><description><![CDATA[<p>Stonecold_Mario schrieb:</p>
<blockquote>
<p>Der Kompiler gibt keine Fehlermeldung aus. Alles lässt sich wunderbar bauen.</p>
<p>Wenn ich in in der setData-Funktion von ReceiverThread bin, ist der übergebene this-Pointer (hier *obj) gleich 0.</p>
</blockquote>
<p>Na dann schau mal, wieso der 0 ist. (Dann musst du aber zum Aufrufer von setData gehen.</p>
<p>Also hier:<br />
SerialCommunicator::openCommunication</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525988</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 09 Jun 2008 18:50:41 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 18:56:45 GMT]]></title><description><![CDATA[<p>Sicher, nur sehe ich nicht warum this nun 0 ist.</p>
<pre><code class="language-cpp">t_receiverThread-&gt;setData(&amp;h_comm, &amp;m_readOverlapped, &amp;SerialCommunicator::incommingData, this);
std::cout &lt;&lt; &quot;SerialCommunicator::openCommunication(): obj = &quot; &lt;&lt; this &lt;&lt; &quot; fun = &quot; &lt;&lt; &amp;SerialCommunicator::incommingData &lt;&lt; std::endl;
</code></pre>
<p>Die Ausgabe zeigt ja eine Objektadresse != 0</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1525996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1525996</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Mon, 09 Jun 2008 18:56:45 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 19:00:29 GMT]]></title><description><![CDATA[<p>Wenn du da mit dem Debuger Schrit für Schritt dann in die Funktion reingehst, und vorher die Adresse nicht 0 hast und beim nächsten Schritt ist in der Funktion 0? - Kann ich mir nur schwer vorstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526001</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 09 Jun 2008 19:00:29 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 19:11:22 GMT]]></title><description><![CDATA[<p>Nur mal die Sachen die aufgefallen sind.</p>
<p><strong>Funktionsaufruf:</strong></p>
<p><strong>this</strong> 0x009f5110 {h_comm=0x00000ee4 m_dcb={...} m_timeOuts={...} ...} SerialCommunicator * const</p>
<p><strong>h_comm</strong> 0x00000ee4 void *</p>
<p><strong>t_receiverThread</strong> 0x009f4d68 {h_comm=0xcdcdcdcd m_readOverlapped=0xcdcdcdcd ptr=0xcdcdcdcd } ReceiverThread *</p>
<p><strong>p_publisherObject</strong> 0x009938dc {serialCom=0x009f5110 hCom=0xffffffff } Publisher *</p>
<p><strong>Nächster Schritt:</strong><br />
<strong>obj</strong> 0x00000000 {h_comm=??? m_dcb={...} m_timeOuts={...} ...} SerialCommunicator *</p>
<p><strong>h_comm</strong> CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden</p>
<p><strong>t_receiverThread</strong> CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden</p>
<p><strong>p_publisherObject</strong> CXX0017: Fehler: Symbol &quot;&quot; nicht gefunden</p>
<p>Ich erkenne ein Problem. Weiß aber nicht warum es da ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526011</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Mon, 09 Jun 2008 19:11:22 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 19:31:29 GMT]]></title><description><![CDATA[<p>Sind bezüglich der Meldungen im Debugger nur keine vernünftigen Debuginfos für die Lib erstellt worden? Wo kann ich das im VC2005 für die statische Lib einstellen (/DEBUG)? Linkereinstellungen gibt es für die Lib ja nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526023</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Mon, 09 Jun 2008 19:31:29 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 20:12:48 GMT]]></title><description><![CDATA[<p>Okay ich habe hier nochmal das Beispiel von heute morgen so gebaut, dass ebenfalls der selbe Fehler auftritt. Ist jetzt vielleicht einfacher nachzuvollziehen. Ich werde nicht schlau.</p>
<p>A.h</p>
<pre><code class="language-cpp">#ifndef A_H
#define A_H

class B; 

typedef void (B::*funptr) (void); 

class A { 
 private: 
  funptr ptr; 
 public: 
	 void callFunction(funptr p, B* obj);
}; 

#endif // A_H
</code></pre>
<p>A.cpp</p>
<pre><code class="language-cpp">#include &quot;A.h&quot;

void A::callFunction(funptr p, B* obj) { ptr = p; (*obj.*ptr)(); }
</code></pre>
<p>B.h</p>
<pre><code class="language-cpp">#ifndef B_H
#define B_H

class B { 
 public: 
  void callHallo();

  void run();
};

#endif // B_H
</code></pre>
<p>B.cpp</p>
<pre><code class="language-cpp">#include &quot;B.h&quot;

#include &lt;iostream&gt; 
#include &quot;A.h&quot;

void B::callHallo() { std::cout &lt;&lt; &quot;Hallo Welt!\n&quot;; } 

void B::run() 
{ 
A* obj = new A; 
obj-&gt;callFunction(&amp;B::callHallo, this); 
}
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &quot;B.h&quot;

int main() { 
  B* obj = new B; 
  obj-&gt;run(); 
}
</code></pre>
<p>Es scheint problematisch zu sein, wenn die Funktion callFunction der Klassen A in einer seperaten cpp-Datei implementiert wird. <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>
<p>Schönen Abend noch!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526044</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Mon, 09 Jun 2008 20:12:48 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Mon, 09 Jun 2008 21:17:18 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &quot;A.h&quot; //zuerst
#include &quot;B.h&quot;

#include &lt;iostream&gt;

void B::callHallo() { std::cout &lt;&lt; &quot;Hallo Welt!\n&quot;; }

void B::run()
{
A* obj = new A;
obj-&gt;callFunction(&amp;B::callHallo, this);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1526082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526082</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 09 Jun 2008 21:17:18 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Tue, 10 Jun 2008 17:28:23 GMT]]></title><description><![CDATA[<p>Wow danke,</p>
<p>genau das war das Problem. Jetzt funktioniert es auch bei meinen Prog.<br />
Da wäre ich so schnell nicht drauf gekommen, wenn überhaupt.</p>
<p>Was genau ist jetzt das Problem gewesen. Warum ist es wichtig die Reihenfolge der Includes zu beachten?</p>
<p>Nochmal danke und Gruß,<br />
Mario</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526559</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Tue, 10 Jun 2008 17:28:23 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Tue, 10 Jun 2008 17:38:53 GMT]]></title><description><![CDATA[<p>Stonecold_Mario schrieb:</p>
<blockquote>
<p>Warum ist es wichtig die Reihenfolge der Includes zu beachten?</p>
</blockquote>
<p>Ist es eigentlich nicht. Du könntest ein Problem mit einer nicht standardgemäßen Optimierung deines Compilers haben (etwa Visual C++: benutz zur Sicherheit den Schalter /vmg). Das Problem würde dann auch nicht auftreten, wenn du Zeiger auf Member nie deklarierst, bevor die betreffende Klasse definiert wurde (was meistens möglich ist; hier: vor der Klassendefinition von A den Header für B einbinden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526563</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 10 Jun 2008 17:38:53 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Tue, 10 Jun 2008 17:47:07 GMT]]></title><description><![CDATA[<p>Okay danke!</p>
<p>Wie bist du darauf gekommen einfach die Includes zu vertauschen?</p>
<p>Das Programmstück welches ich dort gerade baue ist eine statische Lib. Deshalb wollte ich in jedem Fall vermeiden einen Nicht-Standard-Header zu includieren.<br />
Bin echt froh, dass das Problem vom Tisch ist, hat echt aufgehalten.</p>
<p>Nochmal danke auch an all die Anderen, die sich mit dem Problem beschäftigt haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526572</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Tue, 10 Jun 2008 17:47:07 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Tue, 10 Jun 2008 17:53:16 GMT]]></title><description><![CDATA[<p>Stonecold_Mario schrieb:</p>
<blockquote>
<p>Das Programmstück welches ich dort gerade baue ist eine statische Lib. Deshalb wollte ich in jedem Fall vermeiden einen Nicht-Standard-Header zu includieren.</p>
</blockquote>
<p>Das spielt doch keine Rolle. Es müssen ja so oder so beide Teile vorhanden sein, sonst kann das gar nicht funktionieren. Was unbedingt ferngehalten werden muss, sind Sachen, die mal gar nichts mit deinem Projekt zu tun haben. Respektive nicht zur lib gehören.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526576</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 10 Jun 2008 17:53:16 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Problem mit Funktionszeiger on Tue, 10 Jun 2008 18:07:56 GMT]]></title><description><![CDATA[<p>Ja, aber so reicht es jetzt für weitere Projekte aus, den Header der Lib und die .lib selber zu haben. Ansonsten hätte ich mindestens noch den Klasse B Header benötigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1526589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1526589</guid><dc:creator><![CDATA[Stonecold_Mario]]></dc:creator><pubDate>Tue, 10 Jun 2008 18:07:56 GMT</pubDate></item></channel></rss>