Compte_supprime_69952 Posté(e) le 10 décembre 2005 Partager Posté(e) le 10 décembre 2005 Salut, j'aimerais savoir si quelqu'un pouvait m'aider à débugger mon code car le compilateur (utilisation de gdb) m'indique des erreurs lignes 119,169 et 252 mais je n'arrive pas à résoudre Merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
neologix Posté(e) le 10 décembre 2005 Partager Posté(e) le 10 décembre 2005 Chez moi, ton programme compile avec les options Wall et ansi, par contre il crashe avec une erreur de segmentation. Un truc bizarre, dans ton main: int main(void) { char *ligne = " + * 1 2 7"; Expression e = NULL; if(AnalyseExpression(&ligne)==NULL) { fprintf(stderr,"erreur\n"); return 1; } e=AnalyseExpression(&ligne); return 0; } Tu lui fais calculer 2 fois le résultat, c'est un peu dommage non? Par exemple: int main(void) { char *ligne = " + * 1 2 7"; Expression e = NULL; if((e= AnalyseExpression(&ligne))==NULL) { fprintf(stderr,"erreur\n"); return 1; } return 0; } Par ailleurs, j'ai regardé vite fait, et il me semble que la ligne que tu parses est un char * (un string quoi) Pourquoi tu passes un pointeur vers la string? Tu peux la passer direct, en C une string est un pointeur vers le premier élément, au moins tu n'auras pas à te faire chier avec des char **liste. Ou alors j'ai pas compris ce que tu fais. J'ai l'impression que c'est ta fonction espace qui merde, mais je ne comprends pas ce qu'elle fait. un char ** est un tableau de string (comme lorsque tu récupères les paramètres sur la ligne de commande, char **argv. Ensuite, tu fais: void espace(char **ligne) { while(*ligne[0] == ' ') ++(*ligne); } T'incrémentes ce qui se trouve à une case mémoire référencé par un char. T'essaie d'écrire n'importe où en mémoire. En dehors de ton espace d'adressage, l'OS termine le programme (segfalut). Normal. Lien vers le commentaire Partager sur d’autres sites More sharing options...
neologix Posté(e) le 10 décembre 2005 Partager Posté(e) le 10 décembre 2005 J'ai édité mon message ci-dessus, regarde pourquoi tu segfault. Lien vers le commentaire Partager sur d’autres sites More sharing options...
neologix Posté(e) le 10 décembre 2005 Partager Posté(e) le 10 décembre 2005 Oula, je suis fatigué moi. Tu incrémentes une adresse mémoire (pointeur char *). Ca, tu peux le faire. Le problème, c'est que les adresses mémoire ainsi obtenues ne pointent plus vers quelque chose, donc dès que tu vas y accéder, tu vas obtenir un segfault. En fait, dis-moi ce que tu veux que la fonction espace fasse, et on va voir. Lien vers le commentaire Partager sur d’autres sites More sharing options...
neologix Posté(e) le 10 décembre 2005 Partager Posté(e) le 10 décembre 2005 C'est effectivement ce qu'elle fait. Je comprends (enfin) ton algo, je suis vraiment à la rue. Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 11 décembre 2005 Partager Posté(e) le 11 décembre 2005 un truc dans ce goût là : char * espace(char * c) { char * ret = c; while( *ret == ' ' && *ret != '\0') ret++; return ret; } après, j'ai pas eu le courrage de lire tout ton code... EDIT : au temps pour moi, tu veux que ta fonction espace modifie le pointeur qu'on lui donne. Bon, j'aime pas du tout, mais si tu y tiens... Ce qu'il faut, c'est surtout ne pas oublier de gérer la fin de la chaîne... Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 12 décembre 2005 Partager Posté(e) le 12 décembre 2005 Dis toujours ce que c'était. Lien vers le commentaire Partager sur d’autres sites More sharing options...
neologix Posté(e) le 13 décembre 2005 Partager Posté(e) le 13 décembre 2005 un truc dans ce goût là : char * espace(char * c) { char * ret = c; while( *ret == ' ' && *ret != '\0') ret++; return ret; } La deuxième condition du while est pas redondante? si *ret == ' ', alors *ret != '\0' non? char * espace(char * c) { char * ret = c; while( *ret == ' ') ret++; return ret; } Moi aussi, ça me semblait bizarre de modifier un pointeur, et je me suis un peu embrouillé Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nis Posté(e) le 13 décembre 2005 Partager Posté(e) le 13 décembre 2005 Je ne pense pas que ce soit redondant. Tu compares un espace avec un caractère de fin de chaîne. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 13 décembre 2005 Partager Posté(e) le 13 décembre 2005 Sauf qu'un espace n'est pas un caractère de fin de chaine. Donc si le caractère courant est un espace, alors ce n'est pas un caractère de fin de chaine. Pour un espace : *ret == ' ' est vrai et *ret != '\0' est vrai aussi (vu que ' ' != '\0') Pour un non espace, *ret == ' ' est faux, fin de l'évaluation. Seule la première partie sert. Ça me rappelle les cours de logique en 1ere année, les algo du style if(a==b) x=b; else x=a; Le nombre de gens qui ne savaient pas optimiser ça... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Captain Hadock Posté(e) le 13 décembre 2005 Partager Posté(e) le 13 décembre 2005 Ça me rappelle les cours de logique en 1ere année, les algo du style if(a==b) x=b; else x=a; Le nombre de gens qui ne savaient pas optimiser ça... x=a; (ça a l'air trop simple, y aurait il un piège? Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 13 décembre 2005 Partager Posté(e) le 13 décembre 2005 Bah non c'est ça justement, d'où le smiley. Mais il y a d'autres erreurs courantes et moins triviales souvent faites. Je n'ai pas d'exemple en tête. Fin du HS Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.