2017-07-06 14 views
0

ベクターに文字バッファを含む構造体を記憶することによってフェッチ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とまったく同じですが、そうではありませんか?

私はそれが重要だとは思わないが、構造体列はヘッダーファイルで定義されています。

答えて

1

私はsetDataBuffervecによって割り当てられ、それがcolコンテンツをコピーされた後、あなたは、ベクターに押し込み、(col.bufferここにある)あなたは、パラメータとして渡すバッファを埋めるので、新しいstruct Columns思います。現在colvec[0]は2つの異なるオブジェクトです。

次に、最初に渡したバッファを満たすいくつかのメソッドを呼び出します。したがって、col.bufferが埋め込まれ、vec[0].bufferと表示されます。これは、2つの異なるオブジェクトであるために異なります。

代わりに、vec.emplace_back();を実行して1つのインスタンスを作成し、次にvec[0].buffersetDataBufferに渡すことが1つの解決策です。しかし、ベクトルの要素のアドレスには注意が必要です。ベクトルを変更すると(要素の追加または削除)、要素の内容を再割り当てすることができ、要素のアドレスが変更される可能性があります。

+0

したがって、push_backはcharバッファの内容をコピーしませんか?それは混乱している、それについてのドキュメンテーションはそれがコピーを言う、それがすべてをコピーすると思った。しかし、emplace_backソリューションはうまくいきました。ありがとうございます。 – user1324674

+0

それはそれをコピーしますが、いったんそれがコピーされると、同じ内容の他のオブジェクトだけです。おそらく、デフォルトでオブジェクトを参照として使用するJSのC#のような別の言語で開発したことがあります。つまり、 'b'という名前のオブジェクト' a'のコピーを作成し、 'b'を変更すると、' a'の内容も変更されます。実際のコピーが必要な場合は、複製する必要があります。 C/C++では、デフォルトとは異なり、値が使用されます。これは、 'a = b'、' a'が 'b'のクローンである場合、それらのいずれかを変更すると、他のものは変更されません(' a'を明示的に ' int &a = b; ') – Ludonope

+0

正確にはどうなりますか?オリジナルは範囲外になり、代わりにデータが置き換えられ、データはなくなりましたか?ただし、ベクトルの使用はsetdatabuffer関数では機能しないようです。なぜ私は理解できないのですか?知りたいですか?これは1列で動作しますが、複数の列があるとクラッシュします。 – user1324674

関連する問題