0

単一の要素を void 構造に初期化すると、正常に動作します。

void* CMD_ARRAY[] = 
{
  {"+++\r"},
  {"+++\r"},
  {"+++\r"},
};

ただし、構造にさらに要素を追加しようとすると、次のようになります。

void* CMD_ARRAY[] = 
{
  {"+++\r" ,  4,  1300},
  {"+++\r" ,  4,  1300},
  {"+++\r" ,  4,  1300},
};

これにより、エラーが発生します。

「}」が必要です

最初の例のような単一の要素と、構造体 (要素とも見なされる) の構造体の違いは何ですか?

この void 構造を混合型で初期化するにはどうすればよいですか?

更新:だから、コンパイラは同じ要素で異なる型を処理する方法を知らないことを理解しています。この定義の外で構造を実際に定義せずに (つまり、構造体の配列を使用して)、これらの型をオンザフライで (つまり、キャストを使用して) 定義する方法はありますか?

4

3 に答える 3

0

構造体の配列ではなく、ポインタの配列があります。リテラル文字列イニシャライザーは、voidポインターに割り当てることができる単一のポインターであり、構造化イニシャライザーを使用するには、一致する構造体に割り当てる必要があります。そうしないと、コンパイラーはデータをメモリに配置する方法をどのように知るのでしょうか。

于 2013-01-27T09:12:52.257 に答える
0

初期化子として中括弧を使用すると、構造化された情報の初期化が暗示されます。void ポインター配列を初期化しています。そのため、コンパイラは、この配列に格納できる一連のポインターを想定しています。2 番目のバリアントはポインタではなく、長さは約 12 バイトです。単一の void-pointer 配列セルでは、これを行うのに十分なスペースがありません。

さらに、このコードを見ていると、地平線に何か悪いことが起きているような気がします。正確に何をしようとしていますか?

于 2013-01-27T09:11:17.937 に答える