0

尝试通过将包含 char 缓冲区的结构存储到向量中来最小化 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 buffer[1000][300] 并将其放入 setDataBuffer 中,然后在 cout 部分执行: cout << buffer[j] << endl;

效果很好。所以我不确定我在哪里搞砸了?

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

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

4

1 回答 1

1

我猜setDataBuffer填充了你作为参数传递的缓冲区(这里是 col.buffer),然后你把它推到向量中,所以一个新struct Columns的被分配vec并复制col内容。现在colvec[0]是两个不同的对象。

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

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

于 2017-07-07T00:38:09.507 回答