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
, Но будьте осторожны с адресами элементов в векторах. Если вы измените вектор (добавив или удалив элементы), он может перераспределить свой контент, и адреса элементов могут измениться.