Posté(e) le 10 décembre 200519 a 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 Modifié le 21 décembre 200519 a par Morpheus75
Posté(e) le 10 décembre 200519 a 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. Modifié le 10 décembre 200519 a par neologix
Posté(e) le 10 décembre 200519 a 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.
Posté(e) le 10 décembre 200519 a C'est effectivement ce qu'elle fait. Je comprends (enfin) ton algo, je suis vraiment à la rue.
Posté(e) le 11 décembre 200519 a 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... Modifié le 11 décembre 200519 a par lorinc
Posté(e) le 13 décembre 200519 a 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é Modifié le 13 décembre 200519 a par neologix
Posté(e) le 13 décembre 200519 a Je ne pense pas que ce soit redondant. Tu compares un espace avec un caractère de fin de chaîne.
Posté(e) le 13 décembre 200519 a 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...
Posté(e) le 13 décembre 200519 a Ç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?
Posté(e) le 13 décembre 200519 a 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
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.