// 初始化
template
HRESULT ZTable::Init(int w,int h)
{
ZASSERT(w > 0 && h > 0);
ZASSERT(m_Table == NULL);
// 分配的空间可以放下h行,w列,外加每行一个指针的大小
m_Table = (T **)malloc(sizeof(T *) * h + sizeof(T) * w * h);
assert(m_Table != NULL);
BYTE *tmp = (BYTE *)m_Table + sizeof(T *) * h;
//初始化头部的指针,使得他们都指向后面的各行
for(int i = 0; i < h; i++)
{
m_Table[i] = (T *)tmp;
tmp += sizeof(T) * w;
}
m_Width = w;
m_Height = h;
return S_OK;
}
// 获得数据
template
inline T &ZTable::GetData(int x,int y)
{
ZASSERT(x >= 0 && x < m_Width);
ZASSERT(y >= 0 && y < m_Height);
//当然,这里访问的方法即便与二维数组类似。但仍然不是真正的二维数组
return m_Table[y][x];
}
// 设置数据
template
inline void ZTable::SetData(int x,int y,T &t)
{
ZASSERT(x >= 0 && x < m_Width);
ZASSERT(y >= 0 && y < m_Height);
m_Table[y][x] = t;
}
相比之下,真正的二维数组的width和height都是由编译器维护的,编译时编译器给出了用于计算了二维访问时的偏移量的width和height。
但既然是动态的,width和height就不可能向编译器所取了...只能自己保存好。
阅读(1418) | 评论(1) | 转发(0) |