2017-07-06 116 views
0

试图尽量减少线的数量为一个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完全相同,是不是?

我不认为它很重要,但结构列在头文件中定义。

回答

1

我猜setDataBuffer罢了,你通过,那么你将其推入载体缓冲区作为参数(这是col.buffer这里),所以一个新的struct Columnsvec分配并复制col内容。现在colvec[0]是两个不同的对象。

然后你调用一些方法来填充你首先传递给它的缓冲区。所以它填充col.buffer,你读vec[0].buffer,这是不同的,因为它们是2个不同的对象。

一种解决方案将代替vec.emplace_back();创建一个实例,然后将vec[0].buffer传递给setDataBuffer。但要注意向量中元素的地址。如果修改矢量(添加或删除元素),则可以重新分配其内容,并且元素地址可能会更改。

+0

因此,push_back不会复制字符缓冲区的内容?这很令人困惑,它上面的文档说它会复制,认为它会复制一切。 emplace_back解决方案,但是,谢谢。 – user1324674

+0

好吧,它复制它,但一旦它被复制,它是另一个对象,只有相同的内容。也许你曾经用一种不同的语言来开发,比如默认使用对象作为参考的JS的C#。这意味着如果你拷贝一个名为'b'的对象'a'并修改'b','a'的内容也会被修改。如果你想要一个真正的副本,你需要克隆它。在C/C++中它不同,它默认使用值。这意味着如果你做'a = b','a'是'b'的克隆,如果你修改其中一个,另一个不被修改(除非你明确定义'a'作为参考, int &a = b;') – Ludonope

+0

那么究竟发生了什么?原来的范围/取代然后poof,数据已经没有了?但是,使用矢量似乎不适用于setdatabuffer函数。我不太明白为什么,你会碰巧知道吗?它适用于1列,但如果有超过1列,它会崩溃。 – user1324674

相关问题