0

私はCにかなり慣れていないので、最初にセットサイズの構造体の配列を初期化し、宣言後に実際の構造体を配列に入力できるかどうか疑問に思っていました。以下のコードのスニペットは、やりたいことを示しています。かなり簡単なはずです。

/* Make rectangle 2D object */
struct two_d_obj rect = {0, 4, {0, 0, 1}, {0, 0}, {0, -20.0}, {{0, 0}, {0.1, 0.1}, {0, 0.1}, {0.1, 0}}};
struct two_d_obj obj_array[25];
obj_array[0] = rect;

ただし、このコードをコンパイルしようとすると、次のエラーが発生します。

hellomousept2.c:39: error: conflicting types for ‘obj_array’
hellomousept2.c:33: error: previous definition of ‘obj_array’ was here
hellomousept2.c:39: error: invalid initializer

繰り返しますが、私は C の初心者であり、主に Java のコードを使用しているため、正しい軌道に乗せるための助けをいただければ幸いです。事前に感謝します。

編集: 以下は私の two_d_obj 構造体のコードです

struct two_d_obj
{
    int iType; /*integer signifying shape of object (0 for rect, 1 for circle) */
    int num_vertices; /* number of vertices contained in the shape */
    double color[3]; /*array containing RGB values signifying color of object */
    double center_pos[2]; /*center position of object */
    double velocity[2]; /*velocity of object */
    double vertex_array[50][2]; /*array of vertice coordinates (read in pairs
                             x coordinate followed by y coordinate)
                             protocol: first pair of coordinates is bottom left
                             vertice, pairs that follow are vertices going
                             counter-clockwise       
                             */
};
4

4 に答える 4

0

C99 (またはそれ以降) の「複合リテラル」を使用すると、次のように記述できます。

struct two_d_obj obj_array[25];
obj_array[0] = (struct two_d_obj){ 0, 4, {0, 0, 1}, {0, 0}, {0, -20.0},
                                   { {0, 0}, {0.1, 0.1}, {0, 0.1}, {0.1, 0} } };

構文的には、複合リテラルは、型を指定するキャストと、キャストで指定された型に適した初期値を持つ波括弧で囲まれた初期化子で構成されます。同じタイプの値が必要な場合はいつでも使用できます。

ただし、差し迫った問題は、質問のコードの直前 (または直後) に も定義obj_arrayしており、同じスコープで同じ名前を 2 回定義できないことです。

コンパイラ メッセージの 3 行目は不可解です。通常、特定の行での最初のエラーは正確であることがわかります。同じ行 (またはエラーのある最初の行の直後の行) からの 2 番目以降のエラー メッセージは、多くの場合、コンパイラが最初の問題のために混乱し、結果として残りの行を誤って解釈したことを示しているだけです。「無効な初期化子」の警告がそのカテゴリに当てはまると思われます。コードに 33 行目と 39 行目の両方が表示されていないため、確認できません。

于 2013-09-02T21:58:38.550 に答える