Page 1 sur 1

Type long

Publié : dim. 05/oct./2025 22:22
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

Re: Type long

Publié : dim. 05/oct./2025 22:44
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

Re: Type long

Publié : lun. 06/oct./2025 6:20
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.

Re: Type long

Publié : lun. 06/oct./2025 19:25
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

Re: Type long

Publié : mar. 07/oct./2025 0:56
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

Re: Type long

Publié : ven. 10/oct./2025 8:26
par Fred
Ca marchait avant par chance, en x64 les retours des fonction avec #PB_Any doivent etre en .i (c'est des pointeurs).

Re: Type long

Publié : ven. 10/oct./2025 22:17
par ymerdy
OK, merci pour vos explications.