2009-06-24 6 views
1

Je suis confronté à des problèmes sur l'analyse lexicale de mon compilateur j'avais déclaré le pointeur suivantProblèmes avec des pointeurs lors de la construction d'un compilateur Pascal en C

char *words[29]={ 
     "program", 
     "label", 
     "integer", 
     "word", 
     "char", 
     "byte", 
     "shortint", 
     "logint", 
     "real", 
     "single", 
     "double", 
     "string", 
     "boolean", 
     "var", 
     "procedure", 
     "function", 
     "begin", 
     "end", 
     "if", 
     "then", 
     "else", 
     "or", 
     "and", 
     "div", 
     "not", 
     "do", 
     "while", 
     "mod" 
}; 
char message[30]; 

puis j'ai essayé de l'utiliser dans une fonction

  for(handle=0;(&words[handle] != NULL);handle++) 
      { 
       message = &words[handle]; 
       if(!strcmp(token,message)) 
        message='words'; 
      } 

Mais je reçois les erreurs suivantes lors de la tentative d'exécution:

en ce qui concerne (Ligne message = & mots [handle];): C4047 d'avertissement: '=' : 'char [30]' diffère des niveaux d'indirection de 'char **'

en ce qui concerne (ligne message = & mots [poignée];): erreur C2106: '=': opérande gauche doit être l valeur

concernant (ligne message = 'mots';): erreur C2015: trop de caractères à constante

concernant (ligne message = 'mots';): erreur C2106: « = »: opérande gauche doit être l valeur

je ne peux pas travailler avec des pointeurs de cette façon? Avez-vous des suggestions?

Répondre

3

Trois choses:

  1. Les esperluette (&) sont étrangers. Le type de words[handle] est char *, c'est-à-dire une chaîne, donc vous avez ce dont vous avez besoin. Vous n'avez pas besoin de prendre l'adresse de ce char *.

  2. Vous ne pouvez pas affecter directement à message avec = car il s'agit d'un tableau. C n'est pas un langage très sophistiqué. Vous pouvez soit changer message en char *message, donc c'est un pointeur plutôt qu'un tableau; ou vous pouvez utiliser la fonction strcpy(dst, src) pour copier, comme ceci: strcpy(message, "words").

  3. Votre boucle for recherche un pointeur NULL dans le tableau words il sait quand arrêter - mais vous n'avez pas NULL dans le tableau! Vous devez ajouter NULL à la fin. Comme il est écrit il n'y a que des chaînes régulières, donc la boucle ne trouvera jamais le pointeur nul qu'elle cherche et ira se charger dans des zones inconnues de la mémoire.

Hope that helps!

+0

Ça m'a beaucoup aidé, merci! –

3

Vous avez un certain nombre d'erreurs là-bas:

  • au lieu de & mots [poignée], utilisez mots [poignée]
  • ce que vous essayez de le faire par message = 'mots'?Il y a au moins 3 erreurs ici: la chaîne utilise des guillemets doubles, pas des guillemets simples; le message est une constante, vous ne pouvez pas le changer; Pour copier des chaînes, vous devez utiliser strcpy(), pas seulement = opérateur
  • strcmp() renvoie 0, si les chaînes sont égales; vous devez inverser votre logique
  • vous avez oublié d'inclure NULL à la fin de votre tableau
2

Vous avez un certain nombre de problèmes avec votre code. Tout d'abord, vous devez déclarer votre tableau de mots-clés en tant que const char *words[]. C'est une mauvaise pratique de déclarer les constantes de chaîne comme char *, sans le const; c'est seulement autorisé afin que le code hérité compile toujours.

Vous ne devez pas spécifier la taille de tableau de 29 dans la déclaration, car elle est fragile. Vous devez simplement utiliser des parenthèses vides et laisser le compilateur déterminer la taille du tableau. Vous pouvez obtenir la taille du tableau en faisant sizeof(words)/sizeof(words[0]), ce qui sera toujours correct même si vous ajoutez ou supprimez des éléments de words.

Ensuite, votre boucle for ne se terminera jamais (même si elle sera presque certainement une erreur de segmentation à un moment donné). Prendre l'adresse d'une valeur ne donnera jamais le pointeur nul, donc &words[handle] != NULL sera toujours vrai. La bonne façon de parcourir la boucle est de compter que le nombre d'entrées:

for(handle = 0; handle < sizeof(words)/sizeof(words[0]); handle++) 

message est déclarée comme un tableau de caractères. Les tableaux ne sont pas assignables, c'est-à-dire qu'ils ne sont pas valables. Si vous souhaitez assigner à un tableau, vous devez explicitement copier des données avec quelque chose comme strcpy() (non recommandé sauf dans certains cas, en raison de débordements de tampon potentiels), strncpy(), memcpy(), ou strncpy_s() (disponible uniquement sur Windows).

Dans ce cas, cependant, vous ne voulez pas du tout de tableau - vous voulez juste assigner un pointeur. Déclarez message en tant que const char * à la place. Avec message déclaré correctement, vous feriez:

const char *message; 
... 
message = words[handle]; 
if(!strcmp(token, message)) 
    message = "words"; 

Dans la déclaration finale là-bas, vous devez utiliser des guillemets doubles autour words pour en faire une chaîne constante. Les guillemets simples sont pour des constantes à caractère unique (par exemple 'A'). Bien qu'ils puissent techniquement contenir plus d'un caractère, l'endianness de la constante entière résultante est définie par l'implémentation, et ils ne sont pas ce que vous voulez dans ce cas.

Je ne suis pas sûr de ce que vous essayez de faire avec la ligne message = "words";. Si vous essayez de faire un truc intelligent avec la variable words, arrêtez maintenant, ça ne va pas fonctionner. C n'a aucune sorte de réflexion.

Questions connexes