Soustraction infinie
NemesisX1
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
char *classic_sus_op(char const *str1, char const *str2) { int i = my_strlen(str1) - 1; int j = my_strlen(str2) - 1; int k = 0; int rest = 0; char *result = malloc(sizeof(char) * (i + j + 1)); int dec_i = 0; int dec_j = 0; int test = 0; while (i >= 0 || j >= 0 || rest != 0){ dec_i = (i >= 0) ? str1[i] - '0' : 0; dec_j = (j >= 0) ? str2[j] - '0' : 0; test = dec_i - dec_j + rest; if (test < 0){ result[k] = (test + 10) + '0'; rest = 1; } if (test >= 0){ result[k] = test + '0'; rest = 0; } k++; i--; j--; } result[k] = '\0'; result = my_revstr(result); if (result[0] == '0') my_putchar('0'); else my_putstr(result); my_putchar('\n'); return (result); free(result); } void infin_sus(char *av1, char *av2) { int i = my_getnbr(av1); int j = my_getnbr(av2); if (i > j){ classic_sus_op(av1, av2); } else { my_putchar('-'); classic_sus_op(av2, av1); } } int main(int ac, char **av) { infin_sus(av[1], av[2]); }
Voilà un peu mon code. Mais je ne vois pas pourquoi 1000 - 500 me donne 2050 avec ça...
2 réponses
Salut NemesisX1,
Il y a sans doutes plusieurs problèmes qui créent le bogue que tu constates et qu'on ne peut pas reproduire parce que tu fais appel à des fonctions dans ton code que tu ne fournis pas (et que les contributeurs du forum ne vont pas redévelopper à moins d'être très motivés par ta question), et un problème peut aussi se situer dans ces fonctions.
Pour déboguer ton code, le mieux est que tu utilises un débogueur, qui te permet d'exécuter pas à pas les instructions en inspectant les valeurs de variables et de voir précisément à quel(s) moment(s) ton code ne respecte pas la logique que tu essayes d'implémenter.
Ta boucle while me paraît très compliquée, car tu veux y faire beaucoup de choses en même temps.
Une façon de simplifier les choses, quand tu n'as pas une idée très claire de tes conditions de sortie et de leur interaction, est de partir d'une simple boucle
Ton
Dal
Il y a sans doutes plusieurs problèmes qui créent le bogue que tu constates et qu'on ne peut pas reproduire parce que tu fais appel à des fonctions dans ton code que tu ne fournis pas (et que les contributeurs du forum ne vont pas redévelopper à moins d'être très motivés par ta question), et un problème peut aussi se situer dans ces fonctions.
Pour déboguer ton code, le mieux est que tu utilises un débogueur, qui te permet d'exécuter pas à pas les instructions en inspectant les valeurs de variables et de voir précisément à quel(s) moment(s) ton code ne respecte pas la logique que tu essayes d'implémenter.
Ta boucle while me paraît très compliquée, car tu veux y faire beaucoup de choses en même temps.
Une façon de simplifier les choses, quand tu n'as pas une idée très claire de tes conditions de sortie et de leur interaction, est de partir d'une simple boucle
while (1) { }et d'intégrer les sorties de la boucle avec des instructions
break;en identifiant et isolant chaque condition de sortie séparément des autres.
Ton
free(result);étant placé après ton return, il n'est jamais exécuté et occasionne une fuite mémoire. Ce n'est pas ce qui cause ton bogue, mais tu devrais corriger cela.
Dal
Comme debugeur, tu as gdb qui fonctionne plutôt bien.
Pour voir si tu as des fuites mémoires, tu peux exécute ton programme avec valgrind
Je te conseille de compilé avec -g3 pour debuger et valgrindé.... oui c'est un verbe.
Je te conseille d'enlever -g3 quand tu n'en n'as plus besoin, car il alourdie l’exécutable.
Cordialement
Puis, le faite retourné résulte dans son code, ne sert à rien.
Du point de la conception, il est maladroit de mélanger les genres. Si le rôle de la fonction est de calculer le résultat d'une soustraction, son rôle ne devrait pas être de l'afficher (sauf éventuellement le temps de déboguer la fonction), car l'affichage va enfermer la fonction dans un usage particulier de celle-ci (demain, ou pourrait souhaiter afficher différemment, via une GUI, sauvegarder le résultat dans un fichier, etc.).
L'exploitation du résultat, y compris l'affichage, devrait être la responsabilité de la fonction appelante, et donc aussi la libération de la mémoire, qui ne peut avoir lieu qu'une fois que l'on sait que l'on n'a plus besoin de cette mémoire allouée par la fonction... et cela, ce n'est pas la fonction elle même qui devrait le présumer.