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

Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008
- - Dernière réponse : 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

Afficher la suite 
MuPuF
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008
-
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)
MuPuF
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008
-
... 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
cs_mat74
Messages postés
241
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
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 ?
cosmobob
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
3 -
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
cosmobob
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
3 -
la derniere ligne du message précédent est a ignorer ;)
MuPuF
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008
-
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
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
3 -
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.
cosmobob
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
3 -
enfin la ca devrait plutot etre ASSERT(j >=0 && j < 5);
cs_Matt67
Messages postés
554
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010
-
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...
MuPuF
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008
-
lol, pas poss ces matt ... je me perds ....
MuPuF
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008
-
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 !
cosmobob
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
3 -
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+
cosmobob
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
3 -
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
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
3 -
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 !!!
cs_mat74
Messages postés
241
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
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
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
3 -
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++ ;)
MuPuF
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008
-
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 !
Pamaury
Messages postés
341
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
17 juin 2008
1 -
"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;
gagah1
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
3 août 2010
-
En modifiant quelques lignes de code, j'arrive à le compiler avec DevC++, pas mal!
Arnaud16022
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2 -
qui est l'abr***** qui a mis 5?
10/10 génial
cosmobob
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
3 -
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.
gagah1
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
3 août 2010
-
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?
cs_mat74
Messages postés
241
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
c'est normal j'ai fais exprès de laisser passer qq truc
je trouve que c'est plus simple pour taper