<?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[Statisches Attribut sorgt für Segmentation Fault vor (!) der Main]]></title><description><![CDATA[<p>Hallo,</p>
<p>beim Erstellen eines geeigneten Parsers mit der Apache Xerces Bibliothek (SAX) für ein bestimmtes XML-Format ist mir eine bisher noch nicht begegnete Eigenart in C++ (oder gar Xerces?) untergekommen. Wenn ich Attribute des Typs XercesString (Entnommen aus <a href="http://www.ibm.com/developerworks/xml/library/x-xercc/" rel="nofollow">http://www.ibm.com/developerworks/xml/library/x-xercc/</a>) in meinem eigenen Handler (erbt von der Xerces-Klasse &quot;DefaultHandler&quot;) als statisch deklariere, erhalte ich nach erfolgreichem Kompilieren und Starten einen Segmentation Fault, der vor (!) der Main-Funktion auftritt. Sinn des Ganzen soll eine Optimierung des Codes sein. Jedenfalls funktionieren diese Attribute als nicht-statische Elemente der Klasse einwandfrei. Richtig deklariert und vor allem initialisiert sollten diese statischen Attribute sein. Jedenfalls geht es ohne Weiteres mit dem Typ std::string aus der STL. Wie kann es also sein, dass ein einzelnes statisches Attribut einen solch fatalen Fehler auslöst?</p>
<p>Ich bin dankbar für jede Antwort! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<pre><code class="language-cpp">#ifndef XERCESSTRING_H_
#define XERCESSTRING_H_

#include &lt;util/XMLString.hpp&gt;

namespace Utils {

namespace String {

#ifdef XERCES_CPP_NAMESPACE_USE
XERCES_CPP_NAMESPACE_USE
#endif

class XercesString
{
	XMLCh *_wstr;
public:
	XercesString() : _wstr(0L) { };
	XercesString(const char *str);
	XercesString(XMLCh *wstr);
	XercesString(const XMLCh *wstr);
	XercesString(const XercesString &amp;copy);
	~XercesString();
	bool append(const XMLCh *tail);
	bool erase(const XMLCh *head, const XMLCh *tail);
	const XMLCh* begin() const;
	const XMLCh* end() const;
	int size() const;
	XMLCh &amp; operator [] (const int i);
	const XMLCh operator [] (const int i) const;
	operator const XMLCh * () const { return _wstr; };
	void operator = (const char *str) { _wstr = XMLString::transcode(str); }
};

}

}

#endif /* XERCESSTRING_H_ */
</code></pre>
<pre><code class="language-cpp">#include &quot;XercesString.h&quot;

namespace Utils {

namespace String {

	XercesString::XercesString(const char *str) : _wstr(NULL)
	{
	  _wstr = XMLString::transcode(str);
	}

	XercesString::XercesString(XMLCh *wstr) : _wstr(wstr) { };

	XercesString::XercesString(const XMLCh *wstr) : _wstr(NULL)
	{
	  _wstr = XMLString::replicate(wstr);
	}

	XercesString::XercesString(const XercesString &amp;right) : _wstr(NULL)
	{
	  _wstr = XMLString::replicate(right._wstr);
	}

	XercesString::~XercesString()
	{
	  // thanks tinny!!
	  if (_wstr) XMLString::release(&amp;_wstr);
	}

	bool XercesString::append(const XMLCh *tail)
	{
	  int iTailLen = XMLString::stringLen(tail);
	  int iWorkLen = XMLString::stringLen(_wstr);
	  XMLCh *result = new XMLCh[ iWorkLen + iTailLen + 1 ];
	  bool bOK = result != NULL;
	  if (bOK)
	  {
		XMLCh *target = result;
		XMLString::moveChars(target, _wstr, iWorkLen);
		target += iWorkLen;
		XMLString::moveChars(target, tail, iTailLen);
		target += iTailLen;
		*target++ = 0;
		XMLString::release(&amp;_wstr);
		_wstr = result;
	  }
	  return bOK;
	}

	bool XercesString::erase(const XMLCh *head, const XMLCh *tail)
	{
	  bool bOK = head &lt;= tail &amp;&amp; head &gt;= begin() &amp;&amp; tail &lt;= end();
	  if (bOK)
	  {
		XMLCh *result = new XMLCh[ size() - (tail - head) + 1 ];
		XMLCh *target = result;
		bOK = target != NULL;
		if (bOK)
		{
		  const XMLCh *cursor = begin();

		  while (cursor != head) *target++ = *cursor++;
		  cursor = tail;
		  while ( cursor != end() ) *target++ = *cursor++;
		  *target ++ = 0;
		  XMLString::release(&amp;_wstr);
		  _wstr = result;
		}
	  }
	  return bOK;
	}

	const XMLCh* XercesString::begin() const
	{
	  return _wstr;
	}

	const XMLCh* XercesString::end() const
	{
	  return _wstr + size();
	}

	int XercesString::size() const
	{
	  return XMLString::stringLen(_wstr);
	}

	XMLCh &amp; XercesString::operator [] (const int i)
	{
	  return _wstr[i];
	}

	const XMLCh XercesString::operator [] (const int i) const
	{
	  return _wstr[i];
	}

}

}
</code></pre>
<pre><code class="language-cpp">#ifndef UNITHANDLER_H_
#define UNITHANDLER_H_

#include &lt;SFML/Graphics.hpp&gt;
#include &lt;SFML/Audio/Sound.hpp&gt;

#include &lt;sax2/DefaultHandler.hpp&gt;

#include &lt;boost/shared_ptr.hpp&gt;

#include &lt;cstdlib&gt;
#include &lt;string&gt;
#include &lt;map&gt;

#include &quot;../Graphics/AnimatedSprite.h&quot;
#include &quot;../Utils/String/XercesString.h&quot;

#ifdef XERCES_CPP_NAMESPACE_USE
XERCES_CPP_NAMESPACE_USE
#endif

using namespace Engine::Graphics;

using namespace Utils::String; /* XercesString */

namespace Engine {

namespace Serialization {

/*
 * An instance of the structure sprite_set contains sprites of
 * a specified action of the unit including all sub sprites like
 * holding a weapon.
 */
struct action_set
{
	std::string m_strAction;

	sf::Image m_image;
	sf::Sound m_sound;

	std::map&lt;std::string, AnimatedSprite&gt; m_sprites;

	action_set(std::string&amp; strAction) : m_strAction(strAction) { };
	action_set() { };
	AnimatedSprite* operator[](std::string spriteKey) { return &amp;m_sprites[spriteKey]; };
};

/*
 * An instance of the UnitHandler provides methods for filling
 * a unit using a XML file as source. Its mostly used by an in-
 * stance of SAX2XMLReader.
 */
class UnitHandler : public DefaultHandler
{
private:
	/*
	 * Debug mode on/off
	 */
	static const bool m_bDebug = true;

	/* Tags */

	static std::string m_strTest;

	/* Folgendes Attribut würde den besagten Fehler auslösen */
	static const XercesString m_tstrActions;

	XercesString m_tstrAction;
	XercesString m_tstrSprite;
	XercesString m_tstrStart;
	XercesString m_tstrRun;
	XercesString m_tstrStop;
	XercesString m_tstrFrame;

	/* Attributes */
	XercesString m_astrName;
	XercesString m_astrLow;
	XercesString m_astrNormal;
	XercesString m_astrHigh;
	XercesString m_astrSound;
	XercesString m_astrLeft;
	XercesString m_astrTop;
	XercesString m_astrRight;
	XercesString m_astrBottom;
	XercesString m_astrDelay;

	std::map&lt;std::string, action_set&gt;* m_pActions;

	std::map&lt;std::string, action_set&gt;::iterator m_ActionsIterator;

	std::map&lt;std::string, AnimatedSprite&gt;::iterator m_SpriteIterator;

	boost::shared_ptr&lt; std::vector&lt;Frame&gt; &gt; m_pTmpFrames;

	bool m_bUsePhysFS;

	/*
	 * Boolean variables used by the XML Parser
	 */
	bool m_bFile;
public:
	/*
	 * Creates a new instance of UnitHandler using a given unit as
	 * argument. The given unit will be filled with data (for example
	 * sprites) using a xml file as source.
	 */
	UnitHandler(std::map&lt;std::string, action_set&gt;&amp; actions, bool usePhysFS);
	virtual ~UnitHandler();

	virtual void startDocument();
	virtual void endDocument();

	virtual void startElement(
	const XMLCh* const uri,
	const XMLCh* const localname,
	const XMLCh* const qname,
	const Attributes&amp; attrs);

	virtual void endElement(
	const XMLCh* const uri,
	const XMLCh* const localname,
	const XMLCh* const qname);

	virtual void characters(
	const XMLCh* const chars,
	const unsigned int length);

};

}

}

#endif /* UNITHANDLER_H_ */
</code></pre>
<pre><code class="language-cpp">#include &quot;UnitHandler.h&quot;
#include &lt;sax2/Attributes.hpp&gt;

#include &quot;../Utils/String/XercesString.h&quot;

namespace Engine {

namespace Serialization {

	/* Initialisierung des Attributes, welches den Fehler auslöst */
	const XercesString UnitHandler::m_tstrActions(&quot;actions&quot;);

	UnitHandler::UnitHandler(std::map&lt;std::string, action_set&gt;&amp; actions, bool usePhysFS) : m_pActions(&amp;actions), m_bUsePhysFS(usePhysFS) {

		//m_tstrActions = &quot;actions&quot;;
		m_tstrAction = &quot;action&quot;;
		m_tstrSprite = &quot;sprite&quot;;
		m_tstrStart = &quot;start&quot;;
		m_tstrRun = &quot;run&quot;;
		m_tstrStop = &quot;stop&quot;;
		m_tstrFrame = &quot;frame&quot;;
		m_astrName = &quot;name&quot;;
		m_astrLow = &quot;low&quot;;
		m_astrNormal = &quot;normal&quot;;
		m_astrHigh = &quot;high&quot;;
		m_astrSound = &quot;sound&quot;;
		m_astrLeft = &quot;left&quot;;
		m_astrTop = &quot;top&quot;;
		m_astrRight = &quot;right&quot;;
		m_astrBottom = &quot;bottom&quot;;
		m_astrDelay = &quot;delay&quot;;

	}

	UnitHandler::~UnitHandler() {

	}

	void UnitHandler::startDocument()
	{
		if(m_bDebug) std::cout &lt;&lt; &quot;_start document_&quot; &lt;&lt; std::endl;
	}

	void UnitHandler::endDocument()
	{
		if(m_bDebug) std::cout &lt;&lt; &quot;_end document_&quot; &lt;&lt; std::endl;
	}

	void UnitHandler::startElement(const XMLCh *const uri, const XMLCh *const localname, const XMLCh *const qname, const Attributes &amp; attrs)
	{
		if(m_bDebug) std::cout &lt;&lt; &quot;__start Element__&quot; &lt;&lt; std::endl;

		try
		{
			if(!XMLString::compareString(localname, m_tstrAction))
			{
				std::string strName(XMLString::transcode(attrs.getValue(m_astrName)));
				std::string strImage(XMLString::transcode(attrs.getValue(m_astrLow)));

				m_pActions-&gt;insert(std::make_pair(strName, action_set(strName)));
				m_ActionsIterator = m_pActions-&gt;find(strName);

				if(m_bUsePhysFS){
					/* Load image using physicsFS [NOT IMPLEMENTED]*/
				}
				else
				{
					m_ActionsIterator-&gt;second.m_image.LoadFromFile(strImage);
					m_ActionsIterator-&gt;second.m_image.CreateMaskFromColor(sf::Color(255,0,255,255), 0);
				}
			}
			else if(m_pActions-&gt;size())
			{
				if(!XMLString::compareString(localname, m_tstrSprite))
				{
					std::string strName(XMLString::transcode(attrs.getValue(m_astrName)));
					m_ActionsIterator-&gt;second.m_sprites.insert(std::make_pair(strName, AnimatedSprite()));
					m_SpriteIterator = m_ActionsIterator-&gt;second.m_sprites.find(strName);
					m_SpriteIterator-&gt;second.SetImage(m_ActionsIterator-&gt;second.m_image);
				}
				else if(!XMLString::compareString(localname, m_tstrRun))
				{
					boost::shared_ptr&lt; std::vector&lt;Frame&gt; &gt; pFrames(new std::vector&lt;Frame&gt;());
					m_pTmpFrames = pFrames;
				}
				else if(!XMLString::compareString(localname, m_tstrFrame))
				{
					std::string strLeft(XMLString::transcode(attrs.getValue(m_astrLeft)));
					std::string strTop(XMLString::transcode(attrs.getValue(m_astrTop)));
					std::string strRight(XMLString::transcode(attrs.getValue(m_astrRight)));
					std::string strBottom(XMLString::transcode(attrs.getValue(m_astrBottom)));
					std::string strDelay(XMLString::transcode(attrs.getValue(m_astrDelay)));

					m_pTmpFrames-&gt;push_back(Frame(IntRect(atoi(strLeft.c_str()),
														  atoi(strTop.c_str()),
														  atoi(strRight.c_str()),
														  atoi(strBottom.c_str())), static_cast&lt;float&gt;(atof(strDelay.c_str()))));
				}
			}
		}
		catch(std::exception &amp;e)
		{
			std::cerr &lt;&lt; &quot;Caught &quot; &lt;&lt; e.what() &lt;&lt; std::endl;
		}

	}

	void UnitHandler::characters(const XMLCh *const chars, const unsigned int length)
	{
		if(m_bDebug) std::cout &lt;&lt; &quot;___characters___&quot; &lt;&lt; std::endl;
	}

	void UnitHandler::endElement(const XMLCh *const uri, const XMLCh *const localname, const XMLCh *const qname)
	{
		if(m_bDebug) std::cout &lt;&lt; &quot;__end Element__&quot; &lt;&lt; std::endl;

		if(!XMLString::compareString(localname, m_tstrRun))
		{
			m_SpriteIterator-&gt;second.SetSubRectangles(m_pTmpFrames);
		}
	}

}

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/221969/statisches-attribut-sorgt-für-segmentation-fault-vor-der-main</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 16:59:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/221969.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Sep 2008 16:10:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Statisches Attribut sorgt für Segmentation Fault vor (!) der Main on Fri, 05 Sep 2008 16:10:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>beim Erstellen eines geeigneten Parsers mit der Apache Xerces Bibliothek (SAX) für ein bestimmtes XML-Format ist mir eine bisher noch nicht begegnete Eigenart in C++ (oder gar Xerces?) untergekommen. Wenn ich Attribute des Typs XercesString (Entnommen aus <a href="http://www.ibm.com/developerworks/xml/library/x-xercc/" rel="nofollow">http://www.ibm.com/developerworks/xml/library/x-xercc/</a>) in meinem eigenen Handler (erbt von der Xerces-Klasse &quot;DefaultHandler&quot;) als statisch deklariere, erhalte ich nach erfolgreichem Kompilieren und Starten einen Segmentation Fault, der vor (!) der Main-Funktion auftritt. Sinn des Ganzen soll eine Optimierung des Codes sein. Jedenfalls funktionieren diese Attribute als nicht-statische Elemente der Klasse einwandfrei. Richtig deklariert und vor allem initialisiert sollten diese statischen Attribute sein. Jedenfalls geht es ohne Weiteres mit dem Typ std::string aus der STL. Wie kann es also sein, dass ein einzelnes statisches Attribut einen solch fatalen Fehler auslöst?</p>
<p>Ich bin dankbar für jede Antwort! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<pre><code class="language-cpp">#ifndef XERCESSTRING_H_
#define XERCESSTRING_H_

#include &lt;util/XMLString.hpp&gt;

namespace Utils {

namespace String {

#ifdef XERCES_CPP_NAMESPACE_USE
XERCES_CPP_NAMESPACE_USE
#endif

class XercesString
{
	XMLCh *_wstr;
public:
	XercesString() : _wstr(0L) { };
	XercesString(const char *str);
	XercesString(XMLCh *wstr);
	XercesString(const XMLCh *wstr);
	XercesString(const XercesString &amp;copy);
	~XercesString();
	bool append(const XMLCh *tail);
	bool erase(const XMLCh *head, const XMLCh *tail);
	const XMLCh* begin() const;
	const XMLCh* end() const;
	int size() const;
	XMLCh &amp; operator [] (const int i);
	const XMLCh operator [] (const int i) const;
	operator const XMLCh * () const { return _wstr; };
	void operator = (const char *str) { _wstr = XMLString::transcode(str); }
};

}

}

#endif /* XERCESSTRING_H_ */
</code></pre>
<pre><code class="language-cpp">#include &quot;XercesString.h&quot;

namespace Utils {

namespace String {

	XercesString::XercesString(const char *str) : _wstr(NULL)
	{
	  _wstr = XMLString::transcode(str);
	}

	XercesString::XercesString(XMLCh *wstr) : _wstr(wstr) { };

	XercesString::XercesString(const XMLCh *wstr) : _wstr(NULL)
	{
	  _wstr = XMLString::replicate(wstr);
	}

	XercesString::XercesString(const XercesString &amp;right) : _wstr(NULL)
	{
	  _wstr = XMLString::replicate(right._wstr);
	}

	XercesString::~XercesString()
	{
	  // thanks tinny!!
	  if (_wstr) XMLString::release(&amp;_wstr);
	}

	bool XercesString::append(const XMLCh *tail)
	{
	  int iTailLen = XMLString::stringLen(tail);
	  int iWorkLen = XMLString::stringLen(_wstr);
	  XMLCh *result = new XMLCh[ iWorkLen + iTailLen + 1 ];
	  bool bOK = result != NULL;
	  if (bOK)
	  {
		XMLCh *target = result;
		XMLString::moveChars(target, _wstr, iWorkLen);
		target += iWorkLen;
		XMLString::moveChars(target, tail, iTailLen);
		target += iTailLen;
		*target++ = 0;
		XMLString::release(&amp;_wstr);
		_wstr = result;
	  }
	  return bOK;
	}

	bool XercesString::erase(const XMLCh *head, const XMLCh *tail)
	{
	  bool bOK = head &lt;= tail &amp;&amp; head &gt;= begin() &amp;&amp; tail &lt;= end();
	  if (bOK)
	  {
		XMLCh *result = new XMLCh[ size() - (tail - head) + 1 ];
		XMLCh *target = result;
		bOK = target != NULL;
		if (bOK)
		{
		  const XMLCh *cursor = begin();

		  while (cursor != head) *target++ = *cursor++;
		  cursor = tail;
		  while ( cursor != end() ) *target++ = *cursor++;
		  *target ++ = 0;
		  XMLString::release(&amp;_wstr);
		  _wstr = result;
		}
	  }
	  return bOK;
	}

	const XMLCh* XercesString::begin() const
	{
	  return _wstr;
	}

	const XMLCh* XercesString::end() const
	{
	  return _wstr + size();
	}

	int XercesString::size() const
	{
	  return XMLString::stringLen(_wstr);
	}

	XMLCh &amp; XercesString::operator [] (const int i)
	{
	  return _wstr[i];
	}

	const XMLCh XercesString::operator [] (const int i) const
	{
	  return _wstr[i];
	}

}

}
</code></pre>
<pre><code class="language-cpp">#ifndef UNITHANDLER_H_
#define UNITHANDLER_H_

#include &lt;SFML/Graphics.hpp&gt;
#include &lt;SFML/Audio/Sound.hpp&gt;

#include &lt;sax2/DefaultHandler.hpp&gt;

#include &lt;boost/shared_ptr.hpp&gt;

#include &lt;cstdlib&gt;
#include &lt;string&gt;
#include &lt;map&gt;

#include &quot;../Graphics/AnimatedSprite.h&quot;
#include &quot;../Utils/String/XercesString.h&quot;

#ifdef XERCES_CPP_NAMESPACE_USE
XERCES_CPP_NAMESPACE_USE
#endif

using namespace Engine::Graphics;

using namespace Utils::String; /* XercesString */

namespace Engine {

namespace Serialization {

/*
 * An instance of the structure sprite_set contains sprites of
 * a specified action of the unit including all sub sprites like
 * holding a weapon.
 */
struct action_set
{
	std::string m_strAction;

	sf::Image m_image;
	sf::Sound m_sound;

	std::map&lt;std::string, AnimatedSprite&gt; m_sprites;

	action_set(std::string&amp; strAction) : m_strAction(strAction) { };
	action_set() { };
	AnimatedSprite* operator[](std::string spriteKey) { return &amp;m_sprites[spriteKey]; };
};

/*
 * An instance of the UnitHandler provides methods for filling
 * a unit using a XML file as source. Its mostly used by an in-
 * stance of SAX2XMLReader.
 */
class UnitHandler : public DefaultHandler
{
private:
	/*
	 * Debug mode on/off
	 */
	static const bool m_bDebug = true;

	/* Tags */

	static std::string m_strTest;

	/* Folgendes Attribut würde den besagten Fehler auslösen */
	static const XercesString m_tstrActions;

	XercesString m_tstrAction;
	XercesString m_tstrSprite;
	XercesString m_tstrStart;
	XercesString m_tstrRun;
	XercesString m_tstrStop;
	XercesString m_tstrFrame;

	/* Attributes */
	XercesString m_astrName;
	XercesString m_astrLow;
	XercesString m_astrNormal;
	XercesString m_astrHigh;
	XercesString m_astrSound;
	XercesString m_astrLeft;
	XercesString m_astrTop;
	XercesString m_astrRight;
	XercesString m_astrBottom;
	XercesString m_astrDelay;

	std::map&lt;std::string, action_set&gt;* m_pActions;

	std::map&lt;std::string, action_set&gt;::iterator m_ActionsIterator;

	std::map&lt;std::string, AnimatedSprite&gt;::iterator m_SpriteIterator;

	boost::shared_ptr&lt; std::vector&lt;Frame&gt; &gt; m_pTmpFrames;

	bool m_bUsePhysFS;

	/*
	 * Boolean variables used by the XML Parser
	 */
	bool m_bFile;
public:
	/*
	 * Creates a new instance of UnitHandler using a given unit as
	 * argument. The given unit will be filled with data (for example
	 * sprites) using a xml file as source.
	 */
	UnitHandler(std::map&lt;std::string, action_set&gt;&amp; actions, bool usePhysFS);
	virtual ~UnitHandler();

	virtual void startDocument();
	virtual void endDocument();

	virtual void startElement(
	const XMLCh* const uri,
	const XMLCh* const localname,
	const XMLCh* const qname,
	const Attributes&amp; attrs);

	virtual void endElement(
	const XMLCh* const uri,
	const XMLCh* const localname,
	const XMLCh* const qname);

	virtual void characters(
	const XMLCh* const chars,
	const unsigned int length);

};

}

}

#endif /* UNITHANDLER_H_ */
</code></pre>
<pre><code class="language-cpp">#include &quot;UnitHandler.h&quot;
#include &lt;sax2/Attributes.hpp&gt;

#include &quot;../Utils/String/XercesString.h&quot;

namespace Engine {

namespace Serialization {

	/* Initialisierung des Attributes, welches den Fehler auslöst */
	const XercesString UnitHandler::m_tstrActions(&quot;actions&quot;);

	UnitHandler::UnitHandler(std::map&lt;std::string, action_set&gt;&amp; actions, bool usePhysFS) : m_pActions(&amp;actions), m_bUsePhysFS(usePhysFS) {

		//m_tstrActions = &quot;actions&quot;;
		m_tstrAction = &quot;action&quot;;
		m_tstrSprite = &quot;sprite&quot;;
		m_tstrStart = &quot;start&quot;;
		m_tstrRun = &quot;run&quot;;
		m_tstrStop = &quot;stop&quot;;
		m_tstrFrame = &quot;frame&quot;;
		m_astrName = &quot;name&quot;;
		m_astrLow = &quot;low&quot;;
		m_astrNormal = &quot;normal&quot;;
		m_astrHigh = &quot;high&quot;;
		m_astrSound = &quot;sound&quot;;
		m_astrLeft = &quot;left&quot;;
		m_astrTop = &quot;top&quot;;
		m_astrRight = &quot;right&quot;;
		m_astrBottom = &quot;bottom&quot;;
		m_astrDelay = &quot;delay&quot;;

	}

	UnitHandler::~UnitHandler() {

	}

	void UnitHandler::startDocument()
	{
		if(m_bDebug) std::cout &lt;&lt; &quot;_start document_&quot; &lt;&lt; std::endl;
	}

	void UnitHandler::endDocument()
	{
		if(m_bDebug) std::cout &lt;&lt; &quot;_end document_&quot; &lt;&lt; std::endl;
	}

	void UnitHandler::startElement(const XMLCh *const uri, const XMLCh *const localname, const XMLCh *const qname, const Attributes &amp; attrs)
	{
		if(m_bDebug) std::cout &lt;&lt; &quot;__start Element__&quot; &lt;&lt; std::endl;

		try
		{
			if(!XMLString::compareString(localname, m_tstrAction))
			{
				std::string strName(XMLString::transcode(attrs.getValue(m_astrName)));
				std::string strImage(XMLString::transcode(attrs.getValue(m_astrLow)));

				m_pActions-&gt;insert(std::make_pair(strName, action_set(strName)));
				m_ActionsIterator = m_pActions-&gt;find(strName);

				if(m_bUsePhysFS){
					/* Load image using physicsFS [NOT IMPLEMENTED]*/
				}
				else
				{
					m_ActionsIterator-&gt;second.m_image.LoadFromFile(strImage);
					m_ActionsIterator-&gt;second.m_image.CreateMaskFromColor(sf::Color(255,0,255,255), 0);
				}
			}
			else if(m_pActions-&gt;size())
			{
				if(!XMLString::compareString(localname, m_tstrSprite))
				{
					std::string strName(XMLString::transcode(attrs.getValue(m_astrName)));
					m_ActionsIterator-&gt;second.m_sprites.insert(std::make_pair(strName, AnimatedSprite()));
					m_SpriteIterator = m_ActionsIterator-&gt;second.m_sprites.find(strName);
					m_SpriteIterator-&gt;second.SetImage(m_ActionsIterator-&gt;second.m_image);
				}
				else if(!XMLString::compareString(localname, m_tstrRun))
				{
					boost::shared_ptr&lt; std::vector&lt;Frame&gt; &gt; pFrames(new std::vector&lt;Frame&gt;());
					m_pTmpFrames = pFrames;
				}
				else if(!XMLString::compareString(localname, m_tstrFrame))
				{
					std::string strLeft(XMLString::transcode(attrs.getValue(m_astrLeft)));
					std::string strTop(XMLString::transcode(attrs.getValue(m_astrTop)));
					std::string strRight(XMLString::transcode(attrs.getValue(m_astrRight)));
					std::string strBottom(XMLString::transcode(attrs.getValue(m_astrBottom)));
					std::string strDelay(XMLString::transcode(attrs.getValue(m_astrDelay)));

					m_pTmpFrames-&gt;push_back(Frame(IntRect(atoi(strLeft.c_str()),
														  atoi(strTop.c_str()),
														  atoi(strRight.c_str()),
														  atoi(strBottom.c_str())), static_cast&lt;float&gt;(atof(strDelay.c_str()))));
				}
			}
		}
		catch(std::exception &amp;e)
		{
			std::cerr &lt;&lt; &quot;Caught &quot; &lt;&lt; e.what() &lt;&lt; std::endl;
		}

	}

	void UnitHandler::characters(const XMLCh *const chars, const unsigned int length)
	{
		if(m_bDebug) std::cout &lt;&lt; &quot;___characters___&quot; &lt;&lt; std::endl;
	}

	void UnitHandler::endElement(const XMLCh *const uri, const XMLCh *const localname, const XMLCh *const qname)
	{
		if(m_bDebug) std::cout &lt;&lt; &quot;__end Element__&quot; &lt;&lt; std::endl;

		if(!XMLString::compareString(localname, m_tstrRun))
		{
			m_SpriteIterator-&gt;second.SetSubRectangles(m_pTmpFrames);
		}
	}

}

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1577204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1577204</guid><dc:creator><![CDATA[Hoagie451]]></dc:creator><pubDate>Fri, 05 Sep 2008 16:10:01 GMT</pubDate></item><item><title><![CDATA[Reply to Statisches Attribut sorgt für Segmentation Fault vor (!) der Main on Fri, 05 Sep 2008 17:20:55 GMT]]></title><description><![CDATA[<p>bisschen weniger quellcode, diesen dann kommentiert....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1577235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1577235</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Fri, 05 Sep 2008 17:20:55 GMT</pubDate></item><item><title><![CDATA[Reply to Statisches Attribut sorgt für Segmentation Fault vor (!) der Main on Fri, 05 Sep 2008 17:27:38 GMT]]></title><description><![CDATA[<p>Was macht XMLString::transcode? Hast du mal einen Backtrace gemacht wo genau der Segfault kommt? Abgesehen davon bin ich mit Skybrabbel einer Meinung, kürz den Code mal auf das Wesentliche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1577239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1577239</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Fri, 05 Sep 2008 17:27:38 GMT</pubDate></item></channel></rss>