Chinaunix首页 | 论坛 | 博客
  • 博客访问: 542710
  • 博文数量: 59
  • 博客积分: 4096
  • 博客等级: 上校
  • 技术积分: 1445
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-10 11:33
文章分类

全部博文(59)

文章存档

2011年(3)

2009年(2)

2008年(54)

我的朋友

分类:

2008-03-03 23:27:01

// 初始化
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) |
给主人留下些什么吧!~~

chinaunix网友2009-07-02 10:42:09

HXSFDFUYgjbkjvys544D65S