1

Kernigan & Ritchie 著「C プログラミング言語」第 2 版の 6.3 段落を読みました。

いくつかの構造:

struct key {
    char *word;
    int count;
} keytab[NKEYS] {
    { "auto", 0 },
    { "break", 0 },
    { "case", 0 },
    { "char", 0 },
    { "const", 0 },
    { "continue", 0 }
  };

著者はそれについて次のように書いています。

数量 NKEYS は、keytab 内のキーワードの数です。これは手で数えることもできますが、リストが変更される可能性がある場合は特に、機械で数えた方がはるかに簡単で安全です。可能性の 1 つは、イニシャライザのリストを null ポインタで終了し、最後が見つかるまで keytab に沿ってループすることです。

enum にポインターのみが含まれている場合、すべてが明確になります。

struct key {
    char *word;
    char *description;
} keytab[NKEYS] {
    { "auto", "" },
    { "break", "" },
    { "case", "" },
    { "char", "" },
    { "const", "" },
    { "continue", "" }
    { NULL, NULL}
  };

しかし、各レコードにはポインターだけではなく、ポインターもありintます。私が著者を正しく理解していれば、最後のレコードは次のようになります。

{ NULL, ? }

ポインタではないのはどうですか?

ポインターが含まれていない列挙型の場合、どうすれば解決できますか? 例えば:

    enum myEnum {
        int index;
        inr count;
        double value;
    } myVariable[] {
          {0,0,0},
          {0,0,0},
          {0,0,0},
          {0,0,0},
          {?,?,?}
      };

ありがとうございました。

4

2 に答える 2

1

ポイントは、最後のレコードを NULL に設定することで、配列を繰り返し処理するときに配列の末尾を自明に識別できることです。

ポインターがない場合でも、終了を示す何らかの「特別な」値と見なすことができます。おそらくcountindexアプリケーションで負になることはありません。したがって、0 未満の値を確認することは、使用できるマーカーになる可能性があります。確実に終わりを見つけるために。エンド マーカーのもう 1 つの一般的な選択肢は~0(つまり、すべて 1) です。

size_tまたは、それを使って回ることもできます。

于 2013-02-09T09:59:07.843 に答える
1

-1最後のエントリのマーカーとして使用する特別な列挙値 (たとえば、 ) を作成できます。

于 2013-02-09T09:59:25.660 に答える