PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Somme constante prédéfinies
Somme constante prédéfinies
Iniciado por ceddeb, 11,ago. 2020 15:19 - 8 respuestas
Miembro registrado
34 mensajes
Publicado el 11,agosto 2020 - 15:19
Bonjour,

J'ai 4 constantes :
A = 1
B = 2
C = 4
D = 8

Je reçois depuis un xml une valeur qui est la concaténation d'une ou plusieurs de ces constantes.
Ex : Je reçois 11 dans le xml. Je sais que cela correspond à l'addition des constantes A+B+D
Comment faire, en prog, pour savoir qu'il s'agir de A+B+D ?

J'ai déjà réalisé ce type d'algo grâce à la variable Combinaison dans un projet en Windev 24.
Le hic, c'est que je dois refaire cela dans un vieux projet qui en Windev 17 et que ces variables n'existaient pas !

Prière de ne pas me dire qu'il faille migrer car, pour des raisons diverses, cela n'est pas possible.

Une idée ?

Cédric
Miembro registrado
948 mensajes
Publicado el 11,agosto 2020 - 15:41
Bonjour
Avec ce post https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev.old/26731-combinaison/read.awp vous pouve énumérer toutes les combinaisons possibles et avec la compilation dynamique calculr la somme

--
«Nos clients sont nos meilleurs beta testeur.» H. Mintzberg
«Un programme informatique fait ce que vous lui avez dit de faire, pas ce que vous voulez qu'il fasse» Troisième loi de Greer
Miembro registrado
34 mensajes
Publicado el 11,agosto 2020 - 16:08
Merci bcp Philippe. Je vais regarder cela
Miembro registrado
4.363 mensajes
Publicado el 11,agosto 2020 - 16:12
Bonjour,
En fait, tu as un résultat R sur 4 bits. Il fautcappliquer le AND binaire
SI R AND D(1000)=0, D n'entre pas dans le résultat
SI R AND C(0100)=0, C n'entre pas dans le résultat
etc ...

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
499 mensajes
Publicado el 11,agosto 2020 - 16:19
Bonjour Cédric,

Si vos constantes sont réellement des puissances de deux, il est aussi possible d'utiliser les opérateurs logiques binaires :

CONSTANTE
cA = 1
cB = 2
cC = 4
cD = 8
FIN

nMaValeur est entier = 11
bContientA, bContientB, bContientC, bContientD sont des booléens

bContientA = (nMaValeur & cA = cA) // Vrai
bContientB = (nMaValeur & cB = cB) // Vrai
bContientC = (nMaValeur & cC = cC) // Faux
bContientD = (nMaValeur & cD = cD) // Vrai


Avec un peu d'abstraction et d'itération, il est possible de récupérer toutes les composantes distanctes pour une valeur particulière :

Procedure TestValeur(nValeurTest est un entier) : tableau d'entier

tabComposantes est un tableau d'entiers
nComposante est un entier

POUR i = 0 _À_ 7 // pour tester de 1 (2^0) à 255 (2^8-1)
nComposante = Puissance(2,i)
SI nValeurTest & nComposante = nComposante ALORS
Ajoute(tabComposantes,nComposante)
FIN
FIN

Trace(TableauVersChaîne(tabComposantes,","))

RENVOYER tabComposantes

// TestValeur(11) = [1,2,8]
// TestValeur(124) = [4,8,16,32,64]
// TestValeur(7) = [1,2,4]
// TestValeur(255) = [1,2,4,8,16,32,64,128]
Miembro registrado
34 mensajes
Publicado el 11,agosto 2020 - 16:56
Bonjour Voroltinquo,

La solution avec le ETBinaire ne donne pas les résultats escomptés :
Ex : si je saisie 8, avec le code suivant, j'obtiens :
Constante 2 trouvée et Constante 4 trouvée ALORS que je ne devrait avoir que la constante 4.

CONSTANTE
cst1=0001
cst2=0010
cst3=0100
cst4=1000
FIN

//***************

sSaisie est une chaîne
nmodRetour est un entier sur 4

Saisie("Mod retour ?",sSaisie)
nmodRetour = Val(sSaisie)

SI nmodRetour<16 _ET_ nmodRetour>0 ALORS
SI ETBinaire(nmodRetour,cst1) ALORS
Info("Constante 1 trouvée") //1
FIN
SI ETBinaire(nmodRetour,cst2) ALORS
Info("Constante 2 trouvée") //2
FIN
SI ETBinaire(nmodRetour,cst3) ALORS
Info("Constante 3 trouvée") //4
FIN
SI ETBinaire(nmodRetour,cst4) ALORS
Info("Constante 4 trouvée") //8
FIN
SINON
Info("Saisie incorrecte")
FIN
Miembro registrado
34 mensajes
Publicado el 11,agosto 2020 - 16:57
Dsl pour les fautes :p
Miembro registrado
34 mensajes
Publicado el 11,agosto 2020 - 17:16
Merci Benjamin pour tes explications.
Ta procédure TestValeur fait le taf !

Bonne soirée
Miembro registrado
4.363 mensajes
Publicado el 11,agosto 2020 - 17:24
Windev prend tes constante comme du décimal, il faut utiliser Val, dans la mesure où il n'y a pas de préfixe pour les binaires
CONSTANTE
c_A=1 //0001
c_B=2 //0010
c_C=4 //0100
c_D=8 //1000
FIN


FONCTION DécomposerRésultat(ocRésultat est octet)
bAPrésent,bBPrésent,bCPrésent,bDPresent sont booléens

bAPrésent=ETBinaire(ocRésultat,c_A) //Ce qui n'est pas faux est vrai donc si le résultat n'est pas nul, le booléen sera vrai
bBPrésent=ETBinaire(ocRésultat,c_B)
bCPrésent=ETBinaire(ocRésultat,c_C)
bDPresent=ETBinaire(ocRésultat,c_D)

RENVOYER (bAPrésent,bBPrésent,bCPrésent,bDPresent)


--
Il y a peut être plus simple, mais, ça tourne