ANALYSEUR D'EXPRESSION AVEC L'API WINDOWS ( VISUAL C++ )

MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008 - 19 juin 2005 à 00:02
cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010 - 22 juin 2005 à 20:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/32156-analyseur-d-expression-avec-l-api-windows-visual-c

cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010
22 juin 2005 à 20:23
c'est normal j'ai fais exprès de laisser passer qq truc
je trouve que c'est plus simple pour taper
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
22 juin 2005 à 15:41
Par contre il gère pas d'erreur de saisi. Exemple si on fait 10m10 il donne comme resultat 1010, si tu fais 12=5 le resultat est 125. A verifier?
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
22 juin 2005 à 10:37
l'abricot ? :) moi, la premiere version qu'il a postée plantait des le demarrage chez moi a cause notamment d'un buffer overflow... et apres on peut pas renoter.
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
21 juin 2005 à 20:32
qui est l'abr***** qui a mis 5?
10/10 génial
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
21 juin 2005 à 10:12
En modifiant quelques lignes de code, j'arrive à le compiler avec DevC++, pas mal!
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
20 juin 2005 à 18:51
"unsigned long double"(fonction.h)
->çà existe çà ?????? pas à ma connaissance en tout cas çà compile pas et je comprend bien pourquoi . un double ne peux pas être signé ou non signé .

ensuite faudrait faire un
using namespace std;
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
20 juin 2005 à 09:24
Pour la classe string, Cosmobob a raison, c'est vraiment pas mal. Quand aux plantages ... j'ai rien reussi a planter, et je me suis amusé avec je comprends pas. Mais si ça marche pas chez cosmo c'est que dois y avoir un prob.

Avant de poster le message j'ai re essayé le prog, j'ai trouvé un autre bug, on peux ecire du texte dedans et ça le fais planter (essais de gerer si ce texte est une commande ou autre, si autre ---> erreur et tu signales !
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juin 2005 à 01:36
aléatoire = ya du mal a donner d'exemple.
La seule chose a dire est que la memoire est mal gerée, donc si ca plante pas, c'est de la chance ...
et sinon prends pas ca pour du cassage, j'ai essayé de faire en sorte le plus possible que tu puisses corriger tes erreurs; apres c'est les limites d'un message sur un site, une phrase brute peut avoir l'air plus crue que dans l'esprit de celui qui l'écrit.

un conseil si tu veux améliorer ton truc : reflechis a comment re organiser ton code et repars de zero. Sachant que ta stratégie de décomposition d'expression est déja faite (ce qui a du etre le plus long)

a++ ;)
cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010
20 juin 2005 à 01:00
COSMOBOB : et ben t'avais vraiment envis de me casser toi aujourd'hui . sa fait tjs plaisir .

sinon pour l'expression j'ai expliquer dans le attention les cas ou il affiche un résultat alors qu'il y a une erreur de synthaxe
genre si tu tape 5++5

