读书人

怎么得到矩阵的数组

发布时间: 2012-11-04 10:42:42 作者: rapoo

怎样得到矩阵的数组
我有一个很简单的类,代码在下面,我希望从它的实例得到一个含有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]

读书人网 >C++

热点推荐