Page 1 sur 1

Créer un Quad avec deux Long

Publié : dim. 13/juin/2010 20:21
par Guimauve
Bonjour à tous,

Voilà j'essais de créer un entier de type quad avec deux entier de type long mais ça ne fonctionne pas et je ne comprend pas pourquoi.

Voici le code en question :

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Fusion et Extraction des parties d'un Quad

Macro MakeQuad(HiLong, LoLong)
  
  (HiLong << 32 | LoLong)
  
EndMacro

Macro ExtractQuadHiLong(Quad)
  
  ((Quad >> 32) & $FFFFFFFF)
  
EndMacro

Macro ExtractQuadLoLong(Quad)
  
  (Quad & $FFFFFFFF)
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Fusion et Extraction des parties d'un Long

Macro MakeLong(HiWord, LoWord)
  
  (HiWord << 16 | LoWord)
  
EndMacro

Macro ExtractLongHiWord(Long)
  
  ((Long >> 16) & $FFFF)
  
EndMacro

Macro ExtractLongLoWord(Long)
  
  (Long & $FFFF)
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< !!! ATTENTION - CODE D'ESSAI !!! <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

HiWord.w = 12345
LoWord.w = 23456
HiLong.l = HiWord
LoLong.l = LoWord

Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Original value"
Debug ""
Debug HiWord
Debug LoWord
Debug ""
Debug HiLong
Debug LoLong

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; MakeLong() Test"
Debug ""

NewLong.l = MakeLong(HiWord, LoWord)
Debug NewLong
Debug ExtractLongHiWord(NewLong)
Debug ExtractLongLoWord(NewLong)

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; MakeQuad() Test"
Debug ""

NewQuad.q = MakeQuad(HiLong, LoLong)
Debug NewQuad
Debug ExtractQuadHiLong(NewQuad)
Debug ExtractQuadLoLong(NewQuad)

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
Et voici ce que le débogeur affiche :
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Original value

12345
23456

12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeLong() Test

809065376
12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeQuad() Test

23456
0
23456
Comme on peut le voir le MakeLong() fonctionne mais pas le MakeQuad(). Si quelqu'un peut me dire pourquoi parce que là je ne vois pas comment corriger la situation.

Merci à l'avance.

[Edit] J'ai oublié de mentionner que je suis sous Linux Ubuntu 10.04 x64 avec PB x64.[/Edit]

A+
Guimauve

Re: Créer un Quad avec deux Long

Publié : dim. 13/juin/2010 21:29
par nico
Fonctionne sur XP avec PB 4.41

Re: Créer un Quad avec deux Long

Publié : dim. 13/juin/2010 21:34
par SPH
PB4.50 beta 3 sous vista 32 :
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Original value

12345
23456

12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeLong() Test

809065376
12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeQuad() Test

53021371292576
12345
23456

Re: Créer un Quad avec deux Long

Publié : dim. 13/juin/2010 21:38
par G-Rom
même os que toi , mis à part en x86
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Original value

12345
23456

12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeLong() Test

809065376
12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeQuad() Test

53021371292576
12345
23456

Re: Créer un Quad avec deux Long

Publié : dim. 13/juin/2010 22:31
par Guimauve
Bon et bien c'est probablement un bogue dans la version x64.

Merci à tous pour votre aide.

A+
Guimauve

Re: Créer un Quad avec deux Long

Publié : lun. 14/juin/2010 5:47
par venom
Seven x64 et purebasic 4.50 x64 :
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Original value

12345
23456

12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeLong() Test

809065376
12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeQuad() Test

23456
0
23456





@++

Re: Créer un Quad avec deux Long

Publié : lun. 14/juin/2010 7:34
par Le Soldat Inconnu
c'est juste une idée mais tes loLong et Hilong de ta macro sont défini en Quad en x64 car tu ne précise pas le type.

Alors essaie de préciser les types sur toutes tes variables

Re: Créer un Quad avec deux Long

Publié : lun. 14/juin/2010 9:59
par Backup
Le Soldat Inconnu a écrit :Alors essaie de préciser les types sur toutes tes variables
je n'ai pas répondu, car des la première lecture, ça m'a sauté aux yeux :)

je me suis dis, "lorsqu'il sera réveille , il le verra tous seul.."

Re: Créer un Quad avec deux Long

Publié : lun. 14/juin/2010 13:11
par Guimauve
Bonjour à tous

Voici un nouveau code qui montre bien le problème.

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Fusion et Extraction des parties d'un Quad