pour les erreurs aléatoires donne des exemples, parce que moi j'ai rien remarqué pour l'instant
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juin 2005 à 00:40
tiens, en plus, a partir du moment ou ca reussit a calculer des expressions mal parenthesees on peut penser que le parsage de l'expression est mauvais !!!
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juin 2005 à 00:32
ha ben ca plante aussi de maniere assez aleatoire qd je mets des operations, puis que j'efface et que j'en retape une ....
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
20 juin 2005 à 00:26
ben moi je reussis toujours a le faire bugger :-)
primo, si tu fais un new char[ ... ] quelque part, fais un delete [] par la suite (la t'as des fuites de memoire)
Note qu'une connaissance meme basique de la STL te ferait pencher pour l'utilisation des std::string plutot que de faire toi meme un new char[taille] ( et comme ca t'aurais rien besoin de desallouer)
sinon le code est tres mal organisé (tu as qd meme un SetWindowText a l'interieur de ta fonction calcul !!!! il y avait moyen de renvoyer le calcul, puis de faire tout ce qui est affichage a part)

enfin pour faire boguer le truc, des le debut je reste appuyé sur une touche, et il me dit qu'il y a un pb de gestion de la memoire, je cite:
(---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: ...lyseur d expression complexe\Debug\analyseur d expression.exe
File: dbgheap.c
Line: 1100

Expression: _CrtCheckMemory()

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
Abandonner Recommencer Ignorer
---------------------------
)

enfin voila, je suis pas du meme avis que MuPuf, c'est loin d'etre parfait (tes problemes sont liés a la mauvaise organisation du code !!!!), mais ca reste cela dit pas trop mal.

a+
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
19 juin 2005 à 20:31
Suite a la maj, ben je dis bravo, un code qui sert vraiment a quelque chose et qui marche now nickel ! La gestion des prioritée est respectée, PARFAIT !
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
19 juin 2005 à 12:19
lol, pas poss ces matt ... je me perds ....
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
19 juin 2005 à 12:08
Bonjour,

Pour les warnings c'est normal tu renvoies un pointeur sur une variable locale.

J'ai fait une modif ici http://mirabon.free.fr/fichier_c/

par contre le code dans fonctions.h pas bon, fait un fonctions.cpp

Pas trop regardé le code mais le principe est sympa.
Pas de soucis en mode debug ni en release.

Matt...
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
19 juin 2005 à 11:50
enfin la ca devrait plutot etre ASSERT(j >=0 && j < 5);
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
19 juin 2005 à 11:48
si ca reagit differement c'est parce que le code est buggé ... en debug et en release la gestion de la pile et de la mémoire n'est pas la meme (ya des trucs en plus en debug), et donc t'as moins de chance de faire planter le programme en debug si en depassant les zones d'un tableau du genre char expr[5]; tu écrases des infos de debogage.
de toutes facons ce genre d'erreurs n'a pas 150 000 causes possibles: il y a :
- une fonction retourne un pointeur qui pointe sur une variable locale;
- un pointeur n'est pas correctement initialisé, ou l'est a 0, et tu fais ensuite *ptr ou ptr->qqchose
- on deborde en ecrivant dans un tableau. Un truc a faire pour tester ca si t'es pas sur, est de mettre un ASSERT(j > 0 && j < 5); juste avant un endroit ou tu fais expr[j] = ..; ou que tu utilises expr[j] (ici j < 5 car on avait char expr[5];).
Le ASSERT ne sera executé qu'en debug mais permettra au moins de detecter le probleme.
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
19 juin 2005 à 10:51
Moi vc++ 6, le mode release plante, mais va savoir ou, puisque en debug il marche, je trouve ça vraiment con que ce soit pas le meme code en release qu'en debug (outre le fait qu'il ait des infos de debug)...
Sinon, je pense que le fait de corriger ça devrait enlever le prob du release.
Good luck, préviens quand tu as fini, car je l'utilise ton prog, en plus les varibles sont tjs accessible entre 2 instances ... (stocké dans un fichier sous forme de texte)
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
19 juin 2005 à 03:57
la derniere ligne du message précédent est a ignorer ;)
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
19 juin 2005 à 03:56
salut,
déja j'utilise vs7, et le code compile pas : les operateurs comme += doivent - dans le standard c++ que vc6 ne respecte pas - retourner une valeur. Il suffit de leur faire renvoyer un Complexe& et de mettre return *this; a la fin de chaque implementation de tes operateurs +=, -=, etc.

sinon moi ton programme plante au démarrage en release ET en debug.
En debug il me met que la pile autour d'une variable dans la fonction Liste interpretation (char* expression) a été corrompu.
En gros ca veut dire que t'as mal géré les pointeurs.
regarde ca : char expr[5]; et jamais dans la suite de ta fonction tu ne vérifies que ton indice j utilisé dans expr[j] ne dépasse 4 (et j finit par dépasser 4; ton code est mal concu ...). D'ou un buffer overflow...
Ceci ne m'etonne pas trop car le fait de renvoyer a d'autres endroits un pointeur qui désignait un tableau déclaré en local ne t'as pas ennuyé (le fameux warning "returning address of local variable or temporary"). Pour le corriger, rend la variable que tu renvoies static !! static dit que ta variable continue d'exister tout le temps meme quand tu es sorti de la fonction; toi tu renvoyais un pointeur vers une variable locale qui n'etait donc plus valide quand tu sors de la fonction appelée !!!!!

Bon il te manque certaines bases du C qd meme ;)





moi aussi ca plante en release au démarrage
cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010
19 juin 2005 à 01:45
ouai moi aussi jai les warnings mais je sais pas trop comment corrigé sa ...
par contre je viens d'essayer de le compiler en release et sa marche bien . ta quoi comme compilateur ?
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
19 juin 2005 à 00:52
... il plante au démarage en mode release, encore une différence de gestion de la mémoire, rrr... essais de le corriger, j'ai 2 warnings si tu veux:
C:\Documents and Settings\Progr@mmeur Fou\Bureau\analyseur d expression complexe\fonctions.h(1405) : warning C4172: returning address of local variable or temporary
C:\Documents and Settings\Progr@mmeur Fou\Bureau\analyseur d expression complexe\fonctions.h(1414) : warning C4172: returning address of local variable or temporary

Il doit y avoir un rapport
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
19 juin 2005 à 00:02
No comment, just a 10/10 ...

Bon ok je commente, Super parseur d'expression, c'est bien simple, JE L'ADOPTE !
T'es vraiment un bon toi ;-)
Une approche du probleme tres intéréssante (meme si je comprends pas tout, on va dire que j'ai pas vraiment cherché aussi)
Rejoignez-nous