怎样得到矩阵的数组
我有一个很简单的类,代码在下面,我希望从它的实例得到一个含有15个矩阵的数组。我知道不能直接得到数组,只能得到指针,遇到麻烦了。请过路侠客拔刀相助,谢谢!
我就是想使用GetLCVMList()函数得到我要的数组的指针。
如果代码这样写:
- C/C++ code
class CMatrix{public: CMatrix() { D3DXMatrixIdentity( &m_LCPM ) ; m_Position[0] = m_Position[1] = m_Position[2] = D3DXVECTOR3( 0.f ,0.f,0.f) ; for ( int i = 0 ; i < 3 ; i ++ ) D3DXMatrixIdentity( &m_LCVMList[i] ) ; } ; ~CMatrix() {} ; void SetPosition( D3DXVECTOR3 Position[3] ) { for ( int i = 0 ; i < 3 ; i ++ ) m_Position[i] = Position[i] ; UpdateLCVM() ; }; void UpdateLCVM () { D3DXVECTOR3 Di[5] = { D3DXVECTOR3( 0.f , -1.f , 0.f) ,D3DXVECTOR3( 1.f , 0.f , 0.f) ,D3DXVECTOR3( -1.f , 0.f , 0.f) ,D3DXVECTOR3( 0.f , 0.f , 1.f) ,D3DXVECTOR3( 0.f , 0.f , -1.f) } ; D3DXVECTOR3 Up( 0.01f , 1.f , 0.01f ) ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 5 ; j ++ ) { D3DXVECTOR3 At = m_Position[i] + Di[j] ; D3DXMatrixLookAtLH( &m_LCVMList[5*i+j] , &m_Position[i] ,&At ,&Up ) ; } } }; D3DXMATRIX* GetLCPM() { D3DXMatrixPerspectiveFovLH( &m_LCPM, D3DX_PI/2, 1.f, 0.1f, 20.f ); return &m_LCPM ; } ; D3DXMATRIX* GetLCVMList() { return m_LCVMList ; } ;private: D3DXMATRIX m_LCPM ,m_LCVMList[15] ; D3DXVECTOR3 m_Position[3] ;};编译没有任何问题,但从结果上看,输出的数据是不正确的。
如果代码这样写:
- C/C++ code
class CMatrix{public: CMatrix() { D3DXMatrixIdentity( &m_LCPM ) ; m_Position[0] = m_Position[1] = m_Position[2] = D3DXVECTOR3( 0.f ,0.f,0.f) ; for ( int i = 0 ; i < 3 ; i ++ ) D3DXMatrixIdentity( m_pLCVMList[i] ) ; } ; ~CMatrix() {} ; void SetPosition( D3DXVECTOR3 Position[3] ) { for ( int i = 0 ; i < 3 ; i ++ ) m_Position[i] = Position[i] ; UpdateLCVM() ; }; void UpdateLCVM () { D3DXVECTOR3 Di[5] = { D3DXVECTOR3( 0.f , -1.f , 0.f) ,D3DXVECTOR3( 1.f , 0.f , 0.f) ,D3DXVECTOR3( -1.f , 0.f , 0.f) ,D3DXVECTOR3( 0.f , 0.f , 1.f) ,D3DXVECTOR3( 0.f , 0.f , -1.f) } ; D3DXVECTOR3 Up( 0.01f , 1.f , 0.01f ) ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 5 ; j ++ ) { D3DXVECTOR3 At = m_Position[i] + Di[j] ; D3DXMatrixLookAtLH( m_pLCVMList[5*i+j] , &m_Position[i] ,&At ,&Up ) ; }//?????????????????????????????? } }; D3DXMATRIX* GetLCPM() { D3DXMatrixPerspectiveFovLH( &m_LCPM, D3DX_PI/2, 1.f, 0.1f, 20.f ); return &m_LCPM ; } ; D3DXMATRIX** GetLCVMList() { return m_pLCVMList ; } ;private: D3DXMATRIX m_LCPM ,*m_pLCVMList[15] ; D3DXVECTOR3 m_Position[3] ;};就出现访问冲突,问题出在构造函数中的D3DXMatrixIdentity( m_pLCVMList[i] )句上。我想应该是声明的不对,但我不理解。
究竟该怎样做?请大侠们指点下。谢谢了。
[解决办法]
你说的错误绝不是在返回值上,是在于D3DXMatrixLookAtLH这个函数的实现上。
另外你*m_pLCVMList[15]这个定义是定义了一个有15个D3DXMATRIX指针的数组,
初始化要这样:
m_pLCVMList[0] = new D3DXMATRIX;//或者是 D3DXMATRIX a, = &a
我想跟你预先想的肯定是不一样的。
另外多说一句,既然准备玩类了,为什么不用std::vector呢,速度也不差,而且封装好的。
[解决办法]
你这里面貌似有很多问题,需要贴出D3DXMatrixLookAtLH这个怎么给赋值的。
1 m_pLCVMList如果本身就是个3*5的矩阵,应该声明为m_pLCVMList[3][5]然后用的时候&m_pLCVMList[i][j]或者
(m_pLCVMList+5*i+j) 这两个都代表i j位置的元素指针。
2 第二个编不过去是因为你函数参数声明为 D3DXMATRIX* 你不能拿个值去做参数 m_pLCVMList[5*i+j]