首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCCI - setDataBuffer + vector<struct>

OCCI - setDataBuffer + vector<struct>
EN

Stack Overflow用户
提问于 2017-07-07 07:25:13
回答 1查看 249关注 0票数 0

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

代码语言:javascript
复制
    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 buffer1000并将其放入setDataBuffer中,则在cout部分中这样做: cout << bufferj << endl;

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

字符缓冲区和col.buffer是完全一样的,不是吗?

我不认为这有什么关系,但是结构列是在头文件中定义的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-07 08:38:10

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44960314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档