试图尽量减少线的数量为一个OCCI阵列由存储包含char缓冲区到载体一个结构取,以下代码:OCCI - setDataBuffer +矢量<struct>
struct Columns { char buffer[1000][300]; };
int i = 1;
Columns col;
ub4* ub = NULL;
results->setDataBuffer(i++, col.buffer, OCCI_SQLT_STR, sizeof(col.buffer[ 0 ]), ub);
vec.push_back(col);
cout << "Before, vec size: " << vec.size() << "\n"; // prints 1, as expected
while (results->next(1000)) {
for (size_t j = 0; j < results->getNumArrayRows(); ++j) {
cout << vec[ 0 ].buffer[ j ] << endl;
}
现在出于某种原因,这并不工作。但是,如果不是使用col.buffer,我创建了一个字符缓冲区[1000] [300],然后把它扔进setDataBuffer,然后在cout部分执行: cout < < buffer [j] < < endl;
工作得很好。所以我不确定我在搞什么?
char缓冲区与col.buffer完全相同,是不是?
我不认为它很重要,但结构列在头文件中定义。
因此,push_back不会复制字符缓冲区的内容?这很令人困惑,它上面的文档说它会复制,认为它会复制一切。 emplace_back解决方案,但是,谢谢。 – user1324674
好吧,它复制它,但一旦它被复制,它是另一个对象,只有相同的内容。也许你曾经用一种不同的语言来开发,比如默认使用对象作为参考的JS的C#。这意味着如果你拷贝一个名为'b'的对象'a'并修改'b','a'的内容也会被修改。如果你想要一个真正的副本,你需要克隆它。在C/C++中它不同,它默认使用值。这意味着如果你做'a = b','a'是'b'的克隆,如果你修改其中一个,另一个不被修改(除非你明确定义'a'作为参考, int &a = b;') – Ludonope
那么究竟发生了什么?原来的范围/取代然后poof,数据已经没有了?但是,使用矢量似乎不适用于setdatabuffer函数。我不太明白为什么,你会碰巧知道吗?它适用于1列,但如果有超过1列,它会崩溃。 – user1324674