1

typedefを次のように宣言すると、次のようになります。

typedef struct
{
  uint8 LastState;
  uint8 CurrentState;
  uint8 NextState;
  uint8 TaskEnabled;
  uint8 Counter;
  uint8 Status;
}SM_tstTaskStateStructure; 

次の方法で作成しようとしている配列のコンテンツを定義しようとしています。

#define xInitDataTable  \
{IDLE,IDLE,IDLE,YES,TIMED7SEG,IDLE},   \
{IDLE,IDLE,IDLE,YES,TIMELED1,IDLE},   \
{IDLE,IDLE,IDLE,YES,TIMELED2,IDLE},   \
{IDLE,IDLE,IDLE,YES,TIMELED3,IDLE},   \
{IDLE,IDLE,IDLE,YES,TIMEBTN,IDLE},   \
{IDLE,IDLE,IDLE,YES,BASETIME,IDLE},   \
{IDLE,IDLE,IDLE,YES,FREQUPDATE,IDLE}

次に、構造体の配列として初期化します。

static const SM_tstTaskStateStructure   SM__astData[TASKMAX]=
{
    xInitDataTable  
};

このコンパイラは固有ですか?富士通mc用のSoftuneコンパイラを使用すると、この方法で構造体の配列を初期化できますが、CodeComposerStudioでは初期化できません。もしそうなら、これを行うための同様の方法はありますか(可能であれば定義を使用して)?

**これらは数値のみであり、ポインタなどはありません。

編集:気にしないでください、前または後の増分を使用しようとすると、すべてのメンバーで発生します

4

1 に答える 1

2

TASKMAX7より大きい限り、この初期化は完全に標準です。

C11(n1570)、§6.7.9初期化

initializer:
    assignment-expression
    { initializer-list }
    { initializer-list , }

値をインクリメントしたときにエラーが出力される場合は、修飾子SM__astDataで宣言されているためです。const

C11(n1570)、§6.5.3.1プレフィックスのインクリメントおよびデクリメント演算子

プレフィックスインクリメントまたはデクリメント演算子のオペランドは、アトミック、修飾、または非修飾の実数型またはポインター型であり、変更可能な左辺値である必要があります。

このような操作を行う場合は、次の宣言を使用してください。

static /* const */ SM_tstTaskStateStructure   SM__astData[TASKMAX]=
{
    xInitDataTable  
};
于 2013-03-16T16:07:35.810 に答える