Salut Bobb,
j'ai juste survolé ton code, et pour être franc, sans que tu le prennes mal bien sûr, celui-ci me semble éminemment complexe compte tenu de ce que tu cherches à faire.
Je note plusieurs points qui de mon humble point de vue posent problème.
1) il y a de multiples appels à des fonctions "malloc" pour allouer dynamiquement de la mémoire aux chaines de caractères que tu manipules, mais je n'ai vu (sauf erreur) aucune libération de mémoire via des appels correspondants à "free". En gros, cela signifie fuites de mémoires à chaque appel. Je te rappelle que le C n'a pas de garbage collector, donc ce qui est alloué à un moment et non restitué est perdu jusqu'au prochain reboot (ou plantage).
Par exemple, ta fonction input( )
- Code: Select all
char* input(char *text) {// fonction pour demander le calcul
char *var=malloc(100*sizeof(char));
printf("%s",text);
scanf("%s",var);
char* newVar = malloc(sizeof(char)*strlen(var));
strcpy(newVar,var);
return newVar;
}
à chaque utilisation de la fonction, la variable var se voit allouer 100*char qui ne sont jamais libérés.
De meme ta fonction retourne newVar dont la mémoire a été allouée, mais qu'il te faudra à un moment ou à un autre libérer.
2) je note aussi des trucs bizarres, dont par exemple cette ligne :
- Code: Select all
char** operateur=malloc(sizeof(char*)*6);
qui ne me semble vraiment pas très à propos (nous sommes à deux niveaux de pointeurs). Tout cela par la suite pour "remplir" la chaine par
- Code: Select all
operateur[0]="**";
D'une manière générale, un niveau de pointeur est suffisant pour le commun des mortels et au-delà, il faut passer en mode alerte, c'est qu'il y a un truc à simplifier. (je te passe le fait que assigner de force une chaine de 2 caractères dans un char me fait tousser

et que en plus operateur[0] ne correspond pas à ce que tu penses que cela correspond, en fait operateur[0] correspond à un (char*), pas à un (char)). Bref : simplifie et vérifie.
3) évite les imbrications de fonctions qui rendent le code illisible et intraçable : par exemple
- Code: Select all
calcul=calc(input("Votre calcul : "));
serait nettement plus maintenable en décomposant les actions : on fait la lecture de l'entrée utilisateur, on stocke (comme ça si besoin on peut vérifier que c'est Ok avec un débugger), et ensuite on fait des opérations sur cette entrée utilisateur.
Donc pour répondre à ta question et sans trop m'avancer, ton bug est typiquement lié à un problème de gestion/mauvaise utilisation mémoire. Comme tu travailles avec des chaines, selon la tolérance du système/compilateur, ca passe ou ca ne passe pas. Mais à mon sens ton code est beaucoup trop complexe.
Je ne peux que te conseiller de le reprendre complètement en le décomposant et en vérifiant avec un débugger si c'est Ok ou pas via des watches/breakpoints. Code::Blocks avec MinGW devrait t'être d'une grande aide.
A plus
Sly