|
| 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) bContientB = (nMaValeur & cB = cB) bContientC = (nMaValeur & cC = cC) bContientD = (nMaValeur & cD = cD)
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 nComposante = Puissance(2,i) SI nValeurTest & nComposante = nComposante ALORS Ajoute(tabComposantes,nComposante) FIN FIN
Trace(TableauVersChaîne(tabComposantes,","))
RENVOYER tabComposantes
|
| |
| |
| | | |
|
| | |
| |
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  |
| |
| |
| | | |
|
| | |
| |
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 c_B=2 c_C=4 c_D=8 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) 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 |
| |
| |
| | | |
|
| | | | |
| | |
|