OVH Cloud OVH Cloud

CLng et valeur numérique élevée ...

10 réponses
Avatar
scraper
bonsoir à tous !

un petit problème avec une valeur de Registre ...

voila, je veux lire une valeur DWord qui est : 0xFFFFFFFF (4294967295)

pour cela, je récupère la valeur numérique, et je la stocke dans un fichier
... pas de problème!
si ensuite, je lis cette valeur, depuis le fichier, et que j'essaie de
réinscrire cette valeur au Registre, en la convertissant avec
CLng(4294967295), j'obtiens un supèrebe dépassement de capacité ....

où est ce que je merdouille ??

merci de votre aide



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper

10 réponses

Avatar
Loïc
J'ai Exactement le même problème pour utiliser cette valeur avec l'api
gdiplus!! Je suis aussi intéressé par la soluce...

--
Loïc
Avatar
Patrice Henrio
Au hasard et sasn vérif (j'ai pas le temps ce soir), les Clng ne seraitent
pas signés par hasard et donc xFFFF..FFF vaudrait -1 ?
(J'insiste, je n'ai pas vérifié)

"Loïc" a écrit dans le message de news:

J'ai Exactement le même problème pour utiliser cette valeur avec l'api
gdiplus!! Je suis aussi intéressé par la soluce...

--
Loïc



Avatar
Patrice Henrio
Je viens de vérifier c'est bien le cas
Long = entier entre -2 147 483 648 et 2 147 483 647
(Cf MSDN)

"Patrice Henrio" a écrit dans le message de
news: uf%
Au hasard et sasn vérif (j'ai pas le temps ce soir), les Clng ne seraitent
pas signés par hasard et donc xFFFF..FFF vaudrait -1 ?
(J'insiste, je n'ai pas vérifié)

"Loïc" a écrit dans le message de news:

J'ai Exactement le même problème pour utiliser cette valeur avec l'api
gdiplus!! Je suis aussi intéressé par la soluce...

--
Loïc







Avatar
Patrice Henrio
Donc pour ré-obtenir 0xFFFFFFFF, il faut écrire Clng(-1)

"Patrice Henrio" a écrit dans le message de
news: uf%
Au hasard et sasn vérif (j'ai pas le temps ce soir), les Clng ne seraitent
pas signés par hasard et donc xFFFF..FFF vaudrait -1 ?
(J'insiste, je n'ai pas vérifié)

"Loïc" a écrit dans le message de news:

J'ai Exactement le même problème pour utiliser cette valeur avec l'api
gdiplus!! Je suis aussi intéressé par la soluce...

--
Loïc







Avatar
scraper
Bonjour Patrice Henrio
(dans news:%)
tu nous disais :

Donc pour ré-obtenir 0xFFFFFFFF, il faut écrire Clng(-1)



hello :-)

bon, j'ai pas tout compris ... :-(

Ok, si je veux obtenir 0xFFFFFF, je fais Clng(-1) ...

mais si j'ai une valeur 4294967295, pourquoi Clng(4294967295) me donne une
erreur de dépassement ??

comment savoir si d'autres valeurs ne provoqueront pas la même erreur ??

merci




--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
François Picalausa
Hello,

Il existe deux "familles" de variables: celles signées et celles non
signées.
En VB tu n'as pas le choix de la famille a adopter. Le type Byte est non
signé (0 à 255), Integer est signé (-32768 à 32767) tout comme Long et
généralement tous les types de VB
Signé signifie qu'il y a un signe (+ ou -) au nombre. Cela signifie que le
premier bit des x octets (où x=4 pour un Long) indique si le nombre est
positif ou négatif, plutôt que d'ajouter sa "valeur" au nombre.

Le registre emploie un DWORD non signé (donc de 0 à beaucoup)
Toi tu as a disposition en VB un type signé (de -beaucoup/2 à +beaucoup/2)
Tu peux employer une fonction comme celle ci pour effectuer la convertion:
Private Function UDW2SDW(Value As Double) As Long
If Value > 2147483647 Then
'négatif
UDW2SDW = (Value - 4294967296#)
Else
'positif
UDW2SDW = Value
End If
End Function

MsgBox UDW2SDW(4294967295#) 'Affiche -1

--
François Picalausa

"scraper" a écrit dans le message de news:

Bonjour Patrice Henrio
(dans news:%)
tu nous disais :

Donc pour ré-obtenir 0xFFFFFFFF, il faut écrire Clng(-1)



hello :-)

bon, j'ai pas tout compris ... :-(

Ok, si je veux obtenir 0xFFFFFF, je fais Clng(-1) ...

mais si j'ai une valeur 4294967295, pourquoi Clng(4294967295) me
donne une erreur de dépassement ??

comment savoir si d'autres valeurs ne provoqueront pas la même erreur
??

merci


Avatar
Jean-Marc
"scraper" a écrit dans le message de
news:
Bonjour Patrice Henrio
(dans news:%)
tu nous disais :

> Donc pour ré-obtenir 0xFFFFFFFF, il faut écrire Clng(-1)

hello :-)

bon, j'ai pas tout compris ... :-(

Ok, si je veux obtenir 0xFFFFFF, je fais Clng(-1) ...

mais si j'ai une valeur 4294967295, pourquoi Clng(4294967295) me donne une
erreur de dépassement ??

comment savoir si d'autres valeurs ne provoqueront pas la même erreur ??



Hello,

----
Long data type
A 4-byte integer ranging in value from -2,147,483,648 to 2,147,483,647.
----

Il te suffit de regarder dans l'aide la description de chauque type de
données de VB. Ca se trouve soit dans ton aide en ligne, soit ici:

http://msdn.microsoft.com/library/en-us/vbenlr98/html/vagrpDataType.asp


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
scraper
Bonjour François Picalausa
(dans news:)
tu nous disais :

Hello,

Il existe deux "familles" de variables: celles signées et celles non
signées.
En VB tu n'as pas le choix de la famille a adopter. Le type Byte est
non signé (0 à 255), Integer est signé (-32768 à 32767) tout comme
Long et généralement tous les types de VB
Signé signifie qu'il y a un signe (+ ou -) au nombre. Cela signifie
que le premier bit des x octets (où x=4 pour un Long) indique si le
nombre est positif ou négatif, plutôt que d'ajouter sa "valeur" au
nombre.



d'acc, je comprends mieux .... enfin, je crois !

Le registre emploie un DWORD non signé (donc de 0 à beaucoup)
Toi tu as a disposition en VB un type signé (de -beaucoup/2 à
+beaucoup/2) Tu peux employer une fonction comme celle ci pour
effectuer la convertion: Private Function UDW2SDW(Value As Double) As
Long If Value > 2147483647 Then
'négatif
UDW2SDW = (Value - 4294967296#)
Else
'positif
UDW2SDW = Value
End If
End Function

MsgBox UDW2SDW(4294967295#) 'Affiche -1



OK ... mais j'ai pas besoin d'une fonction spécifique ... je fais appel déjà
à une fonction qui lit la valeur dans le fichier que j'ai sauvegardé, et la
convertit en Long pour écrire une valeur DWord au Registre

donc, si je fais If Value > 2147483647 Then Value = Value - 4294967296#
NewValue=Lng(Value)
etc ....

c'est correct ??

euh .... la fonction, évidemment, c'est pas moi qui l'éai écrite, je me sers
d'un module pour lire et écrire dans le Registre ... :-)

si je fais la manip' come indiqué ci dessus, j'ai plus de message d'erreur,
et en réécrivant NewValue dans le registre, j'obtiens bien en effet une
valeur DWord "0xFFFFFF" comme je le souhaite ...

c'est juste pour avoir l'assurance que c'est correct ?

merci en tout cas pour cette explication claire et détaillée :-)



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
scraper
Bonjour Jean-Marc
(dans news:41835bb0$0$7091$)
tu nous disais :

Hello,

----
Long data type
A 4-byte integer ranging in value from -2,147,483,648 to
2,147,483,647. ----

Il te suffit de regarder dans l'aide la description de chauque type de
données de VB. Ca se trouve soit dans ton aide en ligne, soit ici:

http://msdn.microsoft.com/library/en-us/vbenlr98/html/vagrpDataType.asp




ah, OK .... à la lumière de ce que tu me dis, et des explications de
François, je viens juste de capter que la valeur que j'essaie de réinscrire
au registre est en effet > à la capacité d'un Long ...
je m'en étais pas rendu compte :-(

merci :-)

(par contre, je n'aurais pas su quand même comment faire ;-)

merci à vous deux

--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
Patrice Henrio
En fait un type numérique, comme je le disais il n'y a pas si longtemps
c'est un nombre d'octets pour mettre les informations et un système de
codage de ces informations.
Un byte c'est huit bits donc ça sert normalement à stocker des nombres entre
0 et 255 (256 valeurs, unsigned char en C++) mais ça peut être considéré
comme signé entre -128 et 127 (toujours 256 valeurs, char en C++).
On voit bien qu'il sera nécessaire au programme de savoir quel type est
utilisé pour comprendre si FF (11111111) est compris entre 0 et 255 (ici
255) ou entre 127 et -128 (ici -1).
Pour le svaleurs signés on parle de complément à 2, mais il y a un efaçon
plus simple de l'expliquer à mon avis :
1111 1111 + 0000 0001 sur huit bits donne 0000 0000 (la retenue est perdue)
donc 1111 1111 est l'opposé de 1 dans ce système, donc -1.
Evidemment c'est la même chose en long int (ou autre).
Salut.




"scraper" a écrit dans le message de news:

Bonjour Jean-Marc
(dans news:41835bb0$0$7091$)
tu nous disais :

Hello,

----
Long data type
A 4-byte integer ranging in value from -2,147,483,648 to
2,147,483,647. ----

Il te suffit de regarder dans l'aide la description de chauque type de
données de VB. Ca se trouve soit dans ton aide en ligne, soit ici:

http://msdn.microsoft.com/library/en-us/vbenlr98/html/vagrpDataType.asp




ah, OK .... à la lumière de ce que tu me dis, et des explications de
François, je viens juste de capter que la valeur que j'essaie de
réinscrire
au registre est en effet > à la capacité d'un Long ...
je m'en étais pas rendu compte :-(

merci :-)

(par contre, je n'aurais pas su quand même comment faire ;-)

merci à vous deux

--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper