0
votes

Est une excellente arrache 2D initialisée pour cartographier les entiers consécutifs vers des cordes en C?

Je dois cartographier des codes entier consécutifs de 1 à 100 à cordes dans C. Normalement, pour une cartographie du numéro à la chaîne, j'aurais quelque chose comme ceci:

const char *arr[100] = { "abc", "def", ....... "100th msg"};


5 commentaires

C'est une approche parfaite.


N'oubliez pas que les index de tableau commencent à 0. Vous devez donc utiliser arr [code-1] si code passe de 1 .


Les codes commencent à 1 et j'ai initialisé mon arr [0] comme "". Donc, il s'en occuper.


Mais vous avez déclaré qu'il arr [100] , donc le dernier index est 99 .


Vous pouvez le déclarer const char * arr [] = {...} , il calculera automatiquement la taille du nombre d'initialisateurs.


3 Réponses :


1
votes

Supposons que la matrice a des messages d'erreur. Ensuite, une approche commune consiste à définir des constantes pour chaque erreur et à imprimer le message associé à celui-ci, par exemple: xxx

et définir le tableau comme suit: xxx

et avoir une fonction pour imprimer le message, par exemple: xxx

qui peut être appelé comme xxx

Pour la modularité, le #define s peut être par exemple errors.h , avec le prototype de printmsg et que le tableau peut être dans errors.c .


0 commentaires

1
votes

Le seul problème avec votre approche est que les codes ne peuvent jamais changer. Vous ne pouvez pas ajouter de codes intermédiaires sans changer le code entier. Mais cela devrait fonctionner. De plus, le premier code doit être zéro ou vous devrez soit tamponner le tableau ou déplacer les codes lors de l'accès.

Essentiellement ce que vous avez est une table de hachage immuable. P>

#define BASE_CODE 5
#define CODE_BLUE 5
#define CODE_GREEN 6

const char *responses[] = {'blue', 'green'};
printf("%s\n", responses[code - BASE_CODE]);


1 commentaires

Je pourrais ajouter 1 ou 2 codes à l'avenir, mais cela ne fera que manipuler cette partie du code. Donc, je pourrais juste vous tenir à la matrice initialisée.



2
votes

L'utilisation d'une matrice indexée directe est une approche couramment utilisée qui fonctionne bien si les données ne changent jamais (rarement), et il n'y a pas trop de lacunes, car vous dépensez un enregistrement pour chaque écart. À un moment donné, la direction ou le coût de stockage des lacunes peuvent devenir un problème.

Si vous avez besoin de faire face à des mises à jour plus dynamiques de compilation sur les données, la meilleure chose suivante est une matrice triée. Si vous pouvez vous garantir que vos entrées sont toujours en ordre, mais il y a peut-être des lacunes, ou de nouvelles entrées ont été ajoutées à la fin, vous pouvez Binary hacher votre tableau commandé pour trouver rapidement l'entrée souhaitée. Vous voudrez peut-être effectuer une passe de démarrage qui vérifie que le tableau est correctement commandé, mais il suffit de le faire une fois.

Si vous avez besoin de vous inquiéter des mises à jour d'exécution, vous devez sérieusement envisager des abstractions de conteneur de niveau supérieur telles que la cartographie des arbres ou des hachements.


1 commentaires

Il n'y aura pas de lacunes dans les codes et ils sont prédéfinis et ne seront pas dynamiques. Je devrais peut-être ajouter quelques codes plus tard, mais je pense que je peux gérer les changements.