shared_ptr - Delete?



  • also:

    CData	data;
    

    Erzeugt auch leaks.

    Aber ich habe nur einen Konstruktor deklariert. Ich hab mit dem Copy Konstruktor nichts gedreht.

    CData sieht so aus:

    class CData 
    {
    	public:
    		CData();
    
    		// Sehr viele Funktionen nach Muster get/set
    		D3DXVECTOR3*		get_TargetPtr(int leg);	// bsp.
    
    	private:
    		// Die Entsprechenden Variablen zu get/set
    		int					m_ReadDelay;	//bsp.
    };
    
    CData :: CData()
    	:	m_UDPSocket(&m_Acceleration, &m_RollPitchYaw),
    		m_CIni()	// Erzeugt auch ohne die beiden Klassen Leaks.
    					// Ich geh also davon aus das die ok sind.	
    {
    
    	// initialisierungen. Alles ohne new
    }
    


  • void main() {   // Erzeugt leaks
            CData           data = CData();     
        }
    

    Dann erzeugt dieser Code-Schnipsel dadurch Leaks, dass der Konstruktor von CData aufgerufen wird...



  • Zeig doch Mal mehr von der Klasse.

    Ich kann mir vorstellen, dass die Regel der großen 3 (5) nicht eingehalten wurde, d.h. es gibt einen dtor, der irgendwo delete aufruft, jedoch sind operator= und copy-ctor eben nicht definiert. Das führt dann dazu, dass der referenzierte Speicher gelöscht wird.

    Oder heißt Leaks, dass irgendwas nicht freigegeben wird? Eigentlich würde das Programm ja dann ziemlich klar crashen, wenn meine Theorie oben stimmen würde.

    Kann auch sein, dass einfach das delete zum jeweiligen new fehlt, wenn weder copy-ctor, operator= noch dtor definiert sind, aber in ctor new aufgerufen wird.

    Eins von beidem wird's doch wohl sein, komm schon.



  • Ok. Also dann werde ich mal mehr Posten damit ihr euch ein größeres Bild machen könnt.

    denn CData hat jetzt grade zum leak finden absolut keinen inhalt:

    CData :: CData()
    	//:	m_UDPSocket(&m_Acceleration, &m_RollPitchYaw),
    	//	m_CIni()
    
    {
    	/*unsigned int i;
    
    //	Ctrl	///////////////////////////////////////////////////////////////////////////
    
    	m_mouseL		= false;
    	m_mouseR		= false;
    
    	m_wheel			= 0.0f;
    	m_X				= 400;
    	m_Y				= 400;
    
    	m_WASD_Toggle	= 1;
    	m_Toggle		= false;
    
    	for(i = 0; i < 256; i++)	m_keystate[i] = false; 
    
    	m_Acceleration	= D3DXVECTOR3(0, 0, 0); 
    	m_RollPitchYaw	= D3DXVECTOR3(0, 0, 0);
    
    //	Console	///////////////////////////////////////////////////////////////////////////
    
    	m_wireframe = false;
    //	View	///////////////////////////////////////////////////////////////////////////
    
    	m_viewDistance	= 50.0f;
    	m_viewRotHori	= 0;
    	m_viewRotVert	= 0;
    
    //	Leg		///////////////////////////////////////////////////////////////////////////
    
    	m_Length[0]	= 3.29f;
    	m_Length[1]	= 1.5f;
    	m_Length[2]	= 6.78f;
    	m_Length[3]	= 8.07f;
    
    	D3DXMatrixRotationZ		(&m_matRot90,		D3DXToRadian(-90));
    	D3DXMatrixScaling		(&m_matBodySize,	0.1f, 0.1f, 0.1f);
    	D3DXMatrixScaling		(&m_matAxisSize,	0.05f, 2.0f, 0.05f);
    	D3DXMatrixRotationY		(&m_matTurn,		D3DXToRadian(180));
    
    	D3DXMatrixTranslation	(&m_matTransSO,	   -m_Length[0], 0, 0);
    	D3DXMatrixTranslation	(&m_matTransVS,		0, m_Length[1], 0);
    	D3DXMatrixTranslation	(&m_matTransOS,		0, m_Length[2], 0);
    	D3DXMatrixTranslation	(&m_matTransUS,		0, m_Length[3], 0);
    
    //	General	///////////////////////////////////////////////////////////////////////////
    
    	m_KillThisProcess	= false;
    	m_ReadDelay			= 0;*/
    }
    

    Das Hauptprogramm sieht in wirklichkeit auch so aus:
    CData ist global. (weil ich es auch für Windowproc nutzen wollte.)

    // includes
    
    	CData			data = CData();	
    	//CData*		data = new CData();
    	//CData	data;
    	//DirectX_Device	dxdv(&data);
    
    #include "inc/win_api.h"
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    {
    	//delete data;
    
    	_CrtDumpMemoryLeaks();
    
        return EXIT_SUCCESS;
    }
    


  • Ist da wirklich alles auskommentiert und das liefert dann immer noch Leaks? (in der CData-Klasse?)

    Falls ja, gibt es auch statische Member von CData? Falls nein, würde ich natürlich auch die Klassen prüfen, deren Instanzen Member von CData sind.

    Gerne kannst Du auch Mal die CData-Schnittstelle (Header) zeigen, man weiß ja nie. 🙂



  • Eisflamme schrieb:

    Oder heißt Leaks, dass irgendwas nicht freigegeben wird?

    lol



  • Ok ich denke das es nichts mehr bringt irgendwas zu kürzen.
    Ich poste jetzt Alles was zum leak finden ausgeführt wird, und insgesammt 19 mal 8Byte leaks erzeugt:

    #include "inc/init_configuration.h"
    #include "inc/render_frame.h"
    #include "inc/hexapod.h"
    #include "inc/control.h"
    #include "inc/GUI3D.h"
    #include "inc/Console.h"
    #include "inc/DirectX_Device.h"
    #include "inc/CData.h"
    #include "inc/_IStrategy.h"
    #include "inc/_IStrategyVal.h"
    
    // includes
    
    	CData			data = CData();	
    	//CData*		data = new CData();
    	//CData	data;
    	//DirectX_Device	dxdv(&data);
    
    #include "inc/win_api.h"
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    {
    	//delete data;
    
    	_CrtDumpMemoryLeaks();
    
        return EXIT_SUCCESS;
    }
    
    #include "init_configuration.h"
    #include "Observer.h"
    #include "CInitial.h"
    #include "_ConsoleString.h"
    #include "_UDPSocket.h"
    #include <memory>
    #include <vector>
    #include <string>
    
    class CData 
    {
    	public:
    		CData();
    		//~CData();
    
    //	Control
    
    		bool				get_automatic	();
    		bool				get_console		();
    		bool				get_COMBlue		();
    		bool				get_COMUdp		();
    		bool				get_AbsJoystic	();
    		bool				get_TR_Move		();
    		bool				get_AbsRelTR	();
    		bool				get_MouseL		();
    		bool				get_MouseR		();
    		bool				get_KeyS		(int key);
    
    		bool				get_UDPThread	();
    
    		D3DXVECTOR3*		get_JoystickPtr	();
    		D3DXVECTOR3*		get_AbsJoyPtr	();
    		D3DXVECTOR3*		get_Acceleration();
    		D3DXVECTOR3*		get_RollPitchYaw();
    		int					get_active		(bool toggle);
    		int					get_cX			();
    		int					get_cXi			();
    		int					get_cY			();
    		int					get_cYi			();
    		int					get_WASD_Toggle ();
    		int					get_Mode		();
    		float				get_wheel		();
    
    		void				set_automatic	(bool value);
    		void				set_console		(bool value);
    		void				set_COMBlue		(bool value);
    		void				set_COMUdp		(bool value);
    		void				set_AbsJoystic	(bool value);
    		void				set_TR_Move		(bool value);
    		void				set_AbsRelTR	(bool value);
    		void				set_active		(bool toggle, int value);
    
    		void				set_UDPThread	(bool IsCreated);
    
    		void				set_MouseL		(bool value);
    		void				set_MouseR		(bool value);
    		void				set_Wheel		(float value);
    		void				set_JoystickPtr	(D3DXVECTOR3* vec);
    		void				set_AbsJoyPtr	(D3DXVECTOR3* vec);
    		void				set_Mode		(int value);
    		void				next_WASD		(bool key);
    
    		void				key_Up			(WPARAM wParam);
    		void				key_Down		(WPARAM wParam);
    		void				set_Mouse		(POINT ptCursor);
    		void				refresh_temp_M	();
    		void				calc_relative_M	();
    
    //	Console
    
    		bool				get_wireframe	();
    		bool*				get_wireframe_ptr();
    
    		void				set_ConsoleAttachPointer(vector<_ConsoleString>* ptr);
    		void				append_toConsole		(_ConsoleString line);
    
    //	GUI
    
    		LPD3DXFONT*			get_LPD3font	(int select);
    		void				set_LPD3font	(LPD3DXFONT* font, int select);
    
    //	View Light
    
    		float				get_viewRotH			();
    		float				get_viewRotV			();
    		float				get_viewDist			();
    		D3DXVECTOR3*		get_CamPosPtr			();
    		D3DXVECTOR3*		get_LookAtPtr			();
    		D3DXMATRIX*			get_matViewPtr			();
    		D3DXMATRIX*			get_matProjPtr			();
    
    		void				set_viewRotH			(float value);
    		void				set_viewRotV			(float value);
    		void				set_viewDist			(float value);
    		void				set_CamPosPtr			(D3DXVECTOR3* vec);
    		void				set_CamPos				(D3DXVECTOR3* vec);
    		void				set_LookAtPtr			(D3DXVECTOR3* vec);
    		void				set_LookAt				(D3DXVECTOR3* vec);
    		void				set_matViewPtr			(D3DXMATRIX* mat);
    		void				set_matProjPtr			(D3DXMATRIX* mat);
    
    //	Hexapod
    
    		float				get_LAngle_X			();
    		float				get_LAngle_Y			();
    		float				get_LAngle_Z			();
    		float				get_LAngle_S			();
    		float				get_LHeight				();
    		float				get_LTranX				();
    		float				get_LTranZ				();
    		void				set_LAngle_X			(float value);
    		void				set_LAngle_Y			(float value);
    		void				set_LAngle_Z			(float value);
    		void				set_LAngle_S			(float value);
    		void				set_LHeight				(float value);
    		void				set_LTranX				(float value);
    		void				set_LTranZ				(float value);
    
    //	Leg	Get/Set
    
    		void				attach_WTarget			(int leg, Observer* obs);
    		void				attach_Target			(int leg, Observer* obs);
    		void				attach_SvoAngle			(int leg, Observer* obs);
    
    		float				get_SvoAngle			(int leg, int servo);
    		float				get_SvoRelativeAngle	(int leg, int servo);
    		D3DXVECTOR3*		get_WorldTargetPtr		(int leg);
    		D3DXVECTOR3*		get_WTargetTempPtr		(int leg);
    		D3DXVECTOR3*		get_TargetPtr			(int leg);
    		D3DXVECTOR3*		get_PosVecPtr			(int leg, int pos);
    		D3DXMATRIX*			get_matTransformPtr		(int leg, int value);
    		D3DXMATRIX*			get_matDirPtr			(int leg);
    		D3DXMATRIX*			get_matTransPosPtr		(int leg);
    		D3DXMATRIX*			get_matBodySizePtr		();
    		D3DXMATRIX*			get_matAxisSizePtr		();
    		D3DXMATRIX*			get_matRot90Ptr			();
    		D3DXMATRIX*			get_matTurnPtr			();
    		D3DXMATRIX*			get_matTransSOPtr		();
    
    		D3DXMATRIX*			get_matTransVSPtr		();
    		D3DXMATRIX*			get_matTransOSPtr		();
    		D3DXMATRIX*			get_matTransUSPtr		();
    
    		void				set_SvoAngle			(int leg, int servo, float value);
    		void				set_SvoAngle			(int leg, float v1, float v2, float v3, float v4);
    		void				set_WorldTarget			(int leg, D3DXVECTOR3* vec);
    		void				set_WTargetTemp			(int leg, D3DXVECTOR3* vec);
    		void				set_Target				(int leg, D3DXVECTOR3* vec);
    		void				set_matTransform		(int leg, int value, D3DXMATRIX* mat);
    		void				set_matDir				(int leg, D3DXMATRIX* mat);
    		void				set_matTransPos			(int leg, D3DXMATRIX* mat);
    		void				set_matBodySize			(D3DXMATRIX*	mat);
    		void				set_matAxisSize			(D3DXMATRIX*	mat);
    
    //	General
    
    		void				attach_BegScene			(Observer* obs);
    		void				call_SceneCtrl			();
    		void				call_SceneGUI			();
    
    		void				RestartProcess			();
    		bool				KillThisProcess			();
    
    		_CInitial*			get_INI					();
    		_UDPSocket*			get_UDP					();
    
    		int					get_ReadDelay			();
    		void				set_ReadDelay			(int value);		
    
    //////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////
    
    	private:
    
    // Ctrl	Data
    
    		int					m_active[2];
    
    		bool				m_automatic;
    		bool				m_console;
    		bool				m_COMBlue;
    		bool				m_COMUdp;
    		bool				m_AbsJoystic;
    		bool				m_TR_Move;
    		bool				m_AbsRelTR;
    
    		bool				m_UDPthreadIsCreated;
    
    		int					m_WASD_Toggle;
    		int					m_Mode;
    		bool				m_Toggle;
    
    		int					m_X,	m_Y;
    		int					m_Xi,	m_Yi;
    		float				m_wheel, m_tempW;
    		int					m_tempX, m_tempY;
    		D3DXVECTOR3			m_Joystick;
    		D3DXVECTOR3			m_AbsJoystick;
    		D3DXVECTOR3			m_Acceleration;
    		D3DXVECTOR3			m_RollPitchYaw;
    
    		bool				m_mouseL, m_mouseR;
    		bool				m_keystate[256];
    
    // Console
    
    		bool								m_wireframe;
    		vector<_ConsoleString>*				m_pConsoleText;
    
    // GUI  Data
    
    		LPD3DXFONT*			m_LPD3font_Display;
    		LPD3DXFONT*			m_LPD3font_Console;
    
    //	View Light
    
    		float				m_viewRotHori;
    		float				m_viewRotVert;
    		float				m_viewDistance;
    
    		D3DXVECTOR3*		m_CamPos;
    		D3DXVECTOR3*		m_LookAt;
    
    		D3DXMATRIX*			m_matView;
    		D3DXMATRIX*			m_matProjection;
    
    // Hexa Data
    
    		float				m_LHeight;
    		float				m_LTranX;
    		float				m_LTranZ;
    		float				m_LAngle_X;
    		float				m_LAngle_Y;
    		float				m_LAngle_Z;
    		float				m_LAngle_S;
    
    // Leg	Data
    		std::vector<Observer*>	m_obsWTarget[6];
    		std::vector<Observer*>	m_obsTarget[6];
    		std::vector<Observer*>	m_obsSvoAngle[6];
    
    		float				m_Length[4];
    		float				m_SvoAngle[6][4];
    		float				m_SvoRelativeAngle[6][4];
    		D3DXVECTOR3			m_WorldTarget[6];
    		D3DXVECTOR3			m_WTargetTemp[6];
    		D3DXVECTOR3			m_Target[6];
    		D3DXVECTOR3			m_PosVec[6][5];
    
    		D3DXMATRIX			m_matTransform[6][6];
    		D3DXMATRIX			m_matDir[6];
    		D3DXMATRIX			m_matTransPos[6];
    		D3DXMATRIX			m_matBodySize;
    		D3DXMATRIX			m_matAxisSize;
    		D3DXMATRIX			m_matRot90, m_matTurn, m_matTransSO;
    		D3DXMATRIX			m_matTransVS, m_matTransOS, m_matTransUS;
    
    //	General
    
    		vector<Observer*>	m_obsBeginScene;
    		bool				m_KillThisProcess;
    
    		//_CInitial			m_CIni;
    		//_UDPSocket			m_UDPSocket;
    
    		int					m_ReadDelay;
    		int					m_InputDelay;
    
    };
    
    #include "../inc/CData.h"
    #include <fstream>
    #include <string>
    
    CData :: CData()
    	//:	m_UDPSocket(&m_Acceleration, &m_RollPitchYaw),
    	//	m_CIni()
    
    {
    	/*unsigned int i;
    
    //	Ctrl	///////////////////////////////////////////////////////////////////////////
    
    	m_mouseL		= false;
    	m_mouseR		= false;
    
    	m_wheel			= 0.0f;
    	m_X				= 400;
    	m_Y				= 400;
    
    	m_WASD_Toggle	= 1;
    	m_Toggle		= false;
    
    	for(i = 0; i < 256; i++)	m_keystate[i] = false; 
    
    	m_Acceleration	= D3DXVECTOR3(0, 0, 0); 
    	m_RollPitchYaw	= D3DXVECTOR3(0, 0, 0);
    
    //	Console	///////////////////////////////////////////////////////////////////////////
    
    	m_wireframe = false;
    //	View	///////////////////////////////////////////////////////////////////////////
    
    	m_viewDistance	= 50.0f;
    	m_viewRotHori	= 0;
    	m_viewRotVert	= 0;
    
    //	Leg		///////////////////////////////////////////////////////////////////////////
    
    	m_Length[0]	= 3.29f;
    	m_Length[1]	= 1.5f;
    	m_Length[2]	= 6.78f;
    	m_Length[3]	= 8.07f;
    
    	D3DXMatrixRotationZ		(&m_matRot90,		D3DXToRadian(-90));
    	D3DXMatrixScaling		(&m_matBodySize,	0.1f, 0.1f, 0.1f);
    	D3DXMatrixScaling		(&m_matAxisSize,	0.05f, 2.0f, 0.05f);
    	D3DXMatrixRotationY		(&m_matTurn,		D3DXToRadian(180));
    
    	D3DXMatrixTranslation	(&m_matTransSO,	   -m_Length[0], 0, 0);
    	D3DXMatrixTranslation	(&m_matTransVS,		0, m_Length[1], 0);
    	D3DXMatrixTranslation	(&m_matTransOS,		0, m_Length[2], 0);
    	D3DXMatrixTranslation	(&m_matTransUS,		0, m_Length[3], 0);
    
    //	General	///////////////////////////////////////////////////////////////////////////
    
    	m_KillThisProcess	= false;
    	m_ReadDelay			= 0;*/
    }
    
    //	Control	///////////////////////////////////////////////////////////////////////////
    bool		CData	::		get_automatic	()
    {	
    	return m_automatic;						
    }
    bool		CData	::		get_console		()
    {	
    	return m_console;						
    }
    bool		CData	::		get_COMBlue		()
    {	
    	return m_COMBlue;						
    }
    bool		CData	::		get_COMUdp()
    {
    	return m_COMUdp;
    }
    bool		CData	::		get_AbsJoystic	()
    {
    	return m_AbsJoystic;
    }
    bool		CData	::		get_TR_Move		()
    {
    	return m_TR_Move;
    }
    bool		CData	::		get_AbsRelTR	()
    {
    	return m_AbsRelTR;
    }
    bool		CData	::		get_MouseL		()
    {	
    	return m_mouseL;						
    }
    bool		CData	::		get_MouseR		()
    {	
    	return m_mouseR;						
    }
    D3DXVECTOR3* CData	::		get_JoystickPtr	()
    {	
    	return &m_Joystick;						
    }
    D3DXVECTOR3* CData	::		get_AbsJoyPtr	()
    {
    	return &m_AbsJoystick;
    }
    D3DXVECTOR3* CData	::		get_Acceleration()
    {
    	return &m_Acceleration;
    }
    D3DXVECTOR3* CData	::		get_RollPitchYaw()
    {
    	return &m_RollPitchYaw;
    }
    bool		CData	::		get_KeyS		(int key)
    {	
    	if(key >= 0 && key < 256)	return m_keystate[key];
    	else						return false; 
    }
    bool		CData	::		get_UDPThread	()
    {
    	return m_UDPthreadIsCreated;
    }
    
    int			CData	::		get_active		(bool toggle)
    {	
    	if(toggle)	return m_active[1];
    	else		return m_active[0];			
    }
    int			CData	::		get_cX			()
    {	
    	return m_X;								
    }
    int			CData	::		get_cXi			()
    {	
    	return m_Xi;							
    }
    int			CData	::		get_cY			()
    {	
    	return m_Y;								
    }
    int			CData	::		get_cYi			()
    {	
    	return m_Yi;							
    }
    int			CData	::		get_Mode		()
    {
    	return m_Mode;
    }
    int			CData	::		get_WASD_Toggle	()
    {
    	return m_WASD_Toggle;
    }
    float		CData	::		get_wheel		()
    {	
    	return m_wheel;							
    }
    void		CData	::		set_automatic	(bool value)
    {	
    	m_automatic = value;					
    }
    void		CData	::		set_console		(bool value)
    {	
    	m_console	= value;					
    }
    void		CData	::		set_COMBlue		(bool value)
    {	
    	m_COMBlue	= value;					
    }
    void		CData	::		set_COMUdp		(bool value)
    {
    	m_COMUdp	= value;
    	if(!value)	
    	{
    		//m_UDPSocket.Reset();
    		//m_UDPthreadIsCreated = false;
    	}
    }
    void		CData	::		set_AbsJoystic	(bool value)
    {
    	m_AbsJoystic = value;
    }
    void		CData	::		set_TR_Move		(bool value)
    {
    	m_TR_Move = value;
    }
    void		CData	::		set_AbsRelTR	(bool value)
    {
    	m_AbsRelTR = value;
    }
    void		CData	::		set_active		(bool toggle, int value)
    {	
    	m_active[toggle] = value;				
    }
    
    void		CData	::		set_UDPThread	(bool IsCreated)
    {
    	m_UDPthreadIsCreated = IsCreated;
    }
    
    void		CData	::		set_MouseL		(bool value)
    {	
    	m_mouseL = value;						
    }
    void		CData	::		set_MouseR		(bool value)
    {	
    	m_mouseR = value;						
    }
    void		CData	::		set_Wheel		(float value)
    {	
    	m_wheel	 = value;						
    }
    void		CData	::		set_JoystickPtr	(D3DXVECTOR3* vec)
    {	
    	m_Joystick = *vec;						
    }
    void		CData	::		set_AbsJoyPtr	(D3DXVECTOR3* vec)
    {
    	m_AbsJoystick = *vec;
    }
    void		CData	::		set_Mode		(int value)
    {
    	m_Mode = value;
    }
    void		CData	::		next_WASD		(bool key)
    {
    	if(key)
    	{
    		if(m_Toggle == false)
    		{
    			m_Toggle = true;
    			m_WASD_Toggle += 1;
    			if(m_WASD_Toggle >= 4) m_WASD_Toggle = 1;
    		}
    	}
    	else
    	{
    		m_Toggle = false;
    	}
    }
    void		CData	::		key_Down		(WPARAM wParam)
    {
    	switch(wParam)
    	{
    		case 0x01:	m_keystate[CL_LBUTTON]		= TRUE;		break;
    		case 0x02:	m_keystate[CL_RBUTTON]		= TRUE;		break;
    		case 0x03:	m_keystate[CL_CANCEL]		= TRUE;		break;
    		case 0x04:	m_keystate[CL_MBUTTON]		= TRUE;		break;
    		case 0x05:	m_keystate[CL_XBUTTON1]		= TRUE;		break;
    		case 0x06:	m_keystate[CL_XBUTTON2]		= TRUE;		break;
    		//0x07		undefined
    		case 0x08:	m_keystate[CL_BACKSPACE]	= TRUE;		break;
    		case 0x09:	m_keystate[CL_TAB]			= TRUE;		break;
    		//0x0A-0B	undefined
    		case 0x0C:	m_keystate[CL_CLEAR]		= TRUE;		break;
    		case 0x0D:	m_keystate[CL_RETURN]		= TRUE;		break;
    		//0x0E-ßF	undefined
    		case 0x10:	m_keystate[CL_SHIFT]		= TRUE;		break;
    		case 0x11:	m_keystate[CL_CTRL]			= TRUE;		break;
    		case 0x12:	m_keystate[CL_ALT]			= TRUE;		break;
    		case 0x13:	m_keystate[CL_PAUSE]		= TRUE;		break;
    		case 0x14:	m_keystate[CL_CAPS]			= TRUE;		break;
    		case 0x15:	m_keystate[CL_KANA]			= TRUE;		break;
    		// 17-19	IME	
    		case 0x1B:	PostQuitMessage(0);						break;
    		// 1C-1E	IME
    		case 0x20:	m_keystate[CL_SPACE]		= TRUE;		break;
    		case 0x21:	m_keystate[CL_PRIOR]		= TRUE;		break;
    		case 0x22:	m_keystate[CL_NEXT]			= TRUE;		break;
    		case 0x23:	m_keystate[CL_END]			= TRUE;		break;
    		case 0x24:	m_keystate[CL_HOME]			= TRUE;		break;
    		case 0x25:	m_keystate[CL_LEFT]			= TRUE;		break;
    		case 0x26:	m_keystate[CL_UP]			= TRUE;		break;
    		case 0x27:	m_keystate[CL_RIGHT]		= TRUE;		break;
    		case 0x28:	m_keystate[CL_DOWN]			= TRUE;		break;
    		case 0x29:	m_keystate[CL_SELECT]		= TRUE;		break;
    		case 0x2A:	m_keystate[CL_PRINT]		= TRUE;		break;
    		case 0x2B:	m_keystate[CL_EXECUTE]		= TRUE;		break;
    		case 0x2C:	m_keystate[CL_SNAPSHOT]		= TRUE;		break;
    		case 0x2D:	m_keystate[CL_INS]			= TRUE;		break;
    		case 0x2E:	m_keystate[CL_DEL]			= TRUE;		break;
    		case 0x2F:	m_keystate[CL_HELP]			= TRUE;		break;
    		case 0x30:	m_keystate[CL_0]			= TRUE;		break;
    		case 0x31:	m_keystate[CL_1]			= TRUE;		break;
    		case 0x32:	m_keystate[CL_2]			= TRUE;		break;
    		case 0x33:	m_keystate[CL_3]			= TRUE;		break;
    		case 0x34:	m_keystate[CL_4]			= TRUE;		break;
    		case 0x35:	m_keystate[CL_5]			= TRUE;		break;
    		case 0x36:	m_keystate[CL_6]			= TRUE;		break;
    		case 0x37:	m_keystate[CL_7]			= TRUE;		break;
    		case 0x38:	m_keystate[CL_8]			= TRUE;		break;
    		case 0x39:	m_keystate[CL_9]			= TRUE;		break;
    		//0x3A - 40 undefined
    		case 0x41:	m_keystate[CL_A]			= TRUE;		break;
    		case 0x42:	m_keystate[CL_B]			= TRUE;		break;
    		case 0x43:	m_keystate[CL_C]			= TRUE;		break;
    		case 0x44:	m_keystate[CL_D]			= TRUE;		break;
    		case 0x45:	m_keystate[CL_E]			= TRUE;		break;
    		case 0x46:	m_keystate[CL_F]			= TRUE;		break;
    		case 0x47:	m_keystate[CL_G]			= TRUE;		break;
    		case 0x48:	m_keystate[CL_H]			= TRUE;		break;
    		case 0x49:	m_keystate[CL_I]			= TRUE;		break;
    		case 0x4A:	m_keystate[CL_J]			= TRUE;		break;
    		case 0x4B:	m_keystate[CL_K]			= TRUE;		break;
    		case 0x4C:	m_keystate[CL_L]			= TRUE;		break;
    		case 0x4D:	m_keystate[CL_M]			= TRUE;		break;
    		case 0x4E:	m_keystate[CL_N]			= TRUE;		break;
    		case 0x4F:	m_keystate[CL_O]			= TRUE;		break;
    		case 0x50:	m_keystate[CL_P]			= TRUE;		break;
    		case 0x51:	m_keystate[CL_Q]			= TRUE;		break;
    		case 0x52:	m_keystate[CL_R]			= TRUE;		break;
    		case 0x53:	m_keystate[CL_S]			= TRUE;		break;
    		case 0x54:	m_keystate[CL_T]			= TRUE;		break;
    		case 0x55:	m_keystate[CL_U]			= TRUE;		break;
    		case 0x56:	m_keystate[CL_V]			= TRUE;		break;
    		case 0x57:	m_keystate[CL_W]			= TRUE;		break;
    		case 0x58:	m_keystate[CL_X]			= TRUE;		break;
    		case 0x59:	m_keystate[CL_Y]			= TRUE;		break;
    		case 0x5A:	m_keystate[CL_Z]			= TRUE;		break;
    		case 0x5B:	m_keystate[CL_LWIN]			= TRUE;		break;
    		case 0x5C:	m_keystate[CL_RWIN]			= TRUE;		break;
    		case 0x5D:	m_keystate[CL_APPS]			= TRUE;		break;
    		//0x5E		reserved
    		case 0x5F:	m_keystate[CL_SLEEP]		= TRUE;		break;
    		case 0x60:	m_keystate[CL_NUM0]			= TRUE;		break;
    		case 0x61:	m_keystate[CL_NUM1]			= TRUE;		break;
    		case 0x62:	m_keystate[CL_NUM2]			= TRUE;		break;
    		case 0x63:	m_keystate[CL_NUM3]			= TRUE;		break;
    		case 0x64:	m_keystate[CL_NUM4]			= TRUE;		break;
    		case 0x65:	m_keystate[CL_NUM5]			= TRUE;		break;
    		case 0x66:	m_keystate[CL_NUM6]			= TRUE;		break;
    		case 0x67:	m_keystate[CL_NUM7]			= TRUE;		break;
    		case 0x68:	m_keystate[CL_NUM8]			= TRUE;		break;
    		case 0x69:	m_keystate[CL_NUM9]			= TRUE;		break;
    		case 0x6A:	m_keystate[CL_MULTIPLY]		= TRUE;		break;
    		case 0x6B:	m_keystate[CL_ADD]			= TRUE;		break;
    		case 0x6C:	m_keystate[CL_SEP]			= TRUE;		break;
    		case 0x6D:	m_keystate[CL_SUB]			= TRUE;		break;
    		case 0x6E:	m_keystate[CL_DECIMAL]		= TRUE;		break;
    		case 0x6F:	m_keystate[CL_DIVIDE]		= TRUE;		break;
    		case 0x70:	m_keystate[CL_F1]			= TRUE;		break;
    		case 0x71:	m_keystate[CL_F2]			= TRUE;		break;
    		case 0x72:	m_keystate[CL_F3]			= TRUE;		break;
    		case 0x73:	m_keystate[CL_F4]			= TRUE;		break;
    		case 0x74:	m_keystate[CL_F5]			= TRUE;		break;
    		case 0x75:	m_keystate[CL_F6]			= TRUE;		break;
    		case 0x76:	m_keystate[CL_F7]			= TRUE;		break;
    		case 0x77:	m_keystate[CL_F8]			= TRUE;		break;
    		case 0x78:	m_keystate[CL_F9]			= TRUE;		break;
    		case 0x79:	m_keystate[CL_F10]			= TRUE;		break;
    		case 0x7A:	m_keystate[CL_F11]			= TRUE;		break;
    		case 0x7B:	m_keystate[CL_F12]			= TRUE;		break;
    		case 0x7C:	m_keystate[CL_F13]			= TRUE;		break;
    		case 0x7D:	m_keystate[CL_F14]			= TRUE;		break;
    		case 0x7E:	m_keystate[CL_F15]			= TRUE;		break;
    		case 0x7F:	m_keystate[CL_F16]			= TRUE;		break;
    		case 0x80:	m_keystate[CL_F17]			= TRUE;		break;
    		case 0x81:	m_keystate[CL_F18]			= TRUE;		break;
    		case 0x82:	m_keystate[CL_F19]			= TRUE;		break;
    		case 0x83:	m_keystate[CL_F20]			= TRUE;		break;
    		case 0x84:	m_keystate[CL_F21]			= TRUE;		break;
    		case 0x85:	m_keystate[CL_F22]			= TRUE;		break;
    		case 0x86:	m_keystate[CL_F23]			= TRUE;		break;
    		case 0x87:	m_keystate[CL_F24]			= TRUE;		break;
    		//0x88-8F	Unassigned
    		case 0x90:	m_keystate[CL_NUMLOCK]		= TRUE;		break;
    		case 0x91:	m_keystate[CL_NUMLOCK]		= TRUE;		break;
    		//0x92-96	OEM specific
    		//0x97-9F	Unassigned
    		case 0xA0:	m_keystate[CL_LSHIFT]		= TRUE;		break;
    		case 0xA1:	m_keystate[CL_RSHIFT]		= TRUE;		break;
    		case 0xA2:	m_keystate[CL_LCTRL]		= TRUE;		break;
    		case 0xA3:	m_keystate[CL_RCTRL]		= TRUE;		break;
    		case 0xA4:	m_keystate[CL_LMENU]		= TRUE;		break;
    		case 0xA5:	m_keystate[CL_RMENU]		= TRUE;		break;
    		// Browser Keys
    		case 0xBA:	m_keystate[CL_OEM_1]		= TRUE;		break;	//	
    		case 0xBB:	m_keystate[CL_OEM_PLUS]		= TRUE;		break;	
    		case 0xBC:	m_keystate[CL_OEM_COMMA]	= TRUE;		break;
    		case 0xBD:	m_keystate[CL_OEM_MINUS]	= TRUE;		break;
    		case 0xBE:	m_keystate[CL_OEM_PERIOD]	= TRUE;		break;	
    		case 0xBF:	m_keystate[CL_OEM_2]		= TRUE;		break;	//	
    		case 0xC0:	m_keystate[CL_OEM_3]		= TRUE;		break;	//	
    		// 0xC1-D7	Reserved
    		// 0xD8-DA	Unassigned
    		case 0xDB:	m_keystate[CL_OEM_4]		= TRUE;		break;	//	
    		case 0xDC:	m_keystate[CL_OEM_5]		= TRUE;		break;
    		case 0xDD:	m_keystate[CL_OEM_6]		= TRUE;		break;
    		case 0xDE:	m_keystate[CL_OEM_7]		= TRUE;		break;
    		case 0xDF:	m_keystate[CL_OEM_8]		= TRUE;		break;
    		// ...	}
    	}
    }
    void		CData	::		key_Up			(WPARAM wParam)
    {
    	switch(wParam)
    	{
    		case 0x01:	m_keystate[CL_LBUTTON]		= FALSE;		break;
    		case 0x02:	m_keystate[CL_RBUTTON]		= FALSE;		break;
    		case 0x03:	m_keystate[CL_CANCEL]		= FALSE;		break;
    		case 0x04:	m_keystate[CL_MBUTTON]		= FALSE;		break;
    		case 0x05:	m_keystate[CL_XBUTTON1]		= FALSE;		break;
    		case 0x06:	m_keystate[CL_XBUTTON2]		= FALSE;		break;
    		//0x07		undefined
    		case 0x08:	m_keystate[CL_BACKSPACE]	= FALSE;		break;
    		case 0x09:	m_keystate[CL_TAB]			= FALSE;		break;
    		//0x0A-0B	undefined
    		case 0x0C:	m_keystate[CL_CLEAR]		= FALSE;		break;
    		case 0x0D:	m_keystate[CL_RETURN]		= FALSE;		break;
    		//0x0E-ßF	undefined
    		case 0x10:	m_keystate[CL_SHIFT]		= FALSE;		break;
    		case 0x11:	m_keystate[CL_CTRL]			= FALSE;		break;
    		case 0x12:	m_keystate[CL_ALT]			= FALSE;		break;
    		case 0x13:	m_keystate[CL_PAUSE]		= FALSE;		break;
    		case 0x14:	m_keystate[CL_CAPS]			= FALSE;		break;
    		case 0x15:	m_keystate[CL_KANA]			= FALSE;		break;
    		// 17-19	IME	
    		case 0x1B:	PostQuitMessage(0);							break;
    		// 1C-1E	IME
    		case 0x20:	m_keystate[CL_SPACE]		= FALSE;		break;
    		case 0x21:	m_keystate[CL_PRIOR]		= FALSE;		break;
    		case 0x22:	m_keystate[CL_NEXT]			= FALSE;		break;
    		case 0x23:	m_keystate[CL_END]			= FALSE;		break;
    		case 0x24:	m_keystate[CL_HOME]			= FALSE;		break;
    		case 0x25:	m_keystate[CL_LEFT]			= FALSE;		break;
    		case 0x26:	m_keystate[CL_UP]			= FALSE;		break;
    		case 0x27:	m_keystate[CL_RIGHT]		= FALSE;		break;
    		case 0x28:	m_keystate[CL_DOWN]			= FALSE;		break;
    		case 0x29:	m_keystate[CL_SELECT]		= FALSE;		break;
    		case 0x2A:	m_keystate[CL_PRINT]		= FALSE;		break;
    		case 0x2B:	m_keystate[CL_EXECUTE]		= FALSE;		break;
    		case 0x2C:	m_keystate[CL_SNAPSHOT]		= FALSE;		break;
    		case 0x2D:	m_keystate[CL_INS]			= FALSE;		break;
    		case 0x2E:	m_keystate[CL_DEL]			= FALSE;		break;
    		case 0x2F:	m_keystate[CL_HELP]			= FALSE;		break;
    		case 0x30:	m_keystate[CL_0]			= FALSE;		break;
    		case 0x31:	m_keystate[CL_1]			= FALSE;		break;
    		case 0x32:	m_keystate[CL_2]			= FALSE;		break;
    		case 0x33:	m_keystate[CL_3]			= FALSE;		break;
    		case 0x34:	m_keystate[CL_4]			= FALSE;		break;
    		case 0x35:	m_keystate[CL_5]			= FALSE;		break;
    		case 0x36:	m_keystate[CL_6]			= FALSE;		break;
    		case 0x37:	m_keystate[CL_7]			= FALSE;		break;
    		case 0x38:	m_keystate[CL_8]			= FALSE;		break;
    		case 0x39:	m_keystate[CL_9]			= FALSE;		break;
    		//0x3A - 40 undefined
    		case 0x41:	m_keystate[CL_A]			= FALSE;		break;
    		case 0x42:	m_keystate[CL_B]			= FALSE;		break;
    		case 0x43:	m_keystate[CL_C]			= FALSE;		break;
    		case 0x44:	m_keystate[CL_D]			= FALSE;		break;
    		case 0x45:	m_keystate[CL_E]			= FALSE;		break;
    		case 0x46:	m_keystate[CL_F]			= FALSE;		break;
    		case 0x47:	m_keystate[CL_G]			= FALSE;		break;
    		case 0x48:	m_keystate[CL_H]			= FALSE;		break;
    		case 0x49:	m_keystate[CL_I]			= FALSE;		break;
    		case 0x4A:	m_keystate[CL_J]			= FALSE;		break;
    		case 0x4B:	m_keystate[CL_K]			= FALSE;		break;
    		case 0x4C:	m_keystate[CL_L]			= FALSE;		break;
    		case 0x4D:	m_keystate[CL_M]			= FALSE;		break;
    		case 0x4E:	m_keystate[CL_N]			= FALSE;		break;
    		case 0x4F:	m_keystate[CL_O]			= FALSE;		break;
    		case 0x50:	m_keystate[CL_P]			= FALSE;		break;
    		case 0x51:	m_keystate[CL_Q]			= FALSE;		break;
    		case 0x52:	m_keystate[CL_R]			= FALSE;		break;
    		case 0x53:	m_keystate[CL_S]			= FALSE;		break;
    		case 0x54:	m_keystate[CL_T]			= FALSE;		break;
    		case 0x55:	m_keystate[CL_U]			= FALSE;		break;
    		case 0x56:	m_keystate[CL_V]			= FALSE;		break;
    		case 0x57:	m_keystate[CL_W]			= FALSE;		break;
    		case 0x58:	m_keystate[CL_X]			= FALSE;		break;
    		case 0x59:	m_keystate[CL_Y]			= FALSE;		break;
    		case 0x5A:	m_keystate[CL_Z]			= FALSE;		break;
    		case 0x5B:	m_keystate[CL_LWIN]			= FALSE;		break;
    		case 0x5C:	m_keystate[CL_RWIN]			= FALSE;		break;
    		case 0x5D:	m_keystate[CL_APPS]			= FALSE;		break;
    		//0x5E		reserved
    		case 0x5F:	m_keystate[CL_SLEEP]		= FALSE;		break;
    		case 0x60:	m_keystate[CL_NUM0]			= FALSE;		break;
    		case 0x61:	m_keystate[CL_NUM1]			= FALSE;		break;
    		case 0x62:	m_keystate[CL_NUM2]			= FALSE;		break;
    		case 0x63:	m_keystate[CL_NUM3]			= FALSE;		break;
    		case 0x64:	m_keystate[CL_NUM4]			= FALSE;		break;
    		case 0x65:	m_keystate[CL_NUM5]			= FALSE;		break;
    		case 0x66:	m_keystate[CL_NUM6]			= FALSE;		break;
    		case 0x67:	m_keystate[CL_NUM7]			= FALSE;		break;
    		case 0x68:	m_keystate[CL_NUM8]			= FALSE;		break;
    		case 0x69:	m_keystate[CL_NUM9]			= FALSE;		break;
    		case 0x6A:	m_keystate[CL_MULTIPLY]		= FALSE;		break;
    		case 0x6B:	m_keystate[CL_ADD]			= FALSE;		break;
    		case 0x6C:	m_keystate[CL_SEP]			= FALSE;		break;
    		case 0x6D:	m_keystate[CL_SUB]			= FALSE;		break;
    		case 0x6E:	m_keystate[CL_DECIMAL]		= FALSE;		break;
    		case 0x6F:	m_keystate[CL_DIVIDE]		= FALSE;		break;
    		case 0x70:	m_keystate[CL_F1]			= FALSE;		break;
    		case 0x71:	m_keystate[CL_F2]			= FALSE;		break;
    		case 0x72:	m_keystate[CL_F3]			= FALSE;		break;
    		case 0x73:	m_keystate[CL_F4]			= FALSE;		break;
    		case 0x74:	m_keystate[CL_F5]			= FALSE;		break;
    		case 0x75:	m_keystate[CL_F6]			= FALSE;		break;
    		case 0x76:	m_keystate[CL_F7]			= FALSE;		break;
    		case 0x77:	m_keystate[CL_F8]			= FALSE;		break;
    		case 0x78:	m_keystate[CL_F9]			= FALSE;		break;
    		case 0x79:	m_keystate[CL_F10]			= FALSE;		break;
    		case 0x7A:	m_keystate[CL_F11]			= FALSE;		break;
    		case 0x7B:	m_keystate[CL_F12]			= FALSE;		break;
    		case 0x7C:	m_keystate[CL_F13]			= FALSE;		break;
    		case 0x7D:	m_keystate[CL_F14]			= FALSE;		break;
    		case 0x7E:	m_keystate[CL_F15]			= FALSE;		break;
    		case 0x7F:	m_keystate[CL_F16]			= FALSE;		break;
    		case 0x80:	m_keystate[CL_F17]			= FALSE;		break;
    		case 0x81:	m_keystate[CL_F18]			= FALSE;		break;
    		case 0x82:	m_keystate[CL_F19]			= FALSE;		break;
    		case 0x83:	m_keystate[CL_F20]			= FALSE;		break;
    		case 0x84:	m_keystate[CL_F21]			= FALSE;		break;
    		case 0x85:	m_keystate[CL_F22]			= FALSE;		break;
    		case 0x86:	m_keystate[CL_F23]			= FALSE;		break;
    		case 0x87:	m_keystate[CL_F24]			= FALSE;		break;
    		//0x88-8F	Unassigned
    		case 0x90:	m_keystate[CL_NUMLOCK]		= FALSE;		break;
    		case 0x91:	m_keystate[CL_NUMLOCK]		= FALSE;		break;
    		//0x92-96	OEM specific
    		//0x97-9F	Unassigned
    		case 0xA0:	m_keystate[CL_LSHIFT]		= FALSE;		break;
    		case 0xA1:	m_keystate[CL_RSHIFT]		= FALSE;		break;
    		case 0xA2:	m_keystate[CL_LCTRL]		= FALSE;		break;
    		case 0xA3:	m_keystate[CL_RCTRL]		= FALSE;		break;
    		case 0xA4:	m_keystate[CL_LMENU]		= FALSE;		break;
    		case 0xA5:	m_keystate[CL_RMENU]		= FALSE;		break;
    		// Browser Keys
    		case 0xBA:	m_keystate[CL_OEM_1]		= FALSE;		break;		
    		case 0xBB:	m_keystate[CL_OEM_PLUS]		= FALSE;		break;	
    		case 0xBC:	m_keystate[CL_OEM_COMMA]	= FALSE;		break;
    		case 0xBD:	m_keystate[CL_OEM_MINUS]	= FALSE;		break;
    		case 0xBE:	m_keystate[CL_OEM_PERIOD]	= FALSE;		break;	
    		case 0xBF:	m_keystate[CL_OEM_2]		= FALSE;		break;		
    		case 0xC0:	m_keystate[CL_OEM_3]		= FALSE;		break;		
    		// 0xC1-D7	Reserved
    		// 0xD8-DA	Unassigned
    		case 0xDB:	m_keystate[CL_OEM_4]		= FALSE;		break;	
    		case 0xDC:	m_keystate[CL_OEM_5]		= FALSE;		break;
    		case 0xDD:	m_keystate[CL_OEM_6]		= FALSE;		break;
    		case 0xDE:	m_keystate[CL_OEM_7]		= FALSE;		break;
    		case 0xDF:	m_keystate[CL_OEM_8]		= FALSE;		break;
    		// ...
    	}
    }
    void		CData	::		set_Mouse		(POINT ptCursor)
    {
    	m_X			= ptCursor.x;
    	m_Y			= ptCursor.y;
    }
    void		CData	::		refresh_temp_M	()
    {
    	m_tempX		= m_X;
    	m_tempY		= m_Y;
    	m_tempW		= m_wheel;
    }
    void		CData	::		calc_relative_M	()
    {
    	m_Xi		= m_X-m_tempX;
    	m_Yi		= m_Y-m_tempY;
    	m_wheel	   -= m_tempW;
    }
    
    //	Console	///////////////////////////////////////////////////////////////////////////
    
    bool		CData	::		get_wireframe()
    {
    	return m_wireframe;
    }
    bool*		CData	::		get_wireframe_ptr()
    {
    	return &m_wireframe;
    }
    void		CData	::		set_ConsoleAttachPointer(vector<_ConsoleString>* ptr)
    {
    	m_pConsoleText = ptr;
    }
    void		CData	::		append_toConsole(_ConsoleString line)
    {
    	m_pConsoleText->push_back(line);
    }
    
    //	GUI		///////////////////////////////////////////////////////////////////////////
    
    LPD3DXFONT*	CData	::		get_LPD3font	(int select)
    {	
    	switch(select)
    	{	
    		case 1:
    			return m_LPD3font_Display;	
    			break;
    		case 2:
    			return m_LPD3font_Console;
    			break;
    		default:
    			return m_LPD3font_Display;
    			break;
    	}
    }
    void		CData	::		set_LPD3font	(LPD3DXFONT* font, int select)
    {	
    	switch(select)
    	{	
    		case 1:
    			m_LPD3font_Display = font;	
    			break;
    		case 2:
    			m_LPD3font_Console = font;	
    			break;
    	}					
    }
    
    //	View	///////////////////////////////////////////////////////////////////////////
    
    float		CData	::		get_viewRotH	()
    {	
    	return m_viewRotHori;					
    }
    float		CData	::		get_viewRotV	()
    {	
    	return m_viewRotVert;					
    }
    float		CData	::		get_viewDist	()
    {	
    	return m_viewDistance;					
    }
    D3DXVECTOR3* CData	::		get_CamPosPtr	()
    {	
    	return m_CamPos;						
    }
    D3DXVECTOR3* CData	::		get_LookAtPtr	()
    {	
    	return m_LookAt;						
    }
    D3DXMATRIX*	CData	::		get_matViewPtr	()
    {	
    	return m_matView;						
    }
    D3DXMATRIX*	CData	::		get_matProjPtr	()
    {	
    	return m_matProjection;					
    }
    void		CData	::		set_viewRotH	(float value)
    {	
    	m_viewRotHori = value;					
    }
    void		CData	::		set_viewRotV	(float value)
    {	
    	m_viewRotVert = value;					
    }
    void		CData	::		set_viewDist	(float value)
    {	
    	m_viewDistance = value;					
    }
    void		CData	::		set_CamPosPtr	(D3DXVECTOR3* vec)
    {	
    	m_CamPos = vec;							
    }
    void		CData	::		set_CamPos		(D3DXVECTOR3* vec)
    {	
    	*m_CamPos = *vec;						
    }
    void		CData	::		set_LookAtPtr	(D3DXVECTOR3* vec)
    {	
    	m_LookAt = vec;							
    }
    void		CData	::		set_LookAt		(D3DXVECTOR3* vec)
    {	
    	*m_LookAt = *vec;						
    }
    void		CData	::		set_matViewPtr	(D3DXMATRIX* mat)
    {	
    	m_matView = mat;						
    }
    void		CData	::		set_matProjPtr	(D3DXMATRIX* mat)
    {	
    	m_matProjection = mat;					
    }
    
    //	Hexapod	///////////////////////////////////////////////////////////////////////////
    
    float		CData	::		get_LAngle_X	()
    {
    	return m_LAngle_X;
    }
    float		CData	::		get_LAngle_Y	()
    {
    	return m_LAngle_Y;
    }
    float		CData	::		get_LAngle_Z	()
    {
    	return m_LAngle_Z;
    }
    float		CData	::		get_LAngle_S	()
    {
    	return m_LAngle_S;
    }
    float		CData	::		get_LHeight		()
    {
    	return m_LHeight;
    }
    float		CData	::		get_LTranX		()
    {
    	return m_LTranX;
    }
    float		CData	::		get_LTranZ		()
    {
    	return m_LTranZ;
    }
    void		CData	::		set_LAngle_X	(float value)
    {
    	m_LAngle_X = value;
    }
    void		CData	::		set_LAngle_Y	(float value)
    {
    	m_LAngle_Y = value;
    }
    void		CData	::		set_LAngle_Z	(float value)
    {
    	m_LAngle_Z = value;
    }
    void		CData	::		set_LAngle_S	(float value)
    {
    	m_LAngle_S = value;
    }
    void		CData	::		set_LHeight		(float value)
    {
    	m_LHeight = value;
    }
    void		CData	::		set_LTranX		(float value)
    {
    	m_LTranX = value;
    }
    void		CData	::		set_LTranZ		(float value)
    {
    	m_LTranZ = value;
    }
    
    //	Leg		///////////////////////////////////////////////////////////////////////////
    void		CData	::		attach_WTarget	(int leg, Observer* obs)
    {	
    	m_obsWTarget[leg].push_back(obs);		
    }
    void		CData	::		attach_Target	(int leg, Observer* obs)
    {	
    	m_obsTarget[leg].push_back(obs);		
    }
    void		CData	::		attach_SvoAngle	(int leg, Observer* obs)
    {	
    	m_obsSvoAngle[leg].push_back(obs);		
    }
    
    float		CData	::		get_SvoAngle		(int leg, int servo)
    {	
    	return m_SvoAngle[leg][servo];			
    }
    float		CData	::		get_SvoRelativeAngle(int leg, int servo)
    {
    	return m_SvoRelativeAngle[leg][servo];
    }
    D3DXVECTOR3* CData	::		get_WorldTargetPtr	(int leg)
    {	
    	return &m_WorldTarget[leg];					
    }
    D3DXVECTOR3* CData	::		get_WTargetTempPtr	(int leg)
    {
    	return &m_WTargetTemp[leg];
    }
    D3DXVECTOR3* CData	::		get_TargetPtr		(int leg)
    {	
    	return &m_Target[leg];						
    }
    D3DXVECTOR3* CData	::		get_PosVecPtr		(int leg, int pos)
    {	
    	return &m_PosVec[leg][pos];					
    }
    D3DXMATRIX*	CData	::		get_matTransformPtr	(int leg, int value)
    {	
    	return &m_matTransform[leg][value];			
    }
    D3DXMATRIX*	CData	::		get_matDirPtr		(int leg)
    {	
    	return &m_matDir[leg];						
    }
    D3DXMATRIX*	CData	::		get_matTransPosPtr	(int leg)
    {	
    	return &m_matTransPos[leg];					
    }
    D3DXMATRIX*	CData	::		get_matBodySizePtr	()
    {	
    	return &m_matBodySize;						
    }
    D3DXMATRIX*	CData	::		get_matAxisSizePtr	()
    {	
    	return &m_matAxisSize;					
    }
    D3DXMATRIX*	CData	::		get_matRot90Ptr		()
    {	
    	return &m_matRot90;							
    }
    D3DXMATRIX*	CData	::		get_matTurnPtr		()
    {	
    	return &m_matTurn;							
    }
    D3DXMATRIX*	CData	::		get_matTransSOPtr	()
    {	
    	return &m_matTransSO;						
    }
    D3DXMATRIX*	CData	::		get_matTransVSPtr	()
    {	
    	return &m_matTransVS;						
    }
    D3DXMATRIX*	CData	::		get_matTransOSPtr	()
    {	
    	return &m_matTransOS;						
    }
    D3DXMATRIX*	CData	::		get_matTransUSPtr	()
    {	
    	return &m_matTransUS;						
    }
    
    void		CData	::		set_SvoAngle		(int leg, int servo, float value)
    {
    	m_SvoRelativeAngle[leg][servo] = abs(m_SvoAngle[leg][servo] - value)*180/3.14159f;
    	m_SvoAngle[leg][servo] = value;
    	for(unsigned int i = 0; i < m_obsSvoAngle[leg].size() ; i++) m_obsSvoAngle[leg][i]->notify_SvoAng();
    }
    void		CData	::		set_SvoAngle		(int leg, float v1, float v2, float v3, float v4)
    {
    	m_SvoRelativeAngle[leg][0] = abs(m_SvoAngle[leg][0] - v1)*180/3.14159f;
    	m_SvoRelativeAngle[leg][1] = abs(m_SvoAngle[leg][1] - v2)*180/3.14159f;
    	m_SvoRelativeAngle[leg][2] = abs(m_SvoAngle[leg][2] - v3)*180/3.14159f;
    	m_SvoRelativeAngle[leg][3] = abs(m_SvoAngle[leg][3] - v4)*180/3.14159f;
    
    	m_SvoAngle[leg][0] = v1;
    	m_SvoAngle[leg][1] = v2;
    	m_SvoAngle[leg][2] = v3;
    	m_SvoAngle[leg][3] = v4;
    	for(unsigned int i = 0; i < m_obsSvoAngle[leg].size() ; i++) m_obsSvoAngle[leg][i]->notify_SvoAng();
    }
    void		CData	::		set_WorldTarget	(int leg, D3DXVECTOR3* vec)
    {
    	m_WorldTarget[leg] = *vec;
    	for(unsigned int i = 0; i < m_obsWTarget[leg].size() ; i++) 
    	{
    		//m_obsWTarget[leg][i]->notify_WTarget();
    		m_obsWTarget[leg].at(i)->notify_WTarget();
    	}
    }
    void		CData	::		set_WTargetTemp (int leg, D3DXVECTOR3* vec)
    {
    	m_WTargetTemp[leg] = *vec;
    }
    void		CData	::		set_Target		(int leg, D3DXVECTOR3* vec)
    {
    	m_Target[leg] = *vec;
    	for(unsigned int i = 0; i < m_obsTarget[leg].size() ; i++) m_obsTarget[leg][i]->notify_Target();
    }
    void		CData	::		set_matTransform(int leg, int value, D3DXMATRIX* mat)
    {
    	m_matTransform[leg][value] = *mat;
    	int posval = value;
    	if(value != 2)
    	{
    		if(value > 2) posval -= 1;
    		m_PosVec[leg][posval] = D3DXVECTOR3(m_matTransform[leg][value]._41, m_matTransform[leg][value]._42, m_matTransform[leg][value]._43);
    	}
    }
    void		CData	::		set_matDir		(int leg, D3DXMATRIX* mat)
    {	
    	m_matDir[leg] = *mat;					
    }
    void		CData	::		set_matTransPos	(int leg, D3DXMATRIX* mat)
    {	
    	m_matTransPos[leg] = *mat;				
    }
    void		CData	::		set_matBodySize	(D3DXMATRIX*	mat)
    {	
    	m_matBodySize = *mat;					
    }
    void		CData	::		set_matAxisSize	(D3DXMATRIX*	mat)
    {	
    	m_matAxisSize = *mat;					
    }
    
    //	General	///////////////////////////////////////////////////////////////////////////
    
    void		CData	::		attach_BegScene(Observer* obs)
    {	
    	m_obsBeginScene.push_back(obs);			
    }
    
    void		CData	::		RestartProcess()
    {
    	HMODULE hmod = GetModuleHandle(NULL);//GetCurrentModule();
    	TCHAR exePath[1024];
    	GetModuleFileName(NULL, exePath, 1024);
    
    	STARTUPINFO			startupInfo = {0};
    	PROCESS_INFORMATION processInformation;
    
    	CreateProcess(	exePath, NULL, NULL, NULL, FALSE, 
    					NORMAL_PRIORITY_CLASS, NULL, NULL, 
    					&startupInfo, &processInformation);
    
    	m_KillThisProcess = true;
    }
    bool		CData	::	KillThisProcess()
    {
    	return m_KillThisProcess;
    }
    
    void		CData	::		call_SceneCtrl	()
    {
    	m_obsBeginScene[0]->notify_BegScene();
    }
    void		CData	::		call_SceneGUI	()
    {
    	m_obsBeginScene[1]->notify_BegScene();
    }
    _CInitial*	CData	::	get_INI	()
    {	
    	return new _CInitial();							
    }
    _UDPSocket*	CData	::	get_UDP	()
    {
    	return new _UDPSocket(&m_Acceleration, &m_RollPitchYaw);
    }
    int			CData	::		get_ReadDelay	()
    {	
    	return m_ReadDelay;						
    }
    void		CData	::		set_ReadDelay	(int value)
    {	
    	m_ReadDelay = value;					
    }
    


  • Ich glaube so etwas nennt man monolithische Klasse...



  • Sone schrieb:

    Ich glaube so etwas nennt man monolithische Klasse...

    Alle anderen klassen sind kleiner.
    CData ist nur eine Datenklasse und soll eigentlich nichts machen außer die daten zwischen allen Klassen verwalten und Notifys an die Observer senden wenn auf bestimmte Sachen zugegriffen wurde.

    Wie gesagt... das Projekt ist groß.



  • Ja oder Gottklasse iVm Spaghetticode. Daten an einer einzigen Stelle zu halten klingt erstmal angenehm, bringt aber diverse Nachteile mit sich. Zumindest würde es in kleineren Datenobjekten sammeln. Aber gut, darum geht's hier ja gerade nicht.

    Ich kann da so weit keine möglichen Speicherleaks erkennen. Es gibt keine custom classes, die hier instanziiert werden, new und delete werden ebenfalls nicht verwendet.

    Aber ohne Instanziierung gibt es keine Speicherleaks? Vielleicht findet jemand anders was.



  • Des Rätzels Lösung:

    std::vector<Observer*>	m_obsWTarget[6];
    		std::vector<Observer*>	m_obsTarget[6];
    		std::vector<Observer*>	m_obsSvoAngle[6];
    

    Erzeugt 18 Bytes leak im speicher...
    Aber warum?

    Wieso ich das so gemacht habe:
    Es Melden sich mehrere Observer an, Daher Vectoren.
    Es Gibt 6 Beine, Daher hat jedes Bein, seinen Eigenen Observer Vector.

    edit:
    hier nochmal alles relevante:

    #include "CData.h"
    
    int main(void)
    {
    	CData data;
    
    	_CrtDumpMemoryLeaks();
    	return 0;
    }
    
    class Observer
    {
    	public:
    		virtual void notify_WTarget()		= 0;
    		virtual void notify_Target()		= 0;
    		virtual void notify_SvoAng()		= 0;
    		virtual	void notify_BegScene()		= 0;
    };
    
    class CData 
    {
    	public:
    		CData(){};
    
    	private:
    
    		vector<Observer*>	m_obsWTarget[6];
    		vector<Observer*>	m_obsTarget[6];
    		vector<Observer*>	m_obsSvoAngle[6];
    		vector<Observer*>		m_obsBeginScene;
    };
    


  • Um mal was konstruktives beizutragen:

    Das

    vector<int> v(5); // alloziert globalen Speicher
    
    int main()
    {
      _CrtDumpMemoryLeaks(); // v hält undeleteden Speicher, CrtDump meint, es gibt einen Leak
    } // am Ende der main löscht v den Speicher, aber CrtDumpMemoryLeaks wurde schon vorher aufgerufen
    

    Moral: nie globale Variablen nehmen und nicht CrtDumpMemoryLeaks nehmen, sondern richtige Profiler.



  • einfach herrlich schrieb:

    Um mal was konstruktives beizutragen:

    Das

    vector<int> v(5); // alloziert globalen Speicher
    
    int main()
    {
      _CrtDumpMemoryLeaks(); // v hält undeleteden Speicher, CrtDump meint, es gibt einen Leak
    } // am Ende der main löscht v den Speicher, aber CrtDumpMemoryLeaks wurde schon vorher aufgerufen
    

    Moral: nie globale Variablen nehmen und nicht CrtDumpMemoryLeaks nehmen, sondern richtige Profiler.

    Interessant. Also tauchen bei mir einige Sachen als "Leaks" auf die garkeine sind?
    Und was wäre denn sei ein richtiger Profiler?



  • Valgrind zum Beispiel.

    Ich selbst komme aber auch eher mit crtDumpMemoryLeaks klar.

    Aber globale Leaks findest du eher weniger damit



  • Korrigier mich, wenn ich falsch liege, aber ist _CrtDumpMemoryLeaks nicht eine MSVC-Funktion und Valgrind nur für Linux verfügbar?



  • Ja zu der MSVC Frage. Nein zu Valgrind. Ich meine es gibt das als Portierung auch für Windows.

    Hier
    Aber das sieht nach externen Entwicklern aus, daher wird wohl die Funktionalität eingeschränkt sein. Aber keine Ahnung, ich hab bisher nur auf Ubuntu mit Valgrind gearbeitet.



  • Dieses Valgrind ist eine Lib die mir soetwas wie "_CrtDumpMemoryLeaks()" gibt, nur das es etwas besser und tiefgehender greift?

    PS: Ich hatte wohl nie leaks....
    Ich habe jetzt alles so gebaut das ich die Freigabe bereits vor dem _CrtDumpMemoryLeaks() mache. Also nicht wie vorher mit erreichen vom Ende der Main.
    Ich hab jetzt wieder das alte Programm von vor 3 Tagen mit veränderter main:
    Und siehe da. Keine Leaks.

    #include "inc/init_configuration.h"
    #include "inc/render_frame.h"
    #include "inc/hexapod.h"
    #include "inc/control.h"
    #include "inc/GUI3D.h"
    #include "inc/Console.h"
    #include "inc/DirectX_Device.h"
    #include "inc/Cdata.h"
    #include "inc/_IStrategy.h"
    #include "inc/_IStrategyVal.h"
    
    	CData*				data = new CData();
    	DirectX_Device*		dxdv = new DirectX_Device(data);
    
    #include "inc/win_api.h"
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    {
    	RECT screen;
    	screen.top		= 0;
    	screen.bottom	= data->get_INI()->Data()->Screen_Height;
    	screen.left		= 0;
    	screen.right	= data->get_INI()->Data()->Screen_Width;
    	AdjustWindowRect(&screen, WS_OVERLAPPEDWINDOW, false);
    
    	int width, height;
    
    	width	= screen.right - screen.left;
    	height	= screen.bottom - screen.top;
    
        HWND hWnd;
        WNDCLASSEX wc;
    
        ZeroMemory(&wc, sizeof(WNDCLASSEX));
    
        wc.cbSize			= sizeof(WNDCLASSEX);
        wc.style			= CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc		= WindowProc;
        wc.hInstance		= hInstance;
        wc.hCursor			= LoadCursor(NULL, IDC_ARROW);
        wc.lpszClassName	= "WindowClass";
    
        RegisterClassEx(&wc);
    
        hWnd = CreateWindowEx(NULL, "WindowClass", "Lua-Engine",
    						  WS_OVERLAPPEDWINDOW, 0, 0, width, height,
                              NULL, NULL, hInstance, NULL);
        ShowWindow(hWnd, nCmdShow);
    
    	dxdv->set_instance(&hInstance, hWnd);
    
    	_IStrategy		:: m_CData = data;
    	_IStrategyVal	:: m_CData = data;
    
    	Hexapod*		hexa	= new Hexapod(data);
    	GUI3D*			gui		= new GUI3D(data);
    	Console*		cons	= new Console(data);
    	Control*		ctrl	= new Control(data, hexa, cons);
    
        MSG msg;
    	while(!data->KillThisProcess())
        {
    		gui->start_clock();
    
    		data->refresh_temp_M();
    
            while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            if(msg.message == WM_QUIT)	break;
    
    		data->calc_relative_M();
    
    		render_frame(dxdv, gui, ctrl, cons, data);
    
    		gui->stop_clock();
        }
    
    	dxdv->clean_D3D();
    
    	delete ctrl;
    	delete cons;
    	delete gui;
    	delete hexa;
    	delete dxdv;
    	delete data;
    
    	_CrtDumpMemoryLeaks();
    
        return EXIT_SUCCESS;
    }
    

    Auch wenn ich noch interesse an diesem Valgrind habe, sage ich schon mal Dankeschön an alle die Tipps und Ideen eingebracht haben! 🙂



  • Und warum nutzt du überhaupt globale Variablen, wo du sie gar nicht brauchst?
    Und Valgrind ist ein externes Tool.



  • Ja, aber es ersetzt beim Aufruf sämtliche Speicherallokationsfunktiond es Betriebssystems durch eigene Funktionen, und die protokollieren alle Informationen und können dir danach sagen, wie viel Speicher du gebraucht hast, wieder freigegeben hast oder eben nicht.

    Dadurch läft das Programm jedoch nur noch sehr langsam.



  • Nathan schrieb:

    Und warum nutzt du überhaupt globale Variablen, wo du sie gar nicht brauchst?

    Für die Windowproc funktion "#inlcude ind/win_api.h"

    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch(message)
        {
            case WM_DESTROY:
                    PostQuitMessage(0);
                    return 0;
    				break;
    
    		case WM_KEYUP:
    			data->key_Up(wParam);
    			break;
    
    		case WM_KEYDOWN:
    			data->key_Down(wParam);
    			break;
    
    		case WM_MOUSEMOVE:
    			if( dxdv->get_device() )
    				{
    					POINT ptCursor;
    					GetCursorPos( &ptCursor );
    					data->set_Mouse(ptCursor);
    					(dxdv->get_device())->SetCursorPosition( ptCursor.x, ptCursor.y, 0 );
                    }
    				break;
    		case WM_LBUTTONDOWN:
    				data->set_MouseL(true);
    				break;
    		case WM_LBUTTONUP:
    				data->set_MouseL(false);
    				break;
    		case WM_RBUTTONDOWN:
    				data->set_MouseR(true);
    				break;
    		case WM_RBUTTONUP:
    				data->set_MouseR(false);
    				break;
    
    		case WM_MOUSEWHEEL:
    				data->set_Wheel(GET_WHEEL_DELTA_WPARAM(wParam));
    				break;
    
    		case WM_ACTIVATEAPP:
    				if(wParam)
    					dxdv->reset_D3D();
    				break;
        }
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
    

Anmelden zum Antworten