2016-09-01 11 views
-2

私はlineVerticesという線の頂点のベクトルを持っています。このデータをOpenGLシェイプを描画するために渡すので、このベクトルは配列の形でなければなりません。私は推測している。私は、次のコードを試してみた:ベクトルからダイナミック配列への値の割り当て(C++)

float* lineArray = new float[lineVertices.size()](); 

for (unsigned i = 0; i < lineVertices.size(); i++) { 
    lineArray[i] = lineVertices.at(i); 
} 

しかし、ベクトルの各要素は唯一の配列の最初の要素に割り当てられてきていることが表示されます。 lineArrayという識別子が最初の要素へのポインタであっても、動的配列のさまざまな要素にアクセスする別の方法がありますか?

私は、デバッグしていたとき、それは、助けている場合、それは私も以下のコードを試してみましたが、これもないlineVertices'サイズは明らかに1

より大きいものの、lineArrayのサイズは、常に1であることを述べています作業。

float* lineArray = &lineVertices[0]; 

ご協力いただきましてありがとうございます。

+1

ここではいくつかの助けだ:どのようにについてのヘルプセンターの記事を読みます[mcve]をアセンブルし、それに応じて質問を編集します。 –

+0

ベクトル/配列を渡している特定のOpenGL関数は何ですか?あなたは現在どのようにそれを呼んでいますか? – qxz

+0

*したがって、このベクトルは配列の形でなければなりません。 'vector'は' vector :: data() '関数を呼び出すだけで探している'配列 'を持っていることを知っていますか? – PaulMcKenzie

答えて

1

std::vectorを、OpenGL関数に直接渡すことができます。これは、配列へのポインタです。 ::data()メンバ関数を使用してください。例:

std::vector<float> vec = ...; 
glVertex2fv(vec.data()); // only uses the first two elements 

このようなOpenGL関数は、1つ以上の要素へのポインタをとります。これは、newで作成された生の配列である必要はありません。要素の連続したリストへのポインタでなければなりません。 vector.data()を使用してstd::vectorの内容(最初の要素)へのポインタを取得します。

あなたが本当に手動メモリ管理を使用して新しい配列を作成したい場合は、この(あなたが投稿したコードと同じ効果)を行うことができます。

float* arr = new float[vec.size()]; // NO() - not a constructor, but operator new[] 
for (size_t i = 0; i < vec.size(); i++) { 
    arr[i] = vec[i]; 
} 
+0

私はglVertex2fv()を使用しようとしていますが、これは配列へのポインタしかかかりません。どうすればこのことが起こるでしょうか? – nlhenderson17

+0

私の例を更新しました。 – qxz

+1

@qxz - '// NO() - コンストラクタではなく演算子new []' - 'new []'の使用法にかっこを加えることは完全に有効です。それが行うのは、要素をゼロ初期化することだけです。 – PaulMcKenzie

関連する問題