(原创)今天在项目中,遇到一个问题,需要将一个二维数据中的数据拷贝,暂存,然后送到一个表格中心显示,本来是一个简单的问题,但是弄了半天才弄好,主要是因为没有仔细研究需要拷贝的数组中数据的存放方式。写好后,调试通过的拷贝函数如下:
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) |