Procedure.q MakeQuad(HiLong.l, LoLong.l)
	
	ProcedureReturn (HiLong << 32 | LoLong)
	
EndProcedure

Procedure.l ExtractQuadHiLong(Quad.q)
	
ProcedureReturn ((Quad >> 32) & $FFFFFFFF)
	
EndProcedure

Procedure.l ExtractQuadLoLong(Quad.q)
	
	ProcedureReturn (Quad & $FFFFFFFF)
	
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Fusion et Extraction des parties d'un Long

Macro MakeLong(HiWord, LoWord)
	
	(HiWord << 16 | LoWord)
	
EndMacro

Macro ExtractLongHiWord(Long)
	
	((Long >> 16) & $FFFF)
	
EndMacro

Macro ExtractLongLoWord(Long)
	
	(Long & $FFFF)
	
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< !!! ATTENTION - CODE D'ESSAI !!! <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

HiWord.w = 12345
LoWord.w = 23456
HiLong.l = HiWord
LoLong.l = LoWord

Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Original value"
Debug ""
Debug HiWord
Debug LoWord
Debug ""
Debug HiLong
Debug LoLong

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; MakeLong() Test"
Debug ""

NewLong.l = MakeLong(HiWord, LoWord)
Debug NewLong
Debug ExtractLongHiWord(NewLong)
Debug ExtractLongLoWord(NewLong)

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; MakeQuad() Test"
Debug ""

NewQuad.q = MakeQuad(HiLong, LoLong)
Debug NewQuad
Debug ExtractQuadHiLong(NewQuad)
Debug ExtractQuadLoLong(NewQuad)

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
A+
Guimauve

Re: Créer un Quad avec deux Long

Publié : lun. 14/juin/2010 13:32
par SPH
Ton new code sous vista 32 et PB 4.50 beta 3 :
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Original value

12345
23456

12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeLong() Test

809065376
12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeQuad() Test

53021371292576
12345
23456

Re: Créer un Quad avec deux Long

Publié : lun. 14/juin/2010 16:56
par venom
le resultat windows 7 x64 purebasic 4.50 x64:
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Original value

12345
23456

12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeLong() Test

809065376
12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeQuad() Test

23456
0
23456





@++

Re: Créer un Quad avec deux Long

Publié : mar. 15/juin/2010 1:04
par Guimauve
Bonjour à tous,

Voilà j'ai trouvé un moyen de contourner le le bogue. Voir le code suivant :

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Fusion et Extraction des parties d'un Quad

Macro MakeQuad(HiLong, LoLong)
  
  ; (HiLong << 32 | LoLong) ; C'est l'opérateur "|" qui génère le bogue.
  ((HiLong << 32) + LoLong) ; De cette manière cela fonctionne correctement
  
EndMacro

Macro ExtractQuadHiLong(Quad)
	
	((Quad >> 32) & $FFFFFFFF)
	
EndMacro

Macro ExtractQuadLoLong(Quad)
	
	(Quad & $FFFFFFFF)
	
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Fusion et Extraction des parties d'un Long

Macro MakeLong(HiWord, LoWord)
	
	(HiWord << 16 | LoWord)
	
EndMacro

Macro ExtractLongHiWord(Long)
	
	((Long >> 16) & $FFFF)
	
EndMacro

Macro ExtractLongLoWord(Long)
	
	(Long & $FFFF)
	
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< !!! ATTENTION - CODE D'ESSAI !!! <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

HiWord.w = 12345
LoWord.w = 23456
HiLong.l = HiWord
LoLong.l = LoWord

Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Original value"
Debug ""
Debug HiWord
Debug LoWord
Debug ""
Debug HiLong
Debug LoLong

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; MakeLong() Test"
Debug ""

NewLong.l = MakeLong(HiWord, LoWord)
Debug NewLong
Debug ExtractLongHiWord(NewLong)
Debug ExtractLongLoWord(NewLong)

Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; MakeQuad() Test"
Debug ""

NewQuad.q = MakeQuad(HiLong, LoLong)
Debug NewQuad
Debug ExtractQuadHiLong(NewQuad)
Debug ExtractQuadLoLong(NewQuad)

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Original value

12345
23456

12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeLong() Test

809065376
12345
23456

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; MakeQuad() Test

53021371292576
12345
23456
A+
Guimauve

Re: Créer un Quad avec deux Long

Publié : mar. 15/juin/2010 5:29
par venom
:) oui ça fonctionne aussi chez moi.




@++