Chinaunix首页 | 论坛 | 博客
  • 博客访问: 149995
  • 博文数量: 32
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 515
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-11 09:57
文章分类

全部博文(32)

文章存档

2011年(1)

2009年(4)

2008年(27)

我的朋友

分类: C/C++

2008-06-01 20:45:47

     (原创)今天在项目中,遇到一个问题,需要将一个二维数据中的数据拷贝,暂存,然后送到一个表格中心显示,本来是一个简单的问题,但是弄了半天才弄好,主要是因为没有仔细研究需要拷贝的数组中数据的存放方式。写好后,调试通过的拷贝函数如下:
     void Mainwindow::data(char **dbResult, int nRow, int nColumn)
{
       m_nRow = nRow;
      m_nColumn = nColumn;
   
   m_pData = new char* [(nRow+1)*nColumn];
   for(int i=0;i<(nRow+1)*nColumn;i++)
   {
                m_pData[i] = new char [strlen(dbResult[i])+1];
         memcpy(m_pData[i],dbResult[i],strlen(dbResult[i])+1);
         }
         
}
 
 char **dbResult ;dbResult中的数据是同过SQlite3中使用函数
int sqlite3_get_table(sqlite3*, const char *sql, char **&dbResult, int *nRow, int *nColumn, char **errmsg );得到,仔细看了下,dbResult是查询结果,原来它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:第一行是字段名称,后面是紧接着是每个字段的值, dbResult 的字段值是连续的,从第0索引到第 nColumn - 1索引都是字段名称,从第 nColumn 索引开始,后面都是字段值,它把一个二维的表(传统的行列表示法)用一个扁平的形式来表示;
         于是开始写拷贝程序,
            for(int i=0;i<(nRow+1)*nColumn;i++)
   {
                             m_pData[i] = new char [1];
                 memcpy(m_pData[i],dbResult[i],strlen(dbResult[i]));
         }
          编译后发现显示到表格上的始终有乱码,再仔细分析,dbResult每一行结束后有一个\0结束符,
    将程序改为
              for(int i=0;i<(nRow+1)*nColumn;i++)
   {
                m_pData[i] = new char [strlen(dbResult[i])+1];
         memcpy(m_pData[i],dbResult[i],strlen(dbResult[i])+1);
          }
    于是大功告成,
    一个小小的问题没有注意,居然浪费了不少时间!
阅读(4703) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~