ベクターに文字バッファを含む構造体を記憶することによってフェッチOCCIアレイに行の量を最小化しようとすると、以下のコード:いくつかの理由で今OCCI - にsetDataBuffer +ベクター<struct>
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;
}
、このdoesntの仕事。しかし、col.bufferを使用する代わりに、charバッファ[1000] [300]を作成し、それをsetDataBufferに入れて、次にcout部分に入れます: cout < <バッファ[j] < < endl;
うまく動作します。だから私は本当に私が悩んでいるのか分からないのですか?
charバッファはcol.bufferとまったく同じですが、そうではありませんか?
私はそれが重要だとは思わないが、構造体列はヘッダーファイルで定義されています。
したがって、push_backはcharバッファの内容をコピーしませんか?それは混乱している、それについてのドキュメンテーションはそれがコピーを言う、それがすべてをコピーすると思った。しかし、emplace_backソリューションはうまくいきました。ありがとうございます。 – user1324674
それはそれをコピーしますが、いったんそれがコピーされると、同じ内容の他のオブジェクトだけです。おそらく、デフォルトでオブジェクトを参照として使用するJSのC#のような別の言語で開発したことがあります。つまり、 'b'という名前のオブジェクト' a'のコピーを作成し、 'b'を変更すると、' a'の内容も変更されます。実際のコピーが必要な場合は、複製する必要があります。 C/C++では、デフォルトとは異なり、値が使用されます。これは、 'a = b'、' a'が 'b'のクローンである場合、それらのいずれかを変更すると、他のものは変更されません(' a'を明示的に ' int &a = b; ') – Ludonope
正確にはどうなりますか?オリジナルは範囲外になり、代わりにデータが置き換えられ、データはなくなりましたか?ただし、ベクトルの使用はsetdatabuffer関数では機能しないようです。なぜ私は理解できないのですか?知りたいですか?これは1列で動作しますが、複数の列があるとクラッシュします。 – user1324674