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 я создаю буфер символов [1000][300] и добавляю его в setDataBuffer, то в части cout выполняем: cout << buffer[j] << endl;

это работает просто отлично. Так я не совсем уверен, где я облажался?

буфер char - это то же самое, что и col.buffer, не так ли?

Я не думаю, что это имеет значение, но структура столбцов определяется в заголовочном файле.

1 ответ

Решение

Я думаю, setDataBuffer заполняет буфер, который вы передаете в качестве параметра (здесь это col.buffer), затем вы помещаете его в вектор, так что новый struct Columns выделяется vec и это копировать col содержание. Сейчас col а также vec[0] два разных объекта.

Затем вы вызываете некоторые методы, которые заполняют буфер, который вы сначала передали ему. Так оно заполняет col.bufferи ты читаешь vec[0].buffer, которые отличаются, потому что они 2 разных объекта.

Одно из решений было бы сделать vec.emplace_back(); создать один экземпляр, а затем передать vec[0].buffer в setDataBuffer, Но будьте осторожны с адресами элементов в векторах. Если вы измените вектор (добавив или удалив элементы), он может перераспределить свой контент, и адреса элементов могут измениться.

Другие вопросы по тегам