Daghis
Messages postés22Date d'inscriptionsamedi 22 janvier 2005StatutMembreDernière intervention10 octobre 2010
-
18 mars 2005 à 15:38
Daghis
Messages postés22Date d'inscriptionsamedi 22 janvier 2005StatutMembreDernière intervention10 octobre 2010
-
26 mars 2005 à 11:01
Coment utiliser la calculatrice (ou autre) en lui envoyant la valeur booléenne de mes variables comme suivant:
(1 and ((0 or 1) and (1 xor 0) or 1) or 1) et récupérer le résultat dans mon programme.
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 20 mars 2005 à 12:53
Je n'ai pas retrouvé le code mais je l'ai recréé. Ca donne la petite fonction suivante.
Le seul problème est le type de tes variables LS, LT, ... et le type de résultat que tu veux obtenir.
Il faut savoir que le type Boolean, en VB, c'est VRAI (valeur : -1) ou Faux (valeur 0). Si tu codes LS=1 ou LS=TRUE, en réalité il y aura -1 dedans. Donc, dans ma fonction j'utilise abs() pour supprimer le signe et je renvoie de l'integer. Ainsi, si tes LS,LT,... sont boolean ou integer ça marchera pareil. A toi de savoir comment tu traites le résultat.
dim r as boolean
r=resultat(TaChaine) te renvoie FAUX ou VRAI (0 ou -1)
dim r as integer
r=resultat(TaChaine) te renvoie 0 ou 1
Je suis parti du principe que ta chaine d'origine ne comportait aucune erreur (du genre nb de parenthèses ouvertes et fermées inégal ou autre). La, c'est à toi de voir.
Public Function Resultat(ByVal s As String) As Integer
Dim sResult As String
'pour la commodité du traitement, suppression de tous les espaces
sResult = UCase(Replace(s, " ", ""))
Daghis
Messages postés22Date d'inscriptionsamedi 22 janvier 2005StatutMembreDernière intervention10 octobre 2010 19 mars 2005 à 19:24
Loup Gris,
Je te remercie pour ta réponse.
Mais je me rends compte que j'ai mal formulé ma question.
En effet, je récupére des formules de type texte comme :
"LS and LT or (LS and LU) and LV"
"Not (LS and (LT or(LS an LU)) and LV)"
etc...
Je sais comment rechercher dans le texte et traiter individuellement les variables concernées pour en connaitre leur valeur booléenne de la manière suivante :
Dim LT as booléan
Dim LS as booléan
LS = 1 ' Etat qui change suivant le programme
LT = 0 ' Etat qui change suivant le programme
etc...
Function Etat(byval Texte as String) as booléen
Select Case Texte
Case "LS": Etat = LS
Case "LT": Etat = LT
etc...
End Select
end Function
Les formules ne sont jamais identiques et je ne sais jamais ou seront les or and et surtout où seront placées les parenthéses.
En résumé je voudrais envoyé toute la formule :
"LS and LT or (LS and LU) and LT" transfomée en
1 and 0 or (1 and 0) and 0
et en recevoir le résultat.
Daghis
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 19 mars 2005 à 21:40
Pour ce qui est de transformer une chaine comme s="LS and LT or (LS and LU) and LT", je ferais plutôt :
replace (s,"LS",LS)
replace (s,"LT",LT)
replace (s,"LU",LU)
...
Pour ce qui est de l'évaluation du résultat : 1 and 0 or (1 and 0) and 0, soit il faut passer par une analyse de la chaine (pas facile) soit tu te sers d'un moteur de bdd comme par exemple :
' dans le menu Projet/References... cocher "Microsoft DAO 3.51 Object Library" ou autre dans le même genre.
Private Sub Form_Load()
Dim db As Database
Dim rs As Recordset
Dim fic As String
Dim question As String
question = "1 and 0 or (1 and 0) and 0"
'nom de la base bidon
fic = App.Path & "\bidon.dat"
'création d'un fichier vide pour simuler une BDD
Open fic For Output As #1
Print #1, ""
Print #1, ""
Close
'ouverture de cette fausse BDD
Set db = OpenDatabase(App.Path, False, True, "Text;")
'envoi de la requete pour calcul par le moteur de BDD
Set rs = db.OpenRecordset("SELECT " & question & " FROM truc.dat")
'affichage du résultat
MsgBox Abs(rs(0))
'on fait le ménage
Kill fic
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
End Sub
Si je retrouve mon code d'évaluation de chaine mathématique, je te le poste.