2016-04-03 13 views
2

C++のベクタに問題があります。私はC++の初心者ですので、この点を心に留めてください。構造体のベクトルをC++で初期化する方法

だから私は私のプログラムの初めに次の構造体があります。

typedef struct grupo 
{ 
    float transX, transY, transZ, rotX, rotY, rotZ, rotAngle, scaleX, scaleY, scaleZ; 
    char **modelos; 
    struct grupo** grupos; 
    int nNomes = 0, nGrupos=0; 
    std::vector<float> vertices; 
}; 

struct grupo *grupo; 

を私はちょうどこのようにメインを起動します。

grupo = (struct grupo*)malloc(sizeof(struct grupo)); 
grupo->modelos = (char **)malloc(sizeof(1)); 
grupo->grupos = (struct grupo **)malloc(sizeof(struct grupo)); 

そしてメインの途中で私がtrytingています

grupo->vertices.push_back(x); 

ただし、プログラムをクラッシュさせてしまいます。私は、ビジュアルスタジオを使用して、デバッグモードを使用しています。私はそれがクラッシュするベクトルにXを押していることがわかります(xは値を持っています)。私は浮動小数点数の配列にベクトルを変更しようとしました。だから私が想像できる問題は、ベクトルの初期化である...私は何が欠けているのを助けることができますか?

ありがとうございます。

+0

この質問は[c]についてのものではありませんので、タグ付けしないでください。 –

+0

@AnttiHaapalaあなたは正しいです、それについては残念です。 –

+0

あなたの変数が構造体と同じ名前を持っているのは非常に混乱しています。 –

答えて

4

C++を使用しているので、あなたが動的にgrupoを作成したい場合は、コンストラクタで、new演算子を使用する必要があります。

grupo = new grupo(); 

mallocは適切なstd::vectorとしてC++オブジェクトを初期化しません。


P.S.私はgrupo->modelosgrupo->gruposであるはずのものは確かではありませんが、私はそれらのために適切なC++タイプを使用したいと考えています(modelosstd::stringなど)。さらに、私はあなたがを持っていると思っています。とgruposの両方に対して1つ多くて*があります。

+0

これはうまくいきます:Dこれは、私の構造体のデフォルト値0のすべての浮動小数点数と整数を0にしますか?または私はそれを作るために構造体に強制する必要がありますか? –

+1

あなたはコンストラクタについて読むべきで、ポインタが必要ないときはポインタを使わないでください。いいえ、指定しない限り、ポッド(int、chars ..)のデフォルト値はありません。 – Nikko

5

あなたはC++を使用していますが、特別な理由がない限り、 "new"キーワードまたはmallocキーワードは必要ありません。構造体のtypedefは必要ありません。

私はあなたのchar **になるはずですが、文字列にstd :: stringを使用できます。メインで

struct Grupo 
{ 
    float transX, transY, transZ, rotX, rotY, rotZ, rotAngle, scaleX, scaleY, scaleZ; 
    std::string modelos; 
    int nNomes = 0, nGrupos=0; 
    std::vector<float> vertices; 
}; 

は、たぶん、あなたが何をしようとしてこれですその後、私は正確にC++言語であるかについて、もう少しを読むためにあなたを助言する

Grupo grupo; 
grupo.vertices.push_back(...); 

とどのようにしていないのですか?

+0

char **? - 私はめったにそれを使用しない。 1つの例外を除いて。 "int main(int argv、char * argv []);"は、 "int main(int argv、char ** argv);"と書くことができます。 –

1

C++では、宣言でtypedefは必要ありません。

構造体を適切に初期化するには、コンパイラが提供するctor(通常は何もしません)を置き換えるctorを記述する必要があります。

(ほんの数属性で)以下のような何か:

struct grupo 
{ 
    float transX, transY; 
    // ... 
    int nNomes; 
    int nGrupos; 
    std::vector<float> vertices; 

    // I prefer initialization list form 
    grupo() : transX(0.0), 
      transY(1.0), 
      // ... 
      nNomes(0), 
      nGrupos(0) 
      // vertices default ctor is ok, creates empty vector 
     { 
     // use vertices.push_back(...); to fill vertices 
     } 

}; 

grupo grupo; 

次のあなたが(代わりにリテラル定数の)より有用ctorの、使用するパラメータを持つものを書きたいだろう、そのようなあなたのこと複数のグルーポを構築する可能性があります。

grupo grupo1(1.0, 2.0, 3, 4); 
grupo grupo2(3.0, 4.0, 5, 6); 
// etc. 
関連する問題