2013-08-27 4 views
2

Actuellement, j'ai le code de travail qui se lit comme ceci:entrée dynamique du tableau 2D avec des tableaux 1d prédéfinis

char input[4][10] = {ARR1, ARR2, ARR3, ARR4}; 

Il est clair que je crée un tableau 2D avec ces tableaux 1d, qui sont constantes définies ailleurs . Cependant, j'ai besoin de changer ce code afin qu'il lise les noms des tableaux 1d désirés d'un fichier et initialise le tableau 2d en conséquence.

Par exemple, si le fichier contenait:

Arr9 ARR3 Arr5 Arr7

Ensuite, l'initialisation courrait comme (assumer tous ces tableaux sont tous définis):

char input[4][10] = {ARR9, ARR3, ARR5, ARR7}; 

Je n'ai aucun problème à lire le fichier mais j'ai des difficultés avec la création du tableau 2d et l'utilisation d'une valeur lue dans le fichier comme nom d'un tableau.

+0

Si vous connaissez la taille du tableau 2D, vous pouvez placer un tableau 2D dans un tableau, puis le remplir avec les valeurs des tableaux 1D – jambono

Répondre

2

C n'a pas introspection ou reflection, donc ce n'est pas vraiment possible de cette façon.

Vous pouvez cependant avoir une table de traduction, qui se traduit par des cordes "ARR1", "ARR2" etc., aux tableaux réels, et ensuite vous pouvez copier le contenu du tableau réel à l'entrée input. Ou au lieu d'avoir un tableau de tableau comme vous avez maintenant, vous pouvez avoir un tableau de pointeurs et juste définir les pointeurs pour pointer vers le tableau correct.

+0

Le hiccup possible avec cette méthode est que je ne connais pas les noms de tous les tableaux potentiellement être transmis via le fichier. Est-il possible d'avoir une table de traduction qui associe une chaîne au tableau du même nom (supposer qu'un utilisateur a écrit un nom de tableau valide), plutôt que d'avoir simplement un mappage entre les chaînes et les noms de tableaux prédéterminés? –

+0

@ C.Williamson Il n'y a aucun moyen d'obtenir des noms d'identifiants pendant l'exécution, les identifiants sont seulement un concept source et n'ont pas de concept d'exécution correspondant. –

+2

@ C.Williamson Il y a une autre solution, et c'est que les tableaux eux-mêmes sont stockés dans des fichiers que vous avez lus pendant l'exécution de votre programme. Ensuite, vous pouvez les stocker dans un format de fichier qui ont leurs noms et leurs valeurs. –

0

Disons que les "constantes définies ailleurs" regarder actuellement comme ça

const char *ARR1 = "Alpha"; 
const char *ARR2 = "Bravo"; 
const char *ARR3 = "Charlie"; 

Solution 1

const char *ARR_Value[] = "Alpha", "Bravo", "Charlie", 0; 
const char *ARR_Name[] = "ARR1", "ARR2", "ARR3", 0; 
// Pseudo code 
Read file keyword 
find matching ARR_Name[] 
apply corresponding ARR_Value[] to input[] 

Une solution plus élégante

typedef struct { 
    const char *Name; 
    const char *Value; 
    } ARR_t; 

const ARR_t ARR[] = { 
    { "ARR1", "Alpha"}, 
    { "ARR2", "Bravo"}, 
    { "ARR3", "Charlie"}, 
    { 0, 0} 
}; 

// Pseudo code 
Read file keyword 
find matching ARR[] by doing strcmp(keyword, ARR[i].Name) 
apply corresponding ARR[i].Value to input[] 

pas clair si OP doit initialiser et le n modifier le contenu de l'entrée [] ou non comme le message est char input[4][10] et non const char input[4][10].

+0

Je vois que je suis en retard à la fête. – chux

Questions connexes