Type long

Sujets variés concernant le développement en PureBasic
ymerdy
Messages : 23
Inscription : jeu. 19/oct./2017 22:10

Type long

Message par ymerdy »

Bonjour,

j'obtiens une erreur en V6.21 ou 6.20 avec le code suivant, alors que ça marchait sans probleme en 6.03
(pas testé toutes les versions intermédiaires).
(NB: Ce code sert juste à illustrer le probleme...)
Avec la variable imgnum déclarée en tant que Long, la ligne avec ImageGadget(...) renvoie une erreur "Le #Image spécifié n'est pas initialisé"

Si imgnum n'est pas déclaré, ou déclaré mais sans extension de type, ça marche.
Qu'est-ce qui a changé entre la 6.03 et la 6.20 qui explique ce problème?
Je suppose que ImageID(#Image) devait accepter un argument sur 4 octets (casté en 8?), et ça ne passe plus?
Mais je n'ai rien vu dans le changelog des differentes versions qui corresponde à ça.

Code : Tout sélectionner

UsePNGImageDecoder()

Global imgnum.l ; KO
;Global imgnum ; OK

Procedure LoadProc()
  imgnum = LoadImage(#PB_Any, #PB_Compiler_Home + "Examples\Sources\Data\GeeBee2.bmp") ; Charge l'image depuis un fichier
  ImageGadget(#PB_Any, 0, 0, 128, 128, ImageID(imgnum)) ; Affichage
 EndProcedure

;----------------- exemple d'utilisation -----------------

If OpenWindow(0, 200, 200, 400, 120, "Exemple", #PB_Window_SystemMenu)
  LoadProc()
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Avatar de l’utilisateur
Ar-S
Messages : 9543
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Type long

Message par Ar-S »

Salut.

imgnum.i pas .l sur du x64 sinon il reste en 4octets.
Long .l 4 octets -2147483648 à +2147483647
Integer .i 4 octets (avec compilateur 32-bit) -2147483648 à +2147483647
Integer .i 8 octets (avec compilateur 64-bit) -9223372036854775808 à +9223372036854775807
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
ymerdy
Messages : 23
Inscription : jeu. 19/oct./2017 22:10

Re: Type long

Message par ymerdy »

Affirm, c'est bien le type Long .l, sur 4 octets, qui pose problème en 6.20, alors que ça passait en 6.03.
ymerdy
Messages : 23
Inscription : jeu. 19/oct./2017 22:10

Re: Type long

Message par ymerdy »

J'ai simplifié le code pour montrer le probleme,( inutile de passer par un appel de fonction...)

C'est l'utilisation d'un integer Long qui ne marche plus, alors que cela marchait jusqu'à la 6.03 au moins.

Code : Tout sélectionner

If OpenWindow(0, 200, 200, 400, 120, "Exemple", #PB_Window_SystemMenu)
  imgnum.l = LoadImage(#PB_Any, #PB_Compiler_Home + "Examples\Sources\Data\GeeBee2.bmp")
  ImageGadget(#PB_Any, 0, 0, 128, 128, ImageID(imgnum))
 Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Avatar de l’utilisateur
case
Messages : 1547
Inscription : lun. 10/sept./2007 11:13

Re: Type long

Message par case »

salut c'est du au fait que la valeur retournée dans imgnum est un entier sur 64bit et est donc tronquée dans un .l de 32 bit si sa valeur est supérieure a $ffffffff essaie peut-être d'utiliser la version 32bit de pure basic si tu tiens vraiment a continuer d'utiliser un.l sur un processeur 64bit. ce n'est pas un bug ou alors un bug sur la generation des nombres de #pb_any.

Code : Tout sélectionner

If OpenWindow(0, 200, 200, 400, 120, "Exemple", #PB_Window_SystemMenu)
  imgnum.i = LoadImage(#PB_Any, #PB_Compiler_Home + "Examples\Sources\Data\GeeBee2.bmp")
debug imgnum
debug $ffffffff ; valeur max en dans un long

  ImageGadget(#PB_Any, 0, 0, 128, 128, ImageID(imgnum))
 Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
ImageImage
Fred
Site Admin
Messages : 2847
Inscription : mer. 21/janv./2004 11:03

Re: Type long

Message par Fred »

Ca marchait avant par chance, en x64 les retours des fonction avec #PB_Any doivent etre en .i (c'est des pointeurs).
ymerdy
Messages : 23
Inscription : jeu. 19/oct./2017 22:10

Re: Type long

Message par ymerdy »

OK, merci pour vos explications.
Répondre