EVALUER UNE EXPRESSION

cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008 - 29 oct. 2004 à 19:15
nabilham9128113 Messages postés 6 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 5 janvier 2010 - 19 mars 2009 à 22:02
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/27155-evaluer-une-expression

nabilham9128113 Messages postés 6 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 5 janvier 2010
19 mars 2009 à 22:02
salut , avec cette solution , tu peux tomber dans l'erreur suivante :

-------------------------------------------------------

Dim a As integer
a = -1

Expression = "a^2"

Expression2 = Replace(Expression, "a", a)

resultat = Evaluer (Expression2)

-------------------------------------------------------
et que je voie , ça retourne -1 !!!!!
en fait un remplacement ne résoud pas le problème ;
car une fois le a remplacé , il l'interprète commme -1^2 =-(1^2)=-1 et l'erreur !!
une solution est :Expression2 = Replace(Expression, "a", "(" & a & ")").
mais je cherche une source plus performante.
bonne chance
jaco_2004 Messages postés 3 Date d'inscription samedi 28 août 2004 Statut Membre Dernière intervention 31 décembre 2004
31 déc. 2004 à 08:19
Salut a tous !

Juste un petit mot pour vous dire que je suis super heureux d'etre tombe sur cet echange de posts. Ca fait presque trois jours que je cherchais desesperement un evaluateur d'expression robuste et fiable... J'ai retourne tout le site VBfrance : analyseurs syntaxique, calculettes, evaluateurs de formules... A peu pres toutes les sources a ce sujet y sont passee, mais impossible de trouver chaussure a mon pied.

J'avais bien vu la solution d'Olilefou en passant par les bases de donnees (http://www.vbfrance.com/code.aspx?ID=2869), mais impossible de la faire fonctionner (impossible de saisir du texte dans les textboxs).

Et voila que je tombe sur ce nouveau post d'Olilefou qui resoud mon probleme en dix lignes... genial ! Derniere frayeur, ne pas pouvoir evaluer des expressions contenant des variables deja declarees.

Exemple, evaluation de Expression :
------------------------------------------------------

Dim a, b As integer
a = 1
b = 2

Expression = "3*a*b"
resultat = Evaluer (Expression)

-------------------------------------------------------

Probleme resolu rapidement avec un Replace :

-------------------------------------------------------

Dim a, b As integer
a = 1
b = 2

Expression = "3*a*b"

Expression2 = Replace(Expression, "a", a)
Expression2 = Replace(Expression, "b", b)
'qui remplace la chaine "3*a*b" en "3*1*2".

resultat = Evaluer (Expression2)

-------------------------------------------------------

Voila. Ca va me servir dans le cadre d'un programme utilisant des algorithmes genetique pour optimiser une structure composite (je suis eleve ingenieur en mecanique, j'etudie le comportement des structures composite dans le cadre d'un stage en labo de recherche). L'utilisateur pourra entrer la fonction qu'il souhaite optimiser en fonction de parametres non constants (d'ou les a, b...).

Voila, je ne suis pas sur que ca interesse grand monde, mais quand je suis content j'aime bien racconter ma vie... Je suppose que vous connaissez tous la sensation d'euphorie lorsque vous trouvez la solution a un probleme (dire que j'ai choisi la meca pour ne pas etre ingenieur informaticieeeeeeeeeeen... ;-) ).

Sinon, je voulais remercier par la meme occasion les admin et autres utilisateurs de ce site. Ca fait quatre mois que je bosse sur ce programme d'optimisation des stratifies composites, j'ai donc pas mal traine sur VBfrance pour chercher des reponses a mes nombreuses questions sur le language Visual Basic. Et j'y ai toujours trouve (plus ou moins facilement) des solutions a mes problemes. Je termine mon stage dans quinze jours (et le prgm par la meme ocassion... ) et je ne pense pas reprogrammer dans un futur proche (je suis mecanicien quand meme ;-) ), donc encore un grand merci a la communaute VBfrance.

Ciao a tous depuis Boulder dans le Colorado (ah oui, j'ai oublie de preciser, je suis aux USA... au pays de Bill et George... ;-( ).

P.S.: je pense a vous sur les pistes de Vail et Aspen ce week end !!!!
Utilisateur anonyme
9 nov. 2004 à 20:37
Je viens de mettre sur le site un evaluateur assez complet, je pense que ca vous interressera :
Il y a longtemps que je l'avais fais mais ils manquait les commentaires, c'est fait.

http://www.vbfrance.com/code.aspx?ID=27437
Olilefou Messages postés 29 Date d'inscription mercredi 1 août 2001 Statut Membre Dernière intervention 9 décembre 2005
3 nov. 2004 à 00:39
Silmon> Enfin quelqu'un qui partage ma méthode, c'est ce que j'ai utilisé dans une vieille source (http://www.vbfrance.com/code.aspx?ID=2869), sauf que ma base de donnée est réduite à un fichier texte.
Vive de SQL...
Silmon Messages postés 85 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 7 mai 2007
2 nov. 2004 à 17:16
Salut,
Voici la methode qu'on utilise dans ma boite
(Ca peut interesser plus d'un):

on execute un select avec le texte de la formule

Par exemple:
"SELECT 5+2*3"

Certains SGBDs comme Sql Server n'ont pas besoin
de la clause FROM.
Pour d'autres comme ACCESS, il faut utiliser le FROM.
Dans ce cas, on peut definir une table contenant une seule ligne avec un seul field du type boolean pour minimizer l'espace
ce qui donne:

"SELECT " & GetFormule & " FROM TABLE_FORMULE;"

si la table a plus d'une ligne, utiliser le TOP 1.

Avantages:
- pas d'api
- methode 100% fiable (jusqu'à preuve du contraire)

Inconvenients:
- on a pas accés au code de conversion
- obligation d'utiliser un SGBD
bidoch78 Messages postés 67 Date d'inscription mercredi 27 février 2002 Statut Membre Dernière intervention 2 décembre 2005
31 oct. 2004 à 12:54
A noter tout de meme que lorsqu'on a la possibilité d'avoir le code, et de pouvoir le modifier pour aporter des nouveautés, c'est quand meme plus interessant.

J'ai trouvé mon erreur yoman64, en faite j'analyse de gauche à droite l'expression, hors (et j'avais lu ca quelque part en y repensant) il faut analyser de droite à gauche, donc je corrige ca.
Olilefou Messages postés 29 Date d'inscription mercredi 1 août 2001 Statut Membre Dernière intervention 9 décembre 2005
31 oct. 2004 à 01:59
La dll pour 'Microsoft Script Control 1.0' est dans tour les windows depuis 98 ou ME.
La dll pour les ADO est dans tous les windows depuis 2000 (je crois), dans tous les Office depuis 97 et téléchargable gratuitement chez Micrsoft.
Et avec 'Assistant Empaquetage & déploiement', on ne se prend pas la tête à installer son appli. sur un poste.
A pars ça j'apprécie les API, mais pas quand c'est beaucoup plus simple sans.
pietrocecchi Messages postés 9 Date d'inscription samedi 19 juin 2004 Statut Membre Dernière intervention 9 mai 2005
30 oct. 2004 à 19:22
Une fois posé, le problème 'expressions' devient très intéressant...
Très bon
bidoch78 Messages postés 67 Date d'inscription mercredi 27 février 2002 Statut Membre Dernière intervention 2 décembre 2005
30 oct. 2004 à 14:31
J'ai vite regarder l'API EBExecuteLine mais je ne vois pas comment récuperer le résultat.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
30 oct. 2004 à 13:35
pas OK avec cette méthode, car il faut la Dll, et là, on n'est pas sur du tout !

l'API EBExecuteLine est interessante pour evaluer....
Olilefou Messages postés 29 Date d'inscription mercredi 1 août 2001 Statut Membre Dernière intervention 9 décembre 2005
30 oct. 2004 à 12:25
J'ai plus court :

Private Sub Form_Load()
' quelques exemples
MsgBox Evaluer("21 / 321 * 3221 - 32 + 343432 / 43243.5454 / 54354 * 345 / (543 - 45 / 43 + 343)")
MsgBox Evaluer("sin(3.14159/4)")
MsgBox Evaluer("now")
MsgBox Evaluer("weekdayname(2, False, vbMonday)")
MsgBox Evaluer("""une longueur : "" & len(""azerty"")")
Unload Me
End Sub

Public Function Evaluer(Exp As String) As String
Dim X As New MSScriptControl.ScriptControl
X.Language = "VBScript"

On Error GoTo E:
Evaluer = X.Eval(Exp)

Exit Function
E:
Evaluer = "Expression invalide."
End Function

Il ne faut pas oublier de référencer 'Microsoft Script Control 1.0'.

Il y a aussi un évaluateur d'expressions dans le gestionnaire de base de données ADO, voici un vieux code à moi qui l'utilise : http://www.vbfrance.com/code.aspx?ID=2869
Cela servait pour les vieux Windows qui n'avait pas le 'Script Control', et ou on pouvait installer les ADO.

bye.
bidoch78 Messages postés 67 Date d'inscription mercredi 27 février 2002 Statut Membre Dernière intervention 2 décembre 2005
29 oct. 2004 à 23:08
J'ai jeter un coup d'oeil, c'est le week end quand meme (donc la correction peut etre pour demain ou apres demain), je crois avoir trouver le pb. Mais je suis comme toi, et je vais le trouver ton code infaillible.
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
29 oct. 2004 à 23:01
Lol en passnat prend le pas personnel ^^
Ton code fonctionne bien avec les expressions simples ;-)
C juste que moi je cherche un code vraiment infaillible , et j'ai pas vrmt le gout de le coder moi même , donc si ton code est fini , c serais cool :-)
bidoch78 Messages postés 67 Date d'inscription mercredi 27 février 2002 Statut Membre Dernière intervention 2 décembre 2005
29 oct. 2004 à 20:03
cool, je vais regarder ca
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
29 oct. 2004 à 19:15
J'ai fait une expression avec plin d'opérant ( j'ai fait expiprès lol)

Avec 21 / 321 * 3221 - 32 + 343432 / 43243.5454 / 54354 * 345 / (543 - 45 / 43 + 343)

J'obtiens 178.7196... dans vb
et dans ton prog j'ai -748578,032222159

Donc je ne sais pas dou vien l'erreir mais en t-k lol a chaque fois qu'il y a un nv évaluateur d'expression sur le site , je faiut tt le temps ce genre de test ^^


YoMan64
PhPKoDe.Com