2016-07-12 5 views
1

「C」で、私が持っている:定数値の複数の構造の定数配列を正しく定義する方法は?

typedef struct 
{ 
    int aaa; 
    int bbb; 
} My_Struct; 

をそして私が初期化された値とMy_Structの複数のコピーが含まれている回帰テストのためだけでなく、ラベル(AAA & BBB)と一定のスクリプトを作りたいです読みやすさと便利さ。

私は構文を把握、またはこれはC.

でも、可能であれば私はそれがこれです取得することができ、最も近いことはできません。

struct 
{ 

    struct { 
    int aaa = 111; 
    int bbb = 222; 
    } first_script; 

    struct { 
    int aaa = 333; 
    int bbb = 444; 
    } second_script; 

} const my_script_array; 

しかし、どのように、私はあることを my_script_arrayを定義しますタイプ My_Structの配列なので、コードに (My_Struct)my_script_arrayのようにキャストする必要はありません。

(コンパイラ注:私は、Visual-C++を使用して、このソフトウェアを編集するんだけど、それはiOS用のXcode 7.3で実行され、最終的にはそれはARM組込みプロセッサ上でコンパイルする必要があります)

次の試み:

次のコードはVisual C++ではエラーはなく、Xcodeエラー "expected;"を取得します。最初の '='の前に、また次のダースの行の前に。

// Script of multiple reference summaries 

struct 
{ 
    struct 
    { 
    // WORDS: 
    int total_words = 1; 
    float all_absolute_impulse_gseconds = 2; // gravity X seconds 
    float all_average_absolute_impulse_gseconds = 3; 
    float all_positive_impulse_gseconds = 4; 
    float all_negative_impulse_gseconds = 5; 

    float x_absolute_impulse_gseconds = 6; 
    float x_average_absolute_impulse_gseconds = 7; 
    float x_positive_impulse_gseconds = 8; 
    float x_positive_average_impulse_gseconds = 9; 

    float y_absolute_impulse_gseconds = 10; 
    float y_average_absolute_impulse_gseconds = 11; 

    float z_absolute_impulse_gseconds = 12; 
    float z_average_absolute_impulse_gseconds = 13; 

    float minimum_word_duration_seconds = 14; 
    float average_word_duration_seconds = 15; 
    float maximum_word_duration_seconds = 16; 

    // EVENTS: 
    int total_events = 17; 
    int x_negative_transitions = 18; 
    int x_zero_transitions = 19; 
    int x_positive_transitions = 20; 
    int y_negative_transitions = 21; 
    int y_zero_transitions = 22; 
    int y_positive_transitions = 23; 
    int z_negative_transitions = 24; 
    int z_zero_transitions = 25; 
    int z_positive_transitions = 26; 

    int total_comparison_attributes = 27; // set by update_summary_attributes() 
    int final_script_record = 0; 
    } first; 

    struct 
    { 
    // WORDS: 
    int total_words = 28; 
    float all_absolute_impulse_gseconds = 29; // gravity X seconds 
    float all_average_absolute_impulse_gseconds = 30; 
    float all_positive_impulse_gseconds = 31; 
    float all_negative_impulse_gseconds = 32; 

    float x_absolute_impulse_gseconds = 33; 
    float x_average_absolute_impulse_gseconds = 34; 
    float x_positive_impulse_gseconds = 35; 
    float x_positive_average_impulse_gseconds = 36; 

    float y_absolute_impulse_gseconds = 37; 
    float y_average_absolute_impulse_gseconds = 38; 

    float z_absolute_impulse_gseconds = 39; 
    float z_average_absolute_impulse_gseconds = 40; 

    float minimum_word_duration_seconds = 41; 
    float average_word_duration_seconds = 42; 
    float maximum_word_duration_seconds = 43; 

    // EVENTS: 
    int total_events = 44; 
    int x_negative_transitions = 45; 
    int x_zero_transitions = 46; 
    int x_positive_transitions = 47; 
    int y_negative_transitions = 48; 
    int y_zero_transitions = 49; 
    int y_positive_transitions = 50; 
    int z_negative_transitions = 51; 
    int z_zero_transitions = 52; 
    int z_positive_transitions = 53; 

    int total_comparison_attributes = 54; // set by update_summary_attributes() 
    int final_script_record = 0; 
    } two; 

    int final_script_record = true; 

} const REFERENCE_SUMMARY_SCRIPT 
+0

あなたが使用しているC++のバージョンは、何年も前から初期化リストが強化されているためです。 – infixed

+1

CとC++の両方にタグを付けました。これらは異なる言語であり、あなたが求めているものを指定する必要があります。文章ではCと書かれているので、それはあなたが意味するものかもしれませんが、私はそれを確信できません。明確にするためにあなたのタグを編集してください。 –

+0

CとC++は異なる言語です! –

答えて

5
typedef struct 
{ 
    int aaa; 
    int bbb; 
} My_Struct; 

const My_Struct my_script_array[] = { 
    {111, 222}, 
    {333, 444} 
    // and so on ... 
}; 
+0

しかし、私はデータシンボルが必要です。私の実際の構造には30以上の変数があり、スクリプトの値を変更したいときには、シンボルをより簡単にしたいと思っています。 –

+0

@DougNullフィールド名は、コンパイル時に初期化するときに指定することはできません。名前にアクセスする場合は、配列を非constとして宣言し、次にランタイム割り当てを使用して必要に応じて個々のフィールドを割り当てます。 –

6

あなたは配列をしたい場合は、あなたが言うように見えるように、あなたは配列を宣言する必要があります。代わりに、そのメンバーに興味があります構造体の型であるstructを定義しようとしているように見えるCでは、あなたはそうのようなあなたの配列を定義することもできます。

/* elements are unmodifiable: */    const 
/* base type: */        My_Struct 
/* variable name and (implicit) dimension: */ my_script_array[] 
/* initializer: */        = { 
    /* one element: */        { .aaa = 111, .bbb = 222 }, 
    /* another: */         { .aaa = 333, .bbb = 444 } 
               }; 

注構造体のメンバの指定初期化子の使用をあなたが望む通りにメンバー名を提示します。

+0

これは解決策ですが、私のVisual C++では、ドットが "エラー:予想される式"を引き起こします。 –

+2

@DougNull、あなたはCについて尋ねました。Cモードで動作するMSVC++は、適合するCコンパイラではありません.17歳のC99ではありません。たとえ26歳のC90であっても、そんなに近くにはありますが、それは問題です。特に指定されたイニシャライザはC99で導入され、MSはそれらをサポートしていません。 C++とは対照的にC(ish)コードを記述する必要があり、MSVC++に悩まされている場合、ソースにコメントを追加する以外に、Remyのバリエーションが最善の方法です。 –

+1

@DougNull:値をソースファイルに保持し、このコンバーターをVCプロジェクトのビルド前イベントとして実行する便利な形式を変換するツールを作成します。 – alk

0

私が使用した最も速い解決策は、.h構造体定義から実装の宣言にコピーして貼り付け、シンボルをコメントアウトすることでした。読みやすく、実装も簡単です。私は組み込みソフトウェアの機能テストをスクリプトで行うので、私はこれを多くしています。スクリプトテストは、スクリプトが実験室で再現できない状況をテストできるため、非常に厳密な機能テストを可能にします。

関連する問題