2013-02-09 1 views
1

J'ai lu le 6.3e paragraphe de la deuxième édition "C programming language", par Kernigan & Ritchie.Pointeur NULL comme marqueur de fin de tableau

Certains structure:

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

Auteurs écrit à ce sujet:

La quantité nkeys est le nombre de mots-clés dans keytab. Bien que nous pouvez compter cela à la main, il est beaucoup plus facile et plus sûr de le faire par machine, surtout si la liste est sujette à changement. Une possibilité serait de terminer la liste des initialiseurs avec un pointeur nul, puis boucle le long de keytab jusqu'à ce que la fin soit trouvée.

Tout serait clair si ENUM contenait des pointeurs seulement:

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

Mais chaque enregistrement a pointeur non seulement, mais aussi et int. Si je comprends bien les auteurs, alors un dernier enregistrement doit être comme suit:

{ NULL, ? } 

Qu'en est-il des pointeurs?

Comment puis-je le résoudre pour les énumérations qui ne contiennent pas les pointeurs? Par exemple:

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

Merci.

Répondre

1

En définissant le dernier enregistrement sur NULL, vous pouvez identifier de manière triviale la fin du tableau lors de l'itération. Dans les cas où vous n'avez pas de pointeurs, vous pouvez toujours considérer une valeur "spéciale" pour indiquer la fin, peut-être count et index ne peut jamais être négatif dans votre application, donc voir une valeur inférieure à 0 serait un marqueur possible que vous pouvez utiliser pour trouver la fin de manière fiable. Un autre choix commun pour les marqueurs de fin peut être ~0 (c'est-à-dire tous les 1s). Vous pouvez également passer un size_t avec.

+0

Oui, je le comprends. –

1

Vous pouvez inventer une valeur enum spéciale (par exemple, -1) que vous utiliserez comme marqueur pour la dernière entrée.