Bug avec une macro...

Archive.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Bug avec une macro...

Message par Ollivier »

Voici mon souci. Je vais essayer d'être clair pour trouver d'où vient ce problème.

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 
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)

Code : Tout sélectionner

Procedure.L Equ(a, b) 
    Protected s.L 
    s = 0: If a = b: s = 1: EndIf 
    ProcedureReturn s 
EndProcedure 
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)

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
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?

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
Voici un code assez significatif

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) )