ANALYSEUR D'EXPRESSION AVEC L'API WINDOWS ( VISUAL C++ )
MuPuF
Messages postés536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 août 2008
-
19 juin 2005 à 00:02
cs_mat74
Messages postés241Date d'inscriptiondimanche 10 août 2003StatutMembreDernière intervention16 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.
cs_mat74
Messages postés241Date d'inscriptiondimanche 10 août 2003StatutMembreDernière intervention16 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és509Date d'inscriptionsamedi 28 juin 2003StatutMembreDerniè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és700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 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és1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 21 juin 2005 à 20:32
qui est l'abr***** qui a mis 5?
10/10 génial
gagah1
Messages postés509Date d'inscriptionsamedi 28 juin 2003StatutMembreDerniè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és341Date d'inscriptionjeudi 3 avril 2003StatutMembreDernière intervention17 juin 20083 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és536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 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és700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 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és241Date d'inscriptiondimanche 10 août 2003StatutMembreDernière intervention16 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és700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 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és700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 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és700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 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és536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 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és536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 août 2008 19 juin 2005 à 12:19
lol, pas poss ces matt ... je me perds ....
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 20103 19 juin 2005 à 12:08
Bonjour,
Pour les warnings c'est normal tu renvoies un pointeur sur une variable locale.
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és700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 19 juin 2005 à 11:50
enfin la ca devrait plutot etre ASSERT(j >=0 && j < 5);
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 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és536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 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és700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 19 juin 2005 à 03:57
la derniere ligne du message précédent est a ignorer ;)
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 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és241Date d'inscriptiondimanche 10 août 2003StatutMembreDernière intervention16 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és536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 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és536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 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)
22 juin 2005 à 20:23
je trouve que c'est plus simple pour taper
22 juin 2005 à 15:41
22 juin 2005 à 10:37
21 juin 2005 à 20:32
10/10 génial
21 juin 2005 à 10:12
20 juin 2005 à 18:51
->çà 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;
20 juin 2005 à 09:24
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 !
20 juin 2005 à 01:36
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++ ;)
20 juin 2005 à 01:00
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
20 juin 2005 à 00:40
20 juin 2005 à 00:32
20 juin 2005 à 00:26
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+
19 juin 2005 à 20:31
19 juin 2005 à 12:19
19 juin 2005 à 12:08
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...
19 juin 2005 à 11:50
19 juin 2005 à 11:48
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.
19 juin 2005 à 10:51
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)
19 juin 2005 à 03:57
19 juin 2005 à 03:56
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
19 juin 2005 à 01:45
par contre je viens d'essayer de le compiler en release et sa marche bien . ta quoi comme compilateur ?
19 juin 2005 à 00:52
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
19 juin 2005 à 00:02
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)