3

if の配列を作成するとき、および GCC を使用しているときに、構造体のメンバーを 1 つだけ初期化するにはどうすればよいですか?たとえば、次のようになります。

#define UNUSED OxFF
typedef struct inputs{
    uint8_t state;
    uint8_t limit;
    uint8_t value;
} INPUT_TYPE;

//create array but just care that all members .state are UNUSED
INPUT_TYPE Node1[5] ={ Node1.state = UNUSED }

初期化は、構造体のメンバーではなく、配列を参照します。もちろん、ループを使用することもできますが、「input_init」関数を使用して実行時に初期化したくありません。

4

4 に答える 4

4

特定のメンバーを初期化するための構文は、C99の機能です。あなたは近くにいます、これを試してください:

#define UNUSED OxFF
typedef struct inputs{
    uint8_t state;
    uint8_t limit;
    uint8_t value;
} INPUT_TYPE;

INPUT_TYPE Node1[5] = {
    {.state = UNUSED},
    {.state = UNUSED},
    {.state = UNUSED},
    {.state = UNUSED},
    {.state = UNUSED}
};

参照:Cプログラミング言語標準に従って構造体を初期化する方法

編集:

よくわからなかったので、答えを編集しました。

配列の初期化はどのように機能するか、ここで回答されました:配列のすべてのメンバーを同じ値に初期化する方法は?

于 2013-02-03T09:04:51.417 に答える
4

ついにhttp://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Designated-Inits.html#Designated-Initsで見つけました。これ は 2 つのケースの組み合わせです。

INPUT_TYPE Node1[5] = { [0 ... 4].state = UNUSED }これは、大きな配列で役立ちます。

于 2013-02-05T06:32:19.640 に答える
2

はゼロ以外の値であるためUNUSED、必要な場合は、配列の各要素に対して初期化子を指定する必要があります。

INPUT_TYPE Node1[5] = { 
    {.state = UNUSED}, 
    {.state = UNUSED}, 
    {.state = UNUSED}, 
    {.state = UNUSED}, 
    {.state = UNUSED}
};
于 2013-02-03T09:19:40.773 に答える
0

init にコンストラクターを使用しない理由:

#define UNUSED OxFF
typedef struct inputs{
    uint8_t state;
    uint8_t limit;
    uint8_t value;

   inputs(){state = UNUSED, limit, value;};

} INPUT_TYPE;

?

于 2013-02-03T09:13:55.417 に答える