TeBeCo
Messages postés467Date d'inscriptionlundi 24 juin 2002StatutMembreDernière intervention 9 mars 2011
-
14 avril 2011 à 11:43
aserf
Messages postés114Date d'inscriptionlundi 15 avril 2002StatutMembreDernière intervention 1 juillet 2011
-
15 mai 2011 à 08:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
aserf
Messages postés114Date d'inscriptionlundi 15 avril 2002StatutMembreDernière intervention 1 juillet 2011 15 mai 2011 à 08:38
non le frameworks n'est pas inclue, mais impossible de le faire tourner sans celui si... donc pas de probleme.
et quand au fait qu'il change la synctax, ... il faut arettter de rever, tu pense que tout les professionel laisserai faire ?
de plus tu as comme je l'es expliquer la compilation dinamyque qui resoud egalement le probleme.
Pour info j'ai migrer mes projet de VS2002 a 2003 a 2005 a 2008 et enfin 2010 sans aucun probleme ... d'ailleur tu peu encors utiliser dans 2010 des projets enterieur, meme selectionner le framewroks cible dans un environnement plus recent.
Donc peu probable que cela arrive. et meme si sa arrivais qu'un nouveau composant ce pointe, l'ancien pourrait toujours etres utiliser dans des projets recent ...
Saros
Messages postés921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 septembre 2010 14 mai 2011 à 20:41
Le framework est pas inclus dans ce que tu compiles, si ?
Genre le jour où, lors d'une mise à jour du framework, la syntaxe change, tu dois réécrire tes expressions.
C'est peu susceptible d'arriver dans ce cas-ci, mais l'idée est là
aserf
Messages postés114Date d'inscriptionlundi 15 avril 2002StatutMembreDernière intervention 1 juillet 2011 13 mai 2011 à 21:40
Je ne comprend pas en quoi tu te retrouve avec une dépendance. La datatable est intégrer au framewors. Alors que ton code nécessitera dans chaqu projet de rajouter ta class.... Perso je trouve moin de dépendance dans une fonction de 3 lignes.
Saros
Messages postés921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 septembre 2010 13 mai 2011 à 16:49
C'est une faute dans le principe pour moi d'utiliser la fonction d'évaluation sql dans ton code, t'introduis de la dépendance dans ton code là où tu peux (donc dois!) t'en passer
Comme ça a déjà été dit ce serait intéressant (et hautement pédagogique ^^) de rendre tout ça plus maniable
aserf
Messages postés114Date d'inscriptionlundi 15 avril 2002StatutMembreDernière intervention 1 juillet 2011 2 mai 2011 à 15:35
non un arbre que tu developpe, tu cree un class avec des property qui contienne chaque valeur de l'arbre, puis un property qui est un list(of ) de cette class, donc qui peu contenir x sous ensemble.
Ensuite tu doit toujours parser les +,-, .. mais tu sais que ce qui ce trouve en dessou du node ou tu te trouve est un calcul a faire, et le plus petit sous ensemble est juste une valeur, ...
cs_ShayW
Messages postés3253Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 201957 2 mai 2011 à 15:25
Salut
le code est peut etre horrible et difficilement maintenable
au moins il calcule juste jusqu'à présent
de tous les codes que j'ai téléchargé pas un ne sait calculer
8^(1/3) ou -8^(1/3) meme le script control donne une
réponse fausse
je n'ai pas trop compris ton idée
ensuite tu te retrouve avec un arbre? comment ça ? arbre binaire ?
et comment vas tu calculer l'expression d'un sous ensemble ?
Bonne prog
aserf
Messages postés114Date d'inscriptionlundi 15 avril 2002StatutMembreDernière intervention 1 juillet 2011 2 mai 2011 à 14:52
Pour revenir sur la source.
je la trouve effectivement difficilement maintenable.
personnelement j'aurai developper un parseur recursif. Tu boucle sur tout les caractere chaque fois que tu trouve une "(" tu rentre dans un sous ensemble et chaque fois que tu rtouve un ")" tu sort du sous ensemble.
ensuite tu te retrouve avec un arbre pour les parenthese et tu commence par evaluer les object les plus eloigner dans cette arbre.
Chaque fois que tu trouve une chaine string qui n'est pas numeric tu remonte soit un evenement ou un delegate.
l'aventage c'est que si une personne veux ce faire ces propres fonction il peut a tous moment juste modifier dans l'evenement la valeur a retourner et la methode de calcul (et il n'est pas obliger de ce taper tout le code a modifier ou chercher l'endroit exact ou le modifier).
(cette evenement prendrai le nom de la fonction et la valeur deja calculer)
a++
Sébastien
aserf
Messages postés114Date d'inscriptionlundi 15 avril 2002StatutMembreDernière intervention 1 juillet 2011 2 mai 2011 à 14:33
Non rien du tous, (et apparement les MVP microsoft non plus, vue que c'est l'un d'eu qui m'avais donnée la solution et ce sont quand meme des references ... enfin pour moi ...)
Le Compute d'une datatable fait quoi a ton avis ?
tu as juste a lire la descrition que Visual Studio te propose, "Expression a evalué".
Effectivement cela ce base sur un moteur Sql, c'est pourquoi tu peu utiliser la compilation dynamique si tu souhaite pousser plus loin.
Maintenant j'ai mille fois plus confiance en une equipe de developpement qui a créé cette fonction, qu'en un algo que tu trouve sur le net.
Cela ne veux pas dir que l'on ne doit prendre que des fonction du frameworks pour developper, mais si il n'y a aucune valeur ajouter je prefere rester dans du classique.
Ensuite si c'est pour la "performance artistique" ou pour "l'apprentissage" aucun probleme chacun fait ce qu'il veux.
TeBeCo
Messages postés467Date d'inscriptionlundi 24 juin 2002StatutMembreDernière intervention 9 mars 2011 2 mai 2011 à 14:25
j'en reviens a la nature du problème hein plutot que des client et ERP :
Evaluer une expression mathématique
en reponse tu propose un Compute d'une ...DataTable
Y a rien qui te choc ?
aserf
Messages postés114Date d'inscriptionlundi 15 avril 2002StatutMembreDernière intervention 1 juillet 2011 2 mai 2011 à 14:04
Alors il faudrait que tu m'explique dans quelle context tu as utiliser la compilation dynamique et tu as eu des problemes de memoire ou de performance ...
Perso je l'ai utiliser dans un ERP que je developpe pour un client, il ce retrouve avec des devis qui on une 10 ene de "Systeme", et on doit les raprocher avec des 10 ene "Nomenclature" qui on chaqune des "LigneNomenclature" (environ un 50ene par Nomenclature) qui comporte chacun un algo. Donc pour Chaque system on ce retrouve a faire les calcul sur un bon milier d'algo a compiler dynamiquement.
Cela ce fait tres rapidement (et les algo sont autrement plus complexe qu'un expression) le tout ce fait en qq seconde ...
De plus la compilation dynamique a ete faite pour justement resoudre ce type de problematique (proposer des algos dans le logiciel que tu developpe) ou pour resoudre des probleme de performance (créé l'algo par code pour le compiler au plus juste de la demande et le rendre plus performant ...)
Effectivement je ne suis pas de ceux qui reinvente tout ... surtout si c'est deja fait et bien fait ...
TeBeCo
Messages postés467Date d'inscriptionlundi 24 juin 2002StatutMembreDernière intervention 9 mars 2011 2 mai 2011 à 00:49
...
no comment la
Je pense qu'effectivement y a bien une 10aine de moyen comme aserf le montre de faire du code rapidement mais de manière pour le moins HORRIBLE, tant le code n'as pas été designer pour cela, ou bien ne serais ce qu'en terme de perf ou mémoire ...
A force de pas vouloir faire d'effort ou de gagner du temps ...
Enfin bon il parait que je râle trop mais la on atteint des sommets
aserf
Messages postés114Date d'inscriptionlundi 15 avril 2002StatutMembreDernière intervention 1 juillet 2011 1 mai 2011 à 17:29
Effectivement cela reprend les fonction sql , si tu veux toute les fonction du frameworks, utilise la compilation dynamique, de plus tu poura crée tes propre fonction .
A+
SEB
cs_ShayW
Messages postés3253Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 201957 1 mai 2011 à 17:03
Salut
j'ai testé ton code mais les fonctions sin cos etc ^ pour les puissances ne sont pas reconnues
aserf
Messages postés114Date d'inscriptionlundi 15 avril 2002StatutMembreDernière intervention 1 juillet 2011 1 mai 2011 à 15:33
BOnjour,
Beaucoup plus simple et 100% garentie fonctionnel, on ce sers du framework.
''' <summary>
''' Evalue une chaine de caractere "expression mathematique" et retourne sont resultat
''' </summary>
'''
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Evaluate(ByVal pValue As String) As Object
Dim lRetour As Object
Dim l As New DataTable
lRetour = l.Compute(pValue, "")
l.Dispose()
l = Nothing
Return lRetour
End Function
jjDai
Messages postés291Date d'inscriptionvendredi 21 février 2003StatutMembreDernière intervention13 mars 2015 15 avril 2011 à 21:41
Bonjour
Comme le dit ShayW :
"comme j'ai voulu écrire moi meme si on essaye pas on avance pas "
C'est tout à son honneur que d'essayer.
JJDAI
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 15 avril 2011 à 10:14
Mais en CSharp il doit y en avoir des dizaines, il suffit juste de référencer la dll pour l'utiliser en VB .Net. Avec le code source en VB, yen a peut être moins, c'est sûr, mais tout dépend de l'utilisation : si tu as de gros besoins, c'est idiot de redévelopper en VB une grosse librairie, autant reprendre le code en CSharp.
cs_ShayW
Messages postés3253Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 201957 15 avril 2011 à 09:35
en c++ mais pas en vb.net
seulement une en vb.net
http://www.codeproject.com/KB/vb/math_expression_evaluator.aspx comme j'ai voulu écrire moi meme si on essaye pas on avance
pas
et puis mon application execute bien ce qu'elle est censée de
faire bien que notée 3/10
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDernière intervention 9 septembre 2018 15 avril 2011 à 08:27
TeBeCo
Messages postés467Date d'inscriptionlundi 24 juin 2002StatutMembreDernière intervention 9 mars 2011 14 avril 2011 à 15:10
y a pas de built-in existant, il faut que tu l’écrive a la main, ça correspondrait a un fichier de settings qui permettrai d'enrichir les donnée parsé / parsable autant a la reconnaissance qu'a l’exécution.
en définissant un bon schéma xslt, ca te permettrai de gerer une liste des opérateur reconnu, le nombre d’opérande, leur type, leur taille, leur syntaxe, etc ...
Tu peux même gérer ça via MEF (Managed Extensibility Framework, .net 4.0 (ou 3.5 si tu recup via codeplex)), cela permettrai d'importer des assembly avec les codes des parser / executeur à chaud de manière a permettre a un utilisateur lambda de rajouter sa propre bibliothèque de fonction
cs_ShayW
Messages postés3253Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 201957 14 avril 2011 à 14:45
Salut
le fichier help.text c'est bizarre quand je télécharge le zip
et ouvre le fichier il y a bien un text et pas de ??????
ok je vais diviser en module et pas tout en un bloc
Un enorme switch case avec les caractère codé en dur
bah je ne connais pas autrement et pourquoi ce n'est pas efficace les fonctions opérateur etc ne change pas ?
je ne connais pas le mapping via un fichier XML si tu connais
un lien qui explique
TeBeCo
Messages postés467Date d'inscriptionlundi 24 juin 2002StatutMembreDernière intervention 9 mars 2011 14 avril 2011 à 11:43
Le fichier "Help.txt" n'est d'aucune aide ....
a part des "?????????????????????????" dedans y a rien (du moins via la visionneuse du site
Merci de le mettre a jour pour toute personne intéressée
Quant au code ...
Mono Bloc
Tout dans un fichier
tout dans une classe
tout dans le code UI, dans le form en plus
Un enorme switch case avec les caractère codé en dur plutot qu'un mapping via un fichier XML char <=> func + param & operand
Private Sub mathexpressiontext_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles mathexpressiontext.KeyUp
If TypeOf (sender) Is TextBox Then
If DirectCast(sender, TextBox).Text <> String.Empty Then
evaluer.Enabled = True
Else
evaluer.Enabled = False
End If
End If
End Sub
....
fonction private => appeler que par ton form donc t'as la maitrise de l'appelant qui en explorant ton code est forcement une textbox, pourquoi faire un "if (type is ...)" ????
ta fonction aurait un scope public ou alors tu code modulaire ... pourquoi pas mais la ... non
Sinon en une ligne ...
evaluer.Enabled = String.IsNullOrEmpty(TaTextBox.Text)
J'ai arrêter la lecture rapidement / pas testé
Code non modulaire ni réutilisable à première vue
15 mai 2011 à 08:38
et quand au fait qu'il change la synctax, ... il faut arettter de rever, tu pense que tout les professionel laisserai faire ?
de plus tu as comme je l'es expliquer la compilation dinamyque qui resoud egalement le probleme.
Pour info j'ai migrer mes projet de VS2002 a 2003 a 2005 a 2008 et enfin 2010 sans aucun probleme ... d'ailleur tu peu encors utiliser dans 2010 des projets enterieur, meme selectionner le framewroks cible dans un environnement plus recent.
Donc peu probable que cela arrive. et meme si sa arrivais qu'un nouveau composant ce pointe, l'ancien pourrait toujours etres utiliser dans des projets recent ...
14 mai 2011 à 20:41
Genre le jour où, lors d'une mise à jour du framework, la syntaxe change, tu dois réécrire tes expressions.
C'est peu susceptible d'arriver dans ce cas-ci, mais l'idée est là
13 mai 2011 à 21:40
13 mai 2011 à 16:49
Comme ça a déjà été dit ce serait intéressant (et hautement pédagogique ^^) de rendre tout ça plus maniable
2 mai 2011 à 15:35
Ensuite tu doit toujours parser les +,-, .. mais tu sais que ce qui ce trouve en dessou du node ou tu te trouve est un calcul a faire, et le plus petit sous ensemble est juste une valeur, ...
Mais perso si je devais faire sa j'utilisera la compilation dynamique, c'est tres simple
voici un exemple d'une class developper pour le probleme que tu remonte
http://www.developpez.net/forums/d474629/dotnet/general-dotnet/contribuez/source-calcul-formule-compilation-dynamique/
a++
seb
2 mai 2011 à 15:25
le code est peut etre horrible et difficilement maintenable
au moins il calcule juste jusqu'à présent
de tous les codes que j'ai téléchargé pas un ne sait calculer
8^(1/3) ou -8^(1/3) meme le script control donne une
réponse fausse
je n'ai pas trop compris ton idée
ensuite tu te retrouve avec un arbre? comment ça ? arbre binaire ?
et comment vas tu calculer l'expression d'un sous ensemble ?
Bonne prog
2 mai 2011 à 14:52
je la trouve effectivement difficilement maintenable.
personnelement j'aurai developper un parseur recursif. Tu boucle sur tout les caractere chaque fois que tu trouve une "(" tu rentre dans un sous ensemble et chaque fois que tu rtouve un ")" tu sort du sous ensemble.
ensuite tu te retrouve avec un arbre pour les parenthese et tu commence par evaluer les object les plus eloigner dans cette arbre.
Chaque fois que tu trouve une chaine string qui n'est pas numeric tu remonte soit un evenement ou un delegate.
l'aventage c'est que si une personne veux ce faire ces propres fonction il peut a tous moment juste modifier dans l'evenement la valeur a retourner et la methode de calcul (et il n'est pas obliger de ce taper tout le code a modifier ou chercher l'endroit exact ou le modifier).
(cette evenement prendrai le nom de la fonction et la valeur deja calculer)
a++
Sébastien
2 mai 2011 à 14:33
Le Compute d'une datatable fait quoi a ton avis ?
tu as juste a lire la descrition que Visual Studio te propose, "Expression a evalué".
Effectivement cela ce base sur un moteur Sql, c'est pourquoi tu peu utiliser la compilation dynamique si tu souhaite pousser plus loin.
Maintenant j'ai mille fois plus confiance en une equipe de developpement qui a créé cette fonction, qu'en un algo que tu trouve sur le net.
Cela ne veux pas dir que l'on ne doit prendre que des fonction du frameworks pour developper, mais si il n'y a aucune valeur ajouter je prefere rester dans du classique.
Ensuite si c'est pour la "performance artistique" ou pour "l'apprentissage" aucun probleme chacun fait ce qu'il veux.
2 mai 2011 à 14:25
Evaluer une expression mathématique
en reponse tu propose un Compute d'une ...DataTable
Y a rien qui te choc ?
2 mai 2011 à 14:04
Perso je l'ai utiliser dans un ERP que je developpe pour un client, il ce retrouve avec des devis qui on une 10 ene de "Systeme", et on doit les raprocher avec des 10 ene "Nomenclature" qui on chaqune des "LigneNomenclature" (environ un 50ene par Nomenclature) qui comporte chacun un algo. Donc pour Chaque system on ce retrouve a faire les calcul sur un bon milier d'algo a compiler dynamiquement.
Cela ce fait tres rapidement (et les algo sont autrement plus complexe qu'un expression) le tout ce fait en qq seconde ...
De plus la compilation dynamique a ete faite pour justement resoudre ce type de problematique (proposer des algos dans le logiciel que tu developpe) ou pour resoudre des probleme de performance (créé l'algo par code pour le compiler au plus juste de la demande et le rendre plus performant ...)
Effectivement je ne suis pas de ceux qui reinvente tout ... surtout si c'est deja fait et bien fait ...
2 mai 2011 à 00:49
no comment la
Je pense qu'effectivement y a bien une 10aine de moyen comme aserf le montre de faire du code rapidement mais de manière pour le moins HORRIBLE, tant le code n'as pas été designer pour cela, ou bien ne serais ce qu'en terme de perf ou mémoire ...
A force de pas vouloir faire d'effort ou de gagner du temps ...
Enfin bon il parait que je râle trop mais la on atteint des sommets
1 mai 2011 à 17:29
A+
SEB
1 mai 2011 à 17:03
j'ai testé ton code mais les fonctions sin cos etc ^ pour les puissances ne sont pas reconnues
1 mai 2011 à 15:33
Beaucoup plus simple et 100% garentie fonctionnel, on ce sers du framework.
''' <summary>
''' Evalue une chaine de caractere "expression mathematique" et retourne sont resultat
''' </summary>
'''
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function Evaluate(ByVal pValue As String) As Object
Dim lRetour As Object
Dim l As New DataTable
lRetour = l.Compute(pValue, "")
l.Dispose()
l = Nothing
Return lRetour
End Function
15 avril 2011 à 21:41
Comme le dit ShayW :
"comme j'ai voulu écrire moi meme si on essaye pas on avance pas "
C'est tout à son honneur que d'essayer.
JJDAI
15 avril 2011 à 10:14
15 avril 2011 à 09:35
seulement une en vb.net
http://www.codeproject.com/KB/vb/math_expression_evaluator.aspx
comme j'ai voulu écrire moi meme si on essaye pas on avance
pas
et puis mon application execute bien ce qu'elle est censée de
faire bien que notée 3/10
15 avril 2011 à 08:27
http://www.codeproject.com/search.aspx?doctypeid=1&q=math+parser
14 avril 2011 à 23:06
Comme j'ai vu qu'il n y avait rien en net le tout en vb6
pour ça j'ai écrit cette application elle n'est pas complete
comme la tienne pas bon tout le monde est parfait
reécris ton projet en dot net pourquoi pas
Bonne prog
14 avril 2011 à 19:06
Certes, fait en VB6 mais je pense assez facilement adaptable en dot net:
http://www.vbfrance.com/codes/EVALUATEUR-FORMULES_27437.aspx
Et je pense très complet
JJDAI
14 avril 2011 à 15:10
en définissant un bon schéma xslt, ca te permettrai de gerer une liste des opérateur reconnu, le nombre d’opérande, leur type, leur taille, leur syntaxe, etc ...
Tu peux même gérer ça via MEF (Managed Extensibility Framework, .net 4.0 (ou 3.5 si tu recup via codeplex)), cela permettrai d'importer des assembly avec les codes des parser / executeur à chaud de manière a permettre a un utilisateur lambda de rajouter sa propre bibliothèque de fonction
14 avril 2011 à 14:45
le fichier help.text c'est bizarre quand je télécharge le zip
et ouvre le fichier il y a bien un text et pas de ??????
ok je vais diviser en module et pas tout en un bloc
Un enorme switch case avec les caractère codé en dur
bah je ne connais pas autrement et pourquoi ce n'est pas efficace les fonctions opérateur etc ne change pas ?
je ne connais pas le mapping via un fichier XML si tu connais
un lien qui explique
14 avril 2011 à 11:43
a part des "?????????????????????????" dedans y a rien (du moins via la visionneuse du site
Merci de le mettre a jour pour toute personne intéressée
Quant au code ...
Mono Bloc
Tout dans un fichier
tout dans une classe
tout dans le code UI, dans le form en plus
Un enorme switch case avec les caractère codé en dur plutot qu'un mapping via un fichier XML char <=> func + param & operand
Private Sub mathexpressiontext_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles mathexpressiontext.KeyUp
If TypeOf (sender) Is TextBox Then
If DirectCast(sender, TextBox).Text <> String.Empty Then
evaluer.Enabled = True
Else
evaluer.Enabled = False
End If
End If
End Sub
....
fonction private => appeler que par ton form donc t'as la maitrise de l'appelant qui en explorant ton code est forcement une textbox, pourquoi faire un "if (type is ...)" ????
ta fonction aurait un scope public ou alors tu code modulaire ... pourquoi pas mais la ... non
Sinon en une ligne ...
evaluer.Enabled = String.IsNullOrEmpty(TaTextBox.Text)
J'ai arrêter la lecture rapidement / pas testé
Code non modulaire ni réutilisable à première vue