【发布时间】:2014-03-20 06:13:18
【问题描述】:
如果下面的合并令人困惑,这是我试图实现的高级方法:
我有两个向量 vector<void *>
说vectorA =具有三个元素:void * aa, void * ab, void *ac
和vectorB = 有三个元素:void * ba, void * bb, void *bc
组合为vectorC:三个元素:void * ca, void * cb, void *cc
其中 void * ca 是 aa 和 ba 的组合
我有以下代码将两个 std::vector 类型的向量合并为一个新的结果: 它是我班级的一部分(QuadTree)
void QuadTree::combineInsertData( const vector <void *> &data, size_t numDataTuples, const vector <void *> &addData, size_t numAddDataTuples, vector<void *> &resData){
cout << "\t\t in combine Function" << endl;
cout << " \t\tnumDataTuples: " << numDataTuples << endl;
cout << " \t\tnumAddDataTuples: " << numAddDataTuples << endl;
for (int c = 0; c != numCols_; c++) {
resData[c] = malloc( (numDataTuples + numAddDataTuples) * colElemSizes_[c]);
memcpy(resData[c] , data[c] , numDataTuples * colElemSizes_[c]);
memcpy(resData[c] + numDataTuples , addData[c] , numAddDataTuples * colElemSizes_[c]);
}
}
它似乎没有做它应该做的事情,我不知道为什么。 这是我的使用方法:(简单的手动测试)
vector<void *> newInsertData;
newInsertData.resize(numCols_, 0); //numCols_ = 3 in my test case
combineInsertData(insertData, numTuples, allSubdivData, subDivTupNum, newInsertData);
cout << "TEST TEST " << endl;
cout << " insertData[0][400]" << *((double *)insertData[0] + 400) << endl;
cout << " newInsertData[0][400]" << *((double *)newInsertData[0] + 400) << endl;
cout << " insertData[0][5]" << *((double *)insertData[0] + 5) << endl;
cout << " newInsertData[0][5]" << *((double *)newInsertData[0] + 5) << endl;
cout << " insertData[0][499]" << *((double *)insertData[0] + 499) << endl;
cout << " newInsertData[0][499]" << *((double *)newInsertData[0] + 499) << endl;
cout << " allSubdivData[0][0]" << *((double *)allSubdivData[0] ) << endl;
cout << " newInsertData[0][500]" << *((double *)newInsertData[0] + 500) << endl;
cout << " allSubdivData[0][1]" << *((double *)allSubdivData[0] + 1) << endl;
cout << " newInsertData[0][501]" << *((double *)newInsertData[0] + 501) << endl;
注意: 我是 C/C++ 新手,不胜感激。 在测试代码中,似乎只有第一个 memcpy 正在工作,而第二个没有(来自 combine 函数)。
??问题 ??
是不是因为是void *所以行
resData[c] + numDataTuples 没有意义?至于偏移量应该在哪里?
这是打印出来的内容
TEST TEST | CHUNK: writing -5.69494e+06
insertData[0][400]-7.97392e+06 | CHUNK: writing -3.51803e+06
newInsertData[0][400]-7.97392e+06 | tup index = 116
insertData[0][5]-6.83384e+06 | CHUNK: writing -5.43468e+06
newInsertData[0][5]-6.83384e+06 | CHUNK: writing -3.03083e+06
insertData[0][499]-7.83881e+06 | tup index = 131
newInsertData[0][499]-7.83881e+06 | CHUNK: writing -6.50737e+06
allSubdivData[0][0]-6.86119e+06 | CHUNK: writing -4.1256e+06
newInsertData[0][500]649399 | tup index = 132
allSubdivData[0][1]-8.94236e+06 | CHUNK: writing -6.67862e+06
newInsertData[0][501]0
已修复 错误在这一行:
memcpy(resData[c] + numDataTuples , addData[c] , numAddDataTuples * colElemSizes_[c]);
应该是
memcpy(resData[c] + numDataTuples * colElemSizes_[c] , addData[c] , numAddDataTuples * colElemSizes_[c]);这是我之前怀疑的。
【问题讨论】:
-
你能概括地描述一下当你说“合并”时你想要做什么吗?我问的原因是很少有一个函数、一组函数、算法等可以做你想做的事情而不必重新发明轮子。
-
只是我将两个 void 指针合二为一。除了我有 2 个 void 指针向量,其中第一个条目应与第一个条目组合,第二个条目应与第二个...等
-
即使您进行了编辑,它仍然没有意义。指针只不过是一个整数值。所以忘记“指针”这个词——假装那些是整数。既然这些是整数,那么合并是什么意思?
-
我在下面的其他评论中回答了您的问题。
-
好吧,void 指针就像一个数组指针,但指向的数据类型一开始是未知的。