Page 1 sur 1

Solide bug dans les bytes (Hex BUG inside)

Publié : dim. 07/août/2005 16:03
par LeCyb
Voilà j'ai un buffer contenant des bytes non-signés que je reçoit d'un serveur (d'où le $FF plus loin).
Je vais chercher certains bytes ensuite je les affiche.

Alors j'ai remarqué un bug assez impressionnant et je capte vraiment plus rien.

Code : Tout sélectionner

*buffer = AllocateMemory(5)
PokeB(*Buffer,$AA)
PokeB(*Buffer + 1,$01)
PokeB(*Buffer + 2,$C0)
PokeB(*Buffer + 3,$02)
PokeB(*Buffer + 4,$99)

Debug Hex($FF & PeekB(*Buffer))
Debug Hex($FF & PeekB(*Buffer + 1))
Debug Hex($FF & PeekB(*Buffer + 2))
Debug Hex($FF & PeekB(*Buffer + 3))

var1 = PeekB(*Buffer)
var1 & $FF

var2 = $FF & PeekB(*Buffer + 1)

var3.b = PeekB(*Buffer + 2)
var3 & $FF

var4.b = $FF & PeekB(*Buffer + 3)

Debug Hex(var1)
Debug Hex(var2)
Debug Hex(var3)
Debug Hex(var4)

FreeMemory(*Buffer)
Alors pourquoi quand on précise une variable en tant que byte elle affiche un long alors que si on ne précise rien elle nous donne bien un byte ?

Moi j'essaye au maximum de suivre la doc qui précise bien ".b" pour un byte, alors est-ce moi qui faute ou bien est-ce un (fameux) bug ?

Publié : dim. 07/août/2005 16:53
par Dr. Dri
c'est peut être Hex() qui bug...

Code : Tout sélectionner

*buffer = AllocateMemory(5)
PokeB(*Buffer,$AA)
PokeB(*Buffer + 1,$01)
PokeB(*Buffer + 2,$C0)
PokeB(*Buffer + 3,$99)

Debug Hex($FF & PeekB(*Buffer))
Debug Hex($FF & PeekB(*Buffer + 1))
Debug Hex($FF & PeekB(*Buffer + 2))
Debug Hex($FF & PeekB(*Buffer + 3))

Debug "---------------"

var1 = PeekB(*Buffer)
var1 & $FF

var2 = $FF & PeekB(*Buffer + 1)

var3.b = PeekB(*Buffer + 2)
var3 & $FF

var4.b = $FF & PeekB(*Buffer + 3)

Debug Hex(var1)
Debug Hex(var2)
Debug Hex(var3)
Debug Hex(var4)

Debug "---------------"

Debug var1
Debug var2
Debug var3
Debug var4

FreeMemory(*Buffer)
Dri

Publié : lun. 08/août/2005 20:49
par LeCyb
Bien vu ça.

Donc si je comprends bien Hex ne supporte pas les valeurs négatives ou non-signées.

Est-ce que le bug existe toujours dans la version 3.94 ?

Si oui, comment je peux corriger le tir plus proprement qu'en oubliant de préciser le type ?

Publié : lun. 08/août/2005 21:17
par Dr. Dri
Ma modif de ton code c'est sur la version 3.94 beta 4 alors le probleme est toujours d'actualité... Pour le moment ce que tu peux faire c'est te coder une fonction Hex() maison pour être sûr de ne pas avoir de problème...
Si tu mle demande jpeux te le faire ;)

Dri

Publié : lun. 08/août/2005 21:52
par Dr. Dri
Je viens de cerner le problème... En PB tout est signé, et la fonction Hex() renvoi une chaîne non signée. Le passage de byte pose donc problème pour la raison que voici :

Code : Tout sélectionner

b.b = $FF
l.l = b

Debug b
Debug l
;à ton avis ca donne quoi -1 pour un long ?
Dri ;)

Publié : lun. 08/août/2005 21:58
par Dr. Dri
Voila une rustine... Une structure de conversion de Byte en Long, sans tenir compte du signe... On peut faire la même chose entre un word et un long et entre un byte et un word...

Code : Tout sélectionner

Structure Ub2Ul
  StructureUnion
    Ub.b
    Ul.l
  EndStructureUnion
EndStructure

nombre.Ub2Ul

For i = $00 To $FF
  nombre\Ub = i
  Debug Hex(nombre\Ul)
Next i
Là il est clair que PB doit inclure des nombres non-signés de facon native parce que là ca complique pas mal de choses... PB4 peut-être ? Fred ?

Dri

Publié : lun. 08/août/2005 22:38
par Dr. Dri
Je viens aussi de me rapeller de l'astuce de Fred vis à vis de ce problème...

Code : Tout sélectionner

For i = 0 To 255
  b.b = i
  Debug Hex(b & $FF)
Next i
Dri

Publié : lun. 08/août/2005 22:50
par LeCyb
Je serais pas contre une petite fonction Hex2() :D

Mais bon pour le moment je me contenterai de mettre mes bytes dans des longs sinon je vais griller tous les neurones de Dri (private joke).

Publié : lun. 08/août/2005 22:52
par Dr. Dri
n'empêche que c'est quand mes neuronnes ont lâché ke je me suis souvenu de la solution de Fred à savoir la plus simple...

Dri