Programm hängt sich auf! Templatevererbungsproblem



  • Hi,

    ich bin langsam regelrecht am verzweifeln! Seit ca. 2 Stunden hänge ich nun an einem Laufzeit fehler aber finde ihn net 😞 Beim Starten des Programmes bekomme ich folgenden Fehler:

    Unhandled exception at 0x004603f6 in Tutorial 4.exe: 0xC0000005: Access violation writing location 0x004b46f4.

    Das wird außerdem ausgespuckt:

    -	_pFirstBlock	0x004b46f0 const CVector3<float>::`vftable'	_CrtMemBlockHeader *
    +	pBlockHeaderNext	0x0043b8d3 CVector3<float>::`scalar deleting destructor'(unsigned int)	_CrtMemBlockHeader *
    +	pBlockHeaderPrev	0x0043a956 CWorldTile::`vector deleting destructor'(unsigned int)	_CrtMemBlockHeader *
    -	szFileName	0x00000000 <Bad Ptr>	char *
    		CXX0030: Error: expression cannot be evaluated	char
    	nLine	1852534357	int
    	nDataSize	1696626543	unsigned int
    	nBlockUse	1885692792	int
    	lRequest	1852795252	long
    -	gap	0x004b470c "!"	unsigned char [4]
    	[0]	33 '!'	unsigned char
    	[1]	0	unsigned char
    	[2]	0	unsigned char
    	[3]	0	unsigned char
    -	_pFirstBlock->pBlockHeaderPrev	0x0043a956 CWorldTile::`vector deleting destructor'(unsigned int)	_CrtMemBlockHeader *
    +	pBlockHeaderNext	0x01d2c5e9	_CrtMemBlockHeader *
    +	pBlockHeaderPrev	0x82d0e900	_CrtMemBlockHeader *
    -	szFileName	0xdbe90005 <Bad Ptr>	char *
    		CXX0030: Error: expression cannot be evaluated	char
    	nLine	-385874847	int
    	nDataSize	169638	unsigned int
    	nBlockUse	26517993	int
    	lRequest	1071442176	long
    -	gap	0x0043a972 ""	unsigned char [4]
    	[0]	4 '␄'	unsigned char
    	[1]	0	unsigned char
    	[2]	233 'é'	unsigned char
    	[3]	119 'w'	unsigned char
    -	pHead	0x08890790	_CrtMemBlockHeader *
    +	pBlockHeaderNext	0xbaadf00d	_CrtMemBlockHeader *
    +	pBlockHeaderPrev	0xbaadf00d	_CrtMemBlockHeader *
    +	szFileName	0xbaadf00d <Bad Ptr>	char *
    	nLine	-1163005939	int
    	nDataSize	3131961357	unsigned int
    	nBlockUse	-1163005939	int
    	lRequest	-1163005939	long
    -	gap	0x088907ac "
    ð­º
    ð­º
    𭺫«««««««"	unsigned char [4]
    	[0]	13 '␍'	unsigned char
    	[1]	240 'ð'	unsigned char
    	[2]	173 '­'	unsigned char
    	[3]	186 'º'	unsigned char
    

    Hier der Code der Dateien die ich benutze:

    // Datei:			CVector3.h
    // //////////////////////////////////////////////////////////////////////////////////
    // Autor:			Patrick Ullmann								© Xarent Interactive
    // Erstellt:		20.11.03
    // Änderungen:		20.11.03	(Patrick)	Datei erstellt
    // //////////////////////////////////////////////////////////////////////////////////
    // Beschreibung:	Struktur zur Rechnung mit Vectoren
    
    #ifndef _CVECTOR3_H_
    #define _CVECTOR3_H_
    
    // I N C L U D E S //////////////////////////////////////////////////////////////////
    #include <cmath>
    
    // D E F I N I T I O N E N //////////////////////////////////////////////////////////
    	// Noch keine
    
    // S T R U K T U R E N //////////////////////////////////////////////////////////////
    template<class T> class CVector3 
    { 
    public: 
    		// Constructor 
    	CVector3				(T x = T(), T y = T(), T z = T())  : m_x(x), m_y(y), m_z(z) {} 
    		// Destructor
    	virtual ~CVector3<T>	(void) {}; 
    
    		// Diverse get- und set-Funktionen
    	inline T		getX		(void)	const	{ return (this->m_x);} 
    	inline T		getY		(void)	const	{ return (this->m_y);} 
    	inline T		getZ		(void)	const	{ return (this->m_z);} 
    	inline void		setX		(T &t)			{ this->m_x = t;} 
    	inline void		setY		(T &t)			{ this->m_y = t;} 
    	inline void		setZ		(T &t)			{ this->m_z = t;} 
     	void			setVector	(T &x, T &y, T &z); 
    
    		// Wichtige Grundoperatoren
    	const CVector3<T>	operator-	(const CVector3<T>&) const; 
    	const CVector3<T>	operator+	(const CVector3<T>&) const; 
    	T					operator*	(const CVector3<T>&) const; 
    	CVector3<T>			operator*	(T &value)      const; 
    	CVector3<T>			operator/	(T &value)      const; 
    	CVector3<T>			operator/	(const CVector3<T>&) const; 
    	CVector3<T>&		operator=	(const CVector3<T>&); 
    	CVector3<T>			operator-	(void); 
    	CVector3<T>&		operator+=	(const CVector3<T>&); 
    	CVector3<T>&		operator-=	(const CVector3<T>&); 
    	CVector3<T>&		operator*=	(const CVector3<T>&); 
    	CVector3<T>&		operator*=	(T&); 
    	CVector3<T>&		operator/=	(const CVector3<T>&); 
    	CVector3<T>&		operator/=	(T&); 
    
    		// Grundlegende Mathematische Funktionen
    	CVector3<T>			crossProduct	(const CVector3<T>&) const; 
    	CVector3<T>			dotProduct		(const CVector3<T>&) const; 
    	CVector3<T>			normalize		(void); 
     	T					magnitude		(void) const; 
    	T					magnitudeQuad	(void) const; 
    
     protected: 
    
    		// Der eigentliche "Vector"
        T			m_x;
    	T			m_y;
    	T			m_z; 
    }; 
    #endif
    
    // Datei:			CBoundingBox.h
    // //////////////////////////////////////////////////////////////////////////////////
    // Autor:			Patrick Ullmann								© Xarent Interactive
    // Erstellt:		20.11.03
    // Änderungen:		20.11.03	(Patrick)	Datei erstellt
    // //////////////////////////////////////////////////////////////////////////////////
    // Beschreibung:	Struktur für BoundingBoxen
    
    #ifndef _CBOUNDINGBOX_H_
    #define _CBOUNDINGBOX_H_
    
    // I N C L U D E S //////////////////////////////////////////////////////////////////
    #include "..\\math\\CVector3.h"
    #include "..\\core\\CVideo.h"
    
    // D E F I N I T I O N E N //////////////////////////////////////////////////////////
    	// Noch keine
    
    // S T R U K T U R E N //////////////////////////////////////////////////////////////
    class CBoundingBox
    {
    public:
    		// Constructor
    	CBoundingBox			(void)	:	m_Collidable (true)	{}
    		// Destructor
    	virtual	~CBoundingBox	(void)							{}
    
    		// Diverse set-Funktionen.
    	void			setCollidable		(bool value)	{ this->m_Collidable = value; }
    	void			setBBPosition		(CVector3<float>);
    	void			setBBMin			(CVector3<float>);
    	void			setBBMax			(CVector3<float>);
    
    		// Diverse get-Funktionen
    	CVector3<float>	getBBPosition		(void);
    	CVector3<float>	getBBMin			(void);
    	CVector3<float> getBBMax			(void);
    
    		// Kann die BoundingBox mit irgendetwas Kollidieren?
    	inline bool		isCollidable		(void)	{ return (this->m_Collidable); }
    
    		// Funktion zum rendern der BoundingBox.
    	void			renderBoundingBox	(void);
    
    		// Kollisionsfunktionen für BB mit BB und BB mit Point.
    	bool			collidesWith		(CBoundingBox *object);
    	bool			collidesWith		(CVector3<float> &point);
    
    protected:
    		// Darf die BoundingBox später mit irgendetwas kollidieren?
    	bool			m_Collidable;
    
    		// Daten über die BoundingBox.
    	CVector3<float> m_Position;
    	CVector3<float> m_Min;
    	CVector3<float> m_Max;
    };
    
    #endif
    
    // Datei:			CCreature.h
    // //////////////////////////////////////////////////////////////////////////////////
    // Autor:			Patrick Ullmann								© Xarent Interactive
    // Erstellt:		08.12.03
    // Änderungen:		08.12.03	(Patrick)	Datei erstellt
    // //////////////////////////////////////////////////////////////////////////////////
    // Beschreibung:	Struktur für Spielfiguren (Player, NPCs, Enemys usw.)
    
    #ifndef _CCREATURE_H_
    #define _CCREATURE_H_
    
    // I N C L U D E S //////////////////////////////////////////////////////////////////
    #include "CBoundingBox.h"
    #include "..\\core\\CTextureManager.h"
    
    // D E F I N I T I O N E N //////////////////////////////////////////////////////////
    	// Noch keine
    
    // S T R U K T U R E N //////////////////////////////////////////////////////////////
    class CCreature : public CBoundingBox
    {
    public:
    	CCreature	(void);
    	~CCreature	(void) {};
    
    	void			convertRealToRelative	(void);
    	void			convertRelativeToReal	(void);
    
    	void		load						(const std::string &FileName);
    	void		update						(int MsEllapsed);
    	void		render						(int MsEllapsed);
    
    private:
    	CREATURE_STATE	m_state;
    };
    
    #endif
    
    // Datei:			CWorld.h
    // //////////////////////////////////////////////////////////////////////////////////
    // Autor:			Patrick Ullmann								© Xarent Interactive
    // Erstellt:		29.11.03
    // Änderungen:		29.11.03	(Patrick)	Datei erstellt
    // //////////////////////////////////////////////////////////////////////////////////
    // Beschreibung:	Das Level
    
    #ifndef _CWORLD_H_
    #define _CWORLD_H_
    
    // I N C L U D E S //////////////////////////////////////////////////////////////////
    #include "..\\objects\\CWorldTile.h"
    #include "..\\core\\CKeyboardManager.h"
    #include "..\\objects\\CCreature.h"
    
    // D E F I N I T I O N E N //////////////////////////////////////////////////////////
    	// Noch keine
    
    // S T R U K T U R E N //////////////////////////////////////////////////////////////
    class CWorld
    {
    public:
    		// Constructor
    	CWorld		(void);
    		// Destructor
    	~CWorld		(void);
    
    		// Mapdatei laden
    	void		loadMap			(const std::string &FileName);
    		// Welt updaten
    	void		update			(int MsEllapsed);
    		// Welt rendern
    	void		render			(int MsEllapsed);
    
    private:
    		// Unser Stringparser
    	std::vector <std::string>	parseString (const std::string &s, const char &sep);
    		// Vector für die Tiles.
    	std::vector <CWorldTile>	m_vec_Tiles;
    
    		// ###########################################
    		// Wenn ich sowas schreibe oder eine Klasse hier hin
    		// Stecke die von CBoundingBox abgeleitet wurde wie
    		// z.B. CCreature bekomme ich den oben genannten Fehler :(
    	CBoundingBox				x;
    };
    
    #endif
    

    Ich hoffe das reicht, sorry wenn es recht viel ist, aber zwei Sachen habe ich bisher rausgefunden:
    - Es hat irgendetwas mit dem Destruktor der CVector3 zu tun, aber ich kann mir nicht erklären: WAS!?!?!
    - In der CWorld.h unter dem Kommentar, immer wenn ich eine Klasse einbinde die CVector3 benutzt oder davon abgeleitet ist, bekomme ich diesen Fehler! 😞

    Wenn ihr sonst noch welche Daten (z.B. Füllen des Vectors mit CWorldTile (Ist auch von CBoundingBox abgeleitet veruhrsacht aber keine Fehler))braucht bitte bitte sagt es mir!

    Aber bitte bitte helft mir diesen Fehler zu finden, ich verzweifle an diesem Mistkerl :(:(:(

    Schon mal dickes Danke im Voraus! Ich hoffe inständigst, das ihr eine Ahnung habt wo der Fehler liegt und wie ich ihn beheben kann.

    Gruß,
    Patrick



  • Kannste mal die Stelle im Quellcode hervorheben bei der Dir der Debugger sagt das es kracht ?

    Irgendwie finde ich den Source unübersichtlich.
    (z.B. ist der Destruktor von Vector3 leer)

    Ich denke da musste noch mal die Information sortieren und neu posten.
    Ich blick da zumindest nich durch :o(



  • Hi,
    hm ich dachte er wäre übersichtlich, naja jedem das seine. Ich bin mal mit dem debugger drüber gegangen:

    aus einen mir unerklärlichen grund wird eine Exception geworfen die nicht von mir ist! Ich finde aber diese verdammte zeile nicht 😞

    Woran könnte das liegen? Ich benutze Singletons und co?



  • Wie sieht denn die Aufrufliste aus?



  • @MFK && All:
    Falls ihr den code des GANZEN Programmes haben wollt und Compilieren (weil der Fehler irgendwo anders liegt ich das aber net so sehr glaube) dann saugt euch diesen code und stopft einfach wie oben abgebildet unter dem Vector eine CBoundingBox hin oder sonst was, was von CBoundingBox abgeleitet wurde.

    Hier der Code:
    http://www.scherfgen-software.net/patrick/tut4.zip

    Macht von mir aus jegliche veränderungen damit dieser verdammte fehler verschwindet ich bin mit meinem Latein an ende *schnief* 😞 😞 😞



  • Compilieren kann ich nich weil ich im mom keine SDL und GL hab.
    Kannst Du aber mal die Funktion angeben in der die Exception auftritt ?
    Wäre schon mal hilfreich 🤡



  • würde ich mega gerne, doch ich finde diese funktion net, ich wurde eben 30 min lang durch Assembler Dateien gejagt die mir nix gesagt haben und irgendwann schmierte dann auch noch mein .NET ab 😞 Der will sich einfach irgendwie ent finden lassen 😞



  • Nimm doch Schritt für Schritt ALLES unnötige aus deinem Programm raus.

    Bis der Fehler nicht mehr auftritt. Dann wirst du wohl erkennen wo das Problem genau liegt.



  • Dumme Frage:
    wo ist denn der Constructor by reference ? (obwohl ich nicht glaube, dass es an dessen Fehlen liegt. Schliesslich ist da nichts mit new, aber wenn operator = und normaler Constructor schon ausformuliert sind, gehört der dazu)



  • Patrick schrieb:

    würde ich mega gerne, doch ich finde diese funktion net, ich wurde eben 30 min lang durch Assembler Dateien gejagt die mir nix gesagt haben

    Darum sollst du ja auch die Aufrufliste rausrücken. 🙄



  • MFK schrieb:

    Patrick schrieb:

    würde ich mega gerne, doch ich finde diese funktion net, ich wurde eben 30 min lang durch Assembler Dateien gejagt die mir nix gesagt haben

    Darum sollst du ja auch die Aufrufliste rausrücken. 🙄

    Sorry wenn das jetzt etwas dümmlich klingt, aber was meinst du genau mit Aufrufliste? Meinst du ALLE Funktionen die ich aufrufe aufgelistet? 😕 Oder meinst du etwas, was der debugger ausspuckt? 😕



  • etwas, was der debugger ausspuckt!



  • Hi,

    hab ich doch oben gepostet? oder was meint ihr? *bahnhof versteh*


Anmelden zum Antworten