1

だから、私はこの関数を持っています、そして私は私が理解できないいくつかの本当に奇妙なエラーを受け取っています。

void serialize_helper(huff *h, bits *history, char** a)
{
  switch (h->tag) {
  case LEAF:
    char letter = h->h.leaf.c;
    int arraynum = (int)letter;
    a[arraynum] = bits_show(history);
    putchar('\n');
    return;
  case NODE:
    /* traverse left subtree */
    bits_putlast('0',history);
    serialize_helper(h->h.node.lsub,history, a);
    bits_remove_last(history);
    /* traverse right subtree */
    bits_putlast('1',history);
    serialize_helper(h->h.node.rsub,history, a);
    bits_remove_last(history);
    return;
  default:
    fprintf(stderr,"main.serialize_helper: bad tag\n");
    exit(1);
  }
}

単純な変数定義でこのエラーが発生します(char文字= ...;から):

"huffenc.c:18:エラー:'char'の前に式が必要です"

さらに、コンパイラは「letter」の宣言が存在しないように動作しています:「huffenc.c:19:error:'letter' undeclared(この関数での最初の使用)」

4

1 に答える 1

2

switch直後に変数を定義する場合caseは、ブロックが必要です。

  case LEAF: {
    char letter = h->h.leaf.c;
    int arraynum = (int)letter;
    a[arraynum] = bits_show(history);
    putchar('\n');
    return;
  }

編集:理由は、ラベルの後にはステートメントのみが続くことができ、宣言または初期化はステートメントではなく、ブロック(つまり複合ステートメント)はステートメントであるということです。

于 2013-03-13T21:22:44.437 に答える