5

私はこれを読みました( unsigned char 配列を初期化する方法は? )が、私の質問には完全には答えていません。

次のような文字列の配列を作成できることはわかっています。

const char *str[] =
{
  "first",
  "second",
  "third",
  "fourth"
};

write() したい場合は、これらを使用できます: write(fd, str[3], sizeof(str[3]));

しかし、可変長の unsigned char の配列が必要な場合はどうすればよいでしょうか? 私はこれを試しました:

const unsigned char *cmd[] =
{
  {0xfe, 0x58},
  {0xfe, 0x51},
  {0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23},
  {0xfe, 0x3d, 0x02, 0x0f}
};

そして、次のようなgccコンパイル警告が表示されます *「スカラー初期化子を囲む中括弧」

4

3 に答える 3

6

これは一つの方法です

const unsigned char cmd1[] = {0xfe, 0x58};
const unsigned char cmd2[] = {0xfe, 0x51};
const unsigned char cmd3[] = {0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23};
const unsigned char cmd4[] = {0xfe, 0x3d, 0x02, 0x0f};

const unsigned char *cmd[] =
{
  cmd1,
  cmd2,
  cmd3,
  cmd4
};
于 2013-03-25T15:46:15.527 に答える
1

これは私にとってはうまくいきました(clangとgccでコンパイルします):

const unsigned char *cmd[] =
{
    (unsigned char[]){0xfe, 0x58},
    (unsigned char[]){0xfe, 0x51},
    (unsigned char[]){0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23},
    (unsigned char[]){0xfe, 0x3d, 0x02, 0x0f}
};
于 2013-03-25T16:30:47.277 に答える
0

多次元配列を使用する場合、コンパイラが適切なアドレス演算を計算できるように、最後の次元のサイズを指定する必要があります。cmd ポインター配列には 2 つの次元があります。2 番目の次元の最大長は 6 要素なので、次のようになります。

const unsigned char cmd[][6] =
{
      {0xfe, 0x58},
      {0xfe, 0x51},
      {0xfe, 0x7c, 0x01, 0x02, 0x00, 0x23},
      {0xfe, 0x3d, 0x02, 0x0f}
};

ANSI C 標準から: 「不明なサイズの配列が初期化される場合、そのサイズは、明示的な初期化子を持つ最大のインデックス付き要素によって決定されます。その初期化子リストの最後で、配列はもはや不完全な型を持ちません。」

ANSI C ドラフト規格 C11

于 2013-03-25T15:48:49.090 に答える