2011-01-23 7 views
1

私はSTDを持っている::ベクトルとして定義される:配列の長さとしてベクトルのサイズを使用できますか?

std::vector<glm::vec3> faces; 

そして、私はfloatの配列の長さとしてそのベクトルの大きさを使用します。今すぐこのようにしようとしています:

float vertices[faces.size()][3]; 

しかし、私は一定の値を使用しなければならないというエラーが出ています。ベクトルのサイズが変わる可能性があったためだと思ったので、代わりにこれを試しました。

しかし、私はまだ同じエラーが発生します。これは可能ですか?

+0

なぜこのようなことをしたいのですか?確かに、これはより良い解決策があるはずです。 –

+0

私はOpenGL用の.objローダーを作成しようとしていますが、現在はすべての内容を読み込んでベクターに保存しています。チュートリアルで私が知っていることを踏まえて、私は今、私がVertex Buffer Objectsを使っているので、頂点データを巨大な浮動小数点配列として送る必要があります。これは良い方法だと思っていましたが、今までのすべてのコメントに基づいて、私のためにモデルを読み込むためのライブラリがあれば、ほんとうに良いかもしれません。私は前に1つを見つけることを試みることを覚えたが、しかしよいものを見つけることができなかった。 – krej

+1

このコメントは質問にする必要があります。 –

答えて

4

なぜ、C配列を使用したいのですか? vectorはここではるかに適しています。

vector<vector<float> > vertices(faces.size(), vector<float>(3)); 

そして、あなたはすでに内部ベクトルとそのサイズの大きさが固定され、それは構造体が、ここでベクトルよりも優れて適しているでしょう安全な賭けであることを知っている場合:

struct vertex { 
    float x; 
    float y; 
    float z; 
}; 

vector<vertex> vertices(faces.size()); 

の有用性Cスタイルのベクトルはで、ひどくがC++で制限されています。唯一の用途は、基本的に、コンパイル時にサイズ(および通常はコンテンツ)が分かっていて、それを栄光の定数として使用する場合です。それ以外のものには、より良い容器があります。そして、このニッチでさえ、次の標準でstd::arrayで埋められています。

2

標準的なC++ではありません(コンパイラによっては非標準言語拡張として提供されていると思いますが)。

あなたが何か行うことができます:あなたはいくつかの点でdelete [] verticesする必要がありますので、これは今、ヒープ上に割り当てられたことを

float (*vertices)[3] = new int[faces.size()][3]; 

注意を。

0

スタック上に配列のサイズが一定でない配列(自動変数とも呼ばれます)を定義することはできません。配列のサイズはコンパイル時に知っている必要があります。どのように多くのスタックスペースが配列のために予約するかコンパイラは知っていますか?

実行時までサイズが決定されない配列を使用する場合は、new演算子を使用してヒープ上に配列を定義する必要があります。

1

問題は、非定数式を使用してコンパイル時に配列のサイズを作成しようとしていることです。 vector :: sizeは実行時操作です。 2番目の例では、コンパイラが賢明であると思うかもしれませんが、コンパイラはその変数を最適化して、実際に実行時にしか認識されない量を使用していると推測します。

Cライブラリや他のものと統合する必要がない限り(私はあなたがC言語のOpenGL呼び出しを使用しているのを見ています)、Boost::multi_arrayを参照することをお勧めします。したがって、

boost::multi_array<float,2> myFloats(boost::extents[myVector.size()][3]); 
関連する問題