Re: evaluateur d'expression calcul simple
Publié : ven. 17/févr./2017 8:47
Avec les versions x64 de PB on a une IMA ligne 35 (Global expression.s=InputRequester...)
Avec les version x86 ça marche.

Avec les version x86 ça marche.

Forums PureBasic - Français
http://forums.purebasic.com/french/
Code : Tout sélectionner
Global expression.s=InputRequester("calculateur" ,"entrez une expression valide ", "3*5+((12*8)/2)+5") ; par defaut =68
If expression = "" : End : EndIf
; ***********************ON CALCUL !************************
retour=recherche_parenthese()
Select retour
Case -1
MessageRequester("erreur","il y a une erreur de parentheses dans votre expression" )
End
Case 1 ; calcul avec parentheses
; recherche les parentheses les plus forte level
SortStructuredList(parenthese(), #PB_Sort_Descending, OffsetOf(parenthese\level),TypeOf(parenthese\Level.l)) ; on trie la list pour faire apparaitre en premier les parentheses les plus prioritaires
ResetList(parenthese())
For t= 0 To ListSize(parenthese())
SelectElement(parenthese(), t)
calcul()
If ListSize(parenthese()) >0
ResetList(parenthese())
t=-1
EndIf
Next t
AddElement(parenthese() ) ; on rempli bidon pour faire croire qu'il reste une parenthese au debut et a la fin de l'expression
parenthese()\pos1.l =1
parenthese()\pos2.l=Len(expression.s)
sortie.s=calcul() ; sans parenthese
MessageRequester("Resultat","le resultat est :"+sortie.s)
Nouveau = 1 ; Goto debut
Case 0 ; sans parentheses
AddElement(parenthese() ) ; on rempli bidon pour faire croire qu'il reste une parenthese au debut et a la fin de l'expression
parenthese()\pos1.l =1
parenthese()\pos2.l=Len(expression.s)
sortie.s=calcul() ; sans parenthese
MessageRequester("Resultat","le resultat est :"+sortie.s)
Nouveau = 1 ; Goto debut
EndSelect
; ******************************************************************************
If Nouveau = 1
Goto debut
EndIf
; ... suite
Code : Tout sélectionner
If expression = "" : End : EndIf
Je ne sais pas non plus, mais j'aurais tendance à penser que pour toutes les fonctions doubles (Select / EndSelect, Procedure / EndProcedure, etc) le compilateur pose un flag à l'instruction de début et le garde jusqu'à l'instruction de fin ou une instruction de sortie de secours (ProcedureReturn, Break).puisqu'il n'y a pas de raisons qu'un Goto fasse planter un Select-case