2

C スタイルの構造体を C++ ヘッダーに追加し、それを C 関数で使用したいと考えています。しかし、これは機能していません:

struct Vertex {
float Position[2];
float Color[4];
};

struct Square{
Vertex vertices[4];
};

他の場所:

float color[4]={rColor, gColor, bColor, alpha};
float halfsize=(float)size/2;

Square square= {
    {{halfsize,halfsize},{color[0],color[1],color[2],color[3]}},
    {{halfsize,-halfsize},{color[0],color[1],color[2],color[3]}}, //error on this line
    {{-halfsize,-halfsize},{color[0],color[1],color[2],color[3]}},
    {{-halfsize,halfsize},{color[0],color[1],color[2],color[3]}}
};

2 行目に「構造体初期化子に過剰な要素があります」と報告します。

color関連して、配列をsquareセットに渡すより効率的な方法はありますか?

4

2 に答える 2

6

の初期化子に追加の中括弧を追加する必要がありますVertex vertices[4];

                \/   
Square square= {{
    {{halfsize,halfsize},{color[0],color[1],color[2],color[3]}},
    {{halfsize,-halfsize},{color[0],color[1],color[2],color[3]}}, //error on this line
    {{-halfsize,-halfsize},{color[0],color[1],color[2],color[3]}},
    {{-halfsize,halfsize},{color[0],color[1],color[2],color[3]}}
}};
^
于 2013-01-10T09:35:27.417 に答える
2

他の回答者が述べたように、ブレースを追加する必要があります。そうすればうまくいきます。

ただし、これがを渡すためのより効率的な方法であるかどうかも尋ねますcolor

ないのではないかと思います。CもC++も配列の長さを追跡せず、配列をスプライシングするための構造がないため、配列の特定のセクションをコピーすることをコンパイラーに示すことはできません。

しかし、あなたは本当に効率的とはどういう意味ですか?「もっと速く実行できる方法はありますか?」という意味です。そうすれば、答えはほぼ間違いなくノーです。この初期化は非常に高速です。

「より少ないコード行で記述できる方法はありますか?」その後、答えはおそらくノーです。6本の線はかなりきついです。

確かに、C ++ヘッダーを使用しているので、C ++コンパイラも使用している必要があると思います。そのため、コードのこの部分を純粋なCでビルドするのは無意味に思えますcolor。STLベクトルに作成してから、Squareそして、Vertexこれはこのベクトルから初期化されます。それは大幅に多くのコードを必要とせず、偶発的なミスの可能性を減らすかもしれません。

あるいは、Cに設定されていて、このコードを何度も起動することを計画している場合は、マクロの使用を検討できます(以下のように、または血まみれのこと全体に対して)。関数に含める):

#define RGB_INIT {color[0],color[1],color[2],color[3]}

マクロには危険がありますが。

于 2013-01-10T10:08:05.430 に答える