Bug avec une macro...
Publié : mer. 26/sept./2007 23:48
Voici mon souci. Je vais essayer d'être clair pour trouver d'où vient ce problème.
J'ai une macro capricieuse:Cette macro est sensée retourner 1 si la valeur x est une année bissextile. Sinon 0. x est la valeur d'une année postérieure ou égale à 1900.
Un détail qui s'ajoute : cette macro contient des appels de la procédure Equ(a, b)Cette procédure retourne 1 si a = b, sinon 0.
L'équivalent fonctionnel de la macro Bissex() est la procédure du même nom.(Je ne fais pas cohabiter les 2 dans le même code)
Pour palier au problème, j'ai juste inversé les membres. Mathématiquement et logiquement, les additions, multiplications et opération logiques et, ou et xor s'en foutent complètement que l'on interchange leur membres. Alors pourquoi, un changement inutile serait-il nécessaire?Voici un code assez significatif
J'ai une macro capricieuse:
Code : Tout sélectionner
Macro Bissex(x): (Equ((x % 4), 0) & ((1 - Equ((x % 100), 0) ) | Equ(((x >> 2) % 100), 0) ) ): EndMacro
Un détail qui s'ajoute : cette macro contient des appels de la procédure Equ(a, b)
Code : Tout sélectionner
Procedure.L Equ(a, b)
Protected s.L
s = 0: If a = b: s = 1: EndIf
ProcedureReturn s
EndProcedure
L'équivalent fonctionnel de la macro Bissex() est la procédure du même nom.(Je ne fais pas cohabiter les 2 dans le même code)
Code : Tout sélectionner
Procedure.L Bissex(x.L)
Protected Result.L
Result = ((1 - Equ((x % 100), 0) ) | Equ(((x >> 2) % 100), 0) ) & Equ((x % 4), 0)
ProcedureReturn Result
EndProcedure
Code : Tout sélectionner
Macro BissexBug(x): (Equ((x % 4), 0) & ((1 - Equ((x % 100), 0) ) | Equ(((x >> 2) % 100), 0) ) ): EndMacro
Macro Bissex_Ok(x): ((1 - Equ((x % 100), 0) ) | Equ(((x >> 2) % 100), 0) ) & Equ((x % 4), 0): EndMacro
Code : Tout sélectionner
Procedure.L Equ(a, b)
Protected s.L
s = 0: If a = b: s = 1: EndIf
ProcedureReturn s
EndProcedure
Macro Bissex(x): (Equ((x % 4), 0) & ((1 - Equ((x % 100), 0) ) | Equ(((x >> 2) % 100), 0) ) ): EndMacro
Macro BissexOk(x): ((1 - Equ((x % 100), 0) ) | Equ(((x >> 2) % 100), 0) ) & Equ((x % 4), 0): EndMacro
; VOICI 2 ALGOS IDENTIQUES A PEU DE CHOSE PRES MAIS...
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
i = 1900
Variable.L = 0
Variable = Bissex(i) + Variable
Debug Str(Variable) + " = " + Str(Bissex(i) )
i = 1900
Variable.L = 0
Variable = Variable + Bissex(i) ; <<<< ON INVERSE LES 2 MEMBRES ET CA BUGUE
Debug Str(Variable) + " = " + Str(Bissex(i) )