OCCI - setDataBuffer + vector<struct>



试图通过将包含字符缓冲区的结构存储到向量中来最小化 OCCI 数组提取的行数,代码如下:

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,而是创建一个char缓冲区[1000][300]并将其扔到setDataBuffer中,然后在cout部分中执行以下操作: cout <<buffer[j] <<endl;

这很好用。所以我真的不确定我在哪里搞砸了?

char 缓冲区与 col.buffer 完全相同,不是吗?

我认为这并不重要,但结构列是在头文件中定义的。

我猜setDataBuffer填充您作为参数传递的缓冲区(这里是col.buffer(,然后将其推送到向量中,因此vec分配一个新的struct Columns并复制col内容。现在colvec[0]是两个不同的对象。

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

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

相关内容

  • 没有找到相关文章

最新更新