OVH Cloud OVH Cloud

Erreur n° 6 d'overflow ... au secours

5 réponses
Avatar
Laurent
Bonjour =E0 tous,

J'ai un petit souci avec un petit d=E9veloppement vb


...

Dim vTest1 as variant

vTest1 =3D 58/(60*60*24)

...


Et l=E0 =E7a coince. En revanche, si j'effectue 58/86400, tout=20
se passe bien. Y'a-t-il une bonne =E2me pour m'expliquer ce=20
qui ne va pas, car l=E0 je dois avouer, je s=E8che.

Merci de votre pr=E9cieuse aide et d'ores et d=E9j=E0 bon week-
end.

Laurent

5 réponses

Avatar
ng
Salut,

En passant par du Currency :

Dim vTest1 As Variant
vTest1 = 58 / (60@ * 60@ * 24@)
Debug.Print vTest1

Mais il est préférable de typer ta variable :

Dim lTest1 As Long
lTest1 = 58 / (60@ * 60@ * 24@)
Debug.Print lTest1


--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/



Laurent a écrit :

Bonjour à tous,

J'ai un petit souci avec un petit développement vb


...

Dim vTest1 as variant

vTest1 = 58/(60*60*24)

...


Et là ça coince. En revanche, si j'effectue 58/86400, tout
se passe bien. Y'a-t-il une bonne âme pour m'expliquer ce
qui ne va pas, car là je dois avouer, je sèche.

Merci de votre précieuse aide et d'ores et déjà bon week-
end.

Laurent


Avatar
Patrice Henrio
Je propose mon explication pour savoir si elle est "juste"
Lorsque l'on ne type pas une variable VB va essayer de la typer au mieux :
dans notre cas 58/86400
86400 est un single car > à 32767 et le résultat 58/86400 est bien single
par contre 58/60*60*24 va peut-être être considéré comme un integer et
dépasser la capacité (60*60*24 supérieur à 32767).


"ng" a écrit dans le message de
news:%
Salut,

En passant par du Currency :

Dim vTest1 As Variant
vTest1 = 58 / (60@ * 60@ * 24@)
Debug.Print vTest1

Mais il est préférable de typer ta variable :

Dim lTest1 As Long
lTest1 = 58 / (60@ * 60@ * 24@)
Debug.Print lTest1


--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/



Laurent a écrit :

> Bonjour à tous,
>
> J'ai un petit souci avec un petit développement vb
>
>
> ...
>
> Dim vTest1 as variant
>
> vTest1 = 58/(60*60*24)
>
> ...
>
>
> Et là ça coince. En revanche, si j'effectue 58/86400, tout
> se passe bien. Y'a-t-il une bonne âme pour m'expliquer ce
> qui ne va pas, car là je dois avouer, je sèche.
>
> Merci de votre précieuse aide et d'ores et déjà bon week-
> end.
>
> Laurent




Avatar
Patrice Henrio
Je viens de vérifier, c'est bien ce que je disais
Sur une forme vide j'utilise le code suivant
Private Sub Form_Load()
Dim V1 As Variant, V2 As Variant, V3 As Variant
V1 = 35 * 1000
V2 = 256 * 127
V3 = 35000
End Sub
Tel quel j'ai un overflow sur V1, si je mets V1 en commentaire, tout passe.
La limite est autour de 256*128 (2^15)
"Patrice Henrio" a écrit dans le
message de news:
Je propose mon explication pour savoir si elle est "juste"
Lorsque l'on ne type pas une variable VB va essayer de la typer au mieux :
dans notre cas 58/86400
86400 est un single car > à 32767 et le résultat 58/86400 est bien single
par contre 58/60*60*24 va peut-être être considéré comme un integer et
dépasser la capacité (60*60*24 supérieur à 32767).


"ng" a écrit dans le message de
news:%
> Salut,
>
> En passant par du Currency :
>
> Dim vTest1 As Variant
> vTest1 = 58 / (60@ * 60@ * 24@)
> Debug.Print vTest1
>
> Mais il est préférable de typer ta variable :
>
> Dim lTest1 As Long
> lTest1 = 58 / (60@ * 60@ * 24@)
> Debug.Print lTest1
>
>
> --
> Nicolas G.
> FAQ VB : http://faq.vb.free.fr
> API Guide : http://www.allapi.net
> Google Groups : http://groups.google.fr/
> MZ-Tools : http://www.mztools.com/
> http://apisvb.europe.webmatrixhosting.net/
>
>
>
> Laurent a écrit :
>
> > Bonjour à tous,
> >
> > J'ai un petit souci avec un petit développement vb
> >
> >
> > ...
> >
> > Dim vTest1 as variant
> >
> > vTest1 = 58/(60*60*24)
> >
> > ...
> >
> >
> > Et là ça coince. En revanche, si j'effectue 58/86400, tout
> > se passe bien. Y'a-t-il une bonne âme pour m'expliquer ce
> > qui ne va pas, car là je dois avouer, je sèche.
> >
> > Merci de votre précieuse aide et d'ores et déjà bon week-
> > end.
> >
> > Laurent
>
>




Avatar
Zoury
Salut à tous! :O)

Patrice :
Juste te rappeler que tu peux utiliser Typename() pour connaitre le
sous-type de la variable Variant.

Tous le monde :
J'aimerais ajouter un peu d'information à ce que Patrice vient de nous
démontrer..
Dans le cas V1, VB traite les deux nombres de l'équation comme étant de
type Integer étant donnée que ces deux nombres peuvent être représenter par
un type Integer et que c'est le type par défaut pour un nombre. Toutefois le
résultat de la multiplication de ces deux nombres dépasse la capacité d'un
Integer (overflow). VB se dit J'ai deux Integer dans l'équation je vais donc
tenter de mettre ça dans un Integer!

Il suffirait donc de typer ou de convertir l'un des 2 nombres en Long pour
éviter le dépassement de capacité comme ceci :
'***
Option Explicit

Private Sub Form_Load()

Dim V1 As Variant
Dim V2 As Variant
Dim V3 As Variant

' V1 = 35 * 1000 'overflow
V1 = 35 * 1000& ' pas d'overflow car 1000 est un Long

V2 = 256 * 127
V3 = 35000

Debug.Print TypeName(V1) ' Long
Debug.Print TypeName(V2) ' Integer
Debug.Print TypeName(V3) ' Long

End Sub
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Patrice Henrio
merci, j'avais oublié typename qui est plus parlant effectivement.

"Zoury" a écrit dans le message de
news:
Salut à tous! :O)

Patrice :
Juste te rappeler que tu peux utiliser Typename() pour connaitre le
sous-type de la variable Variant.

Tous le monde :
J'aimerais ajouter un peu d'information à ce que Patrice vient de nous
démontrer..
Dans le cas V1, VB traite les deux nombres de l'équation comme étant


de
type Integer étant donnée que ces deux nombres peuvent être représenter


par
un type Integer et que c'est le type par défaut pour un nombre. Toutefois


le
résultat de la multiplication de ces deux nombres dépasse la capacité d'un
Integer (overflow). VB se dit J'ai deux Integer dans l'équation je vais


donc
tenter de mettre ça dans un Integer!

Il suffirait donc de typer ou de convertir l'un des 2 nombres en Long pour
éviter le dépassement de capacité comme ceci :
'***
Option Explicit

Private Sub Form_Load()

Dim V1 As Variant
Dim V2 As Variant
Dim V3 As Variant

' V1 = 35 * 1000 'overflow
V1 = 35 * 1000& ' pas d'overflow car 1000 est un Long

V2 = 256 * 127
V3 = 35000

Debug.Print TypeName(V1) ' Long
Debug.Print TypeName(V2) ' Integer
Debug.Print TypeName(V3) ' Long

End Sub
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/