0

C (または C++) で許可されていないのはなぜですか?

私はこれを意味します:

ucell GetPlayerPosPositionData[5];
GetPlayerPosPositionData = {4*sizeof(cell),playerid,0,sizeof(cell),2*sizeof(cell)};//this does not work, error

//normal assignment
GetPlayerPosPositionData[1] = playerid;
GetPlayerPosPositionData[2] = 0;
GetPlayerPosPositionData[3] = sizeof(cell);
GetPlayerPosPositionData[4] = 2*sizeof(cell);
4

4 に答える 4

2

配列は代入できないためです。宣言の時点でそれらを初期化することも、要素ごとに割り当てることもできますが、それだけです。これはうまくいきます:

ucell GetPlayerPosPositionData[] = {4*sizeof(cell),
                                    playerid,
                                    0,
                                    sizeof(cell),
                                    2*sizeof(cell)};
于 2012-12-08T20:48:40.303 に答える
1

構文が許可されていないと言っているからですか?問題には 2 つの部分があります。

  1. 初期化子または (C99 の) 複合リテラル以外では、初期化子構文を使用できません。

  2. 配列全体を割り当てることはできません。

C99 では、配列を関数に渡すことができました。

typedef unsigned int cell;

extern void some_func(cell data[]);

extern void func(void);

void func(void)
{
    cell playerid = 0;
    some_func((cell[]){4*sizeof(cell),playerid,0,sizeof(cell),2*sizeof(cell)});
}

(あなたの質問はcellvsで不明確ucellです。私は全体を通して使用することにcellしました。)

配列の代入はまだできません。配列が構造体にラップされている場合、偶然にも、含まれている配列を割り当てる構造体の割り当てを行うことができます。しかし、これは構造体の割り当てであり、配列の割り当てではありません。

于 2012-12-08T20:52:40.127 に答える
0

これについては言語弁護士に議論してもらいます。arrayが として宣言されていて、int array[4]それに割り当てたいとします。次に、次のことを検討してください。

* (struct t { int array[4]; } *) array = (struct t) {{ 0, 1, 2, 3 }};
于 2012-12-09T00:11:53.567 に答える
0

その構文は、配列をリスト初期化するためのものです。配列宣言の初期化子としてのみ使用できます。

ucell GetPlayerPosPositionData[5] = {4*sizeof(cell),playerid,0,sizeof(cell),2*sizeof(cell)};

別の方法は、各要素に個別に割り当てることです。

ucell GetPlayerPosPositionData[5];
GetPlayerPosPositionData[0] = 4 * sizeof(cell);
GetPlayerPosPositionData[1] = playerid;
GetPlayerPosPositionData[2] = 0;
GetPlayerPosPositionData[3] = sizeof(cell);
GetPlayerPosPositionData[4] = 2 * sizeof(cell);
于 2012-12-08T20:48:43.617 に答える