IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

problème d'overflow avec variable type double


Sujet :

VB 6 et antérieur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 23
    Points
    23
    Par défaut problème d'overflow avec variable type double
    bonjour,
    lorsque je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim ip_decimale As Double
    ip_decimale = (172 * 16777216 + 140 * 65536 + 32 * 256 + 10)
    je reçois un message d'erreur parlant d'overflow, par contre si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ip_decimale = 2894864394
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ip_decimale = (172# * 16777216# + 140# * 65536# + 32# * 256# + 10#)
    là pas de problème. pouvez vous m'éclairer ? surtout sur le rôle de ce "#"
    merci !

  2. #2
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Pourquoi définir un Double pour ne travailler qu'en Integer?

    Le type Long conviendrait parfaitement pour ce que tu veux faire puisqu'il est codé sur 32 bits.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    qu'appelez vous "travailler en integer" ? je n'ai défini qu'une seule variable et c'est un double.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    au fait, j'ai besoin d'une zone de 32 bits non signée pour y mettre une adresse ip

  5. #5
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 092
    Points : 16 606
    Points
    16 606
    Par défaut
    Double
    (à virgule flottante en double précision) 8 octets -1,79769313486232E308 à
    -4,94065645841247E-324 pour les valeurs négatives ; 4,94065645841247E-324 à 1,79769313486232E308 pour les valeurs positives
    Le caractère de déclaration de type Double est le signe #.

    Variant
    (nombres) 16 octets Toute valeur numérique, avec la même plage de valeurs qu'une donnée de type Double


    Le fait de préciser ce signe # dans la suite des calculs, oblige à travailler pour chaques chiffres en 8 Octets, sinon le travail ce fait sous Variant sur 16 Octets

    overflow = débordement, depassement de capacité mémoire

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    merci

    je viens de vérifier, pour le type long les valeurs vont de -2,147,483,648 à2,147,483,647, je ne peux donc pas l'utiliser car je dois pouvoir aller plus haut, dans les 4 milliards pour un masque reseau 255.255.255.0 par exemple

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Juste...

    Mea culpa.

    J'en étais justement arrivé à la même conclusion. J'avais oublié le "non signé".

    Après test, il semble qu'il suffise de forcer le type double pour le premier nombre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    172# * 16777216 + 140 * 65536 + 32 * 256 + 10

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    ha d'accord, mais c'est ... troublant lol. merci !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    c'est encore moi !

    autre probleme du meme style, ce code génère une erreur toujours d'overflow:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Dim source_ip, mask, net_adr As Double
        source_ip = 2894864394#
        mask = 4294967040#
        net_adr = source_ip And mask
        MsgBox net_adr
    tandis que celui ci affiche bien 8 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Dim source_ip, mask, net_adr As Double
        source_ip = 10
        mask = 8
        net_adr = source_ip And mask
        MsgBox net_adr
    1010
    1000
    ----- AND
    1000 -> 8

    mais je ne comprends pas pourquoi il ne veut pas faire ceci :

    10101100100011000010000000001010
    11111111111111111111111100000000
    ------------------------------------- AND
    10101100100011000010000000000000 -> 2894864384

    please help me

  10. #10
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 092
    Points : 16 606
    Points
    16 606
    Par défaut
    Pour infos
    Source MSDN
    Soyez prudent lorsque vous déclarez plusieurs variables. Si vous n'utilisez pas la clause As type, elle seront déclarées comme des variables de type Variant. Par exemple, dans le code suivant, X et Y sont des variables de type Variant :

    Dim X, Y, Z As Long

    Si vous réécrivez le code comme suit, ces trois variables sont de type Long :

    Dim X As Long, Y As Long, Z As Long
    Dim source_ip, mask, net_adr As Double
    donc source_ip et mask sont Variant, seul net_adr est Double
    Un Variant prend deux fois plus de mémoire que Double
    net_adr = source_ip(Variant) And mask(Variant)
    ceci explique peut être cela

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par ProgElecT
    Pour infos
    Source MSDN


    Dim source_ip, mask, net_adr As Double
    donc source_ip et mask sont Variant, seul net_adr est Double
    Un Variant prend deux fois plus de mémoire que Double

    ceci explique peut être cela
    ha oui j'ai remarqué que ce deux variables etaient considérées comme variant, j'ai corrigé ça mais ce code génère toujours une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim net As Double, sourceip As Double, mask As Double
    sourceip = 2894864394#
    mask = 4294967040#
    net = sourceip And mask
    toujours erreur d'execution n°6 dépassement de capacité (au moment de la dernière instruction)

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    bon et bien j'ai trouvé , l'opérateur And se limite à la plage de valeurs du type long signé : de - à + 2milliards et quelques. donc meme avec des variables de type double au delà de cette valeur ça part en sucette ....

    bye!

  13. #13
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 092
    Points : 16 606
    Points
    16 606
    Par défaut Complement d'informations
    Curieux en effet, moi je n'ai pas réussi a trouver la raison sur le site MSDN

    Apres des essais j'ai fini par trouver cette limite
    pour tous les opérateurs logiques: And, Eqv, Imp, Not, Or et Xor, aucune des expressions ne doivent dépacer 2147483647, sinon erreur dépassement de capacité

  14. #14
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 62
    Points : 85
    Points
    85
    Par défaut
    Appliquer un masque ip en les stockant dans des double est un non sens, le codage des double n'étant absolument pas le même que celui des entiers.

    Pour ce qui en est des IPs, il faudrait faire tout ca avec des entier, mais en prenant soin de faire vous même le décalement pour simuler un entier non signé.

    Un truc comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
        Dim net As Long, sourceip As Long, mask As Long
        sourceip = ((172 - 128) * 16777216 + (140 - 128) * 65536 + (32 - 128) * 256 + (10 - 128))
        mask = ((255 - 128) * 16777216 + (255 - 128) * 65536 + (255 - 128) * 256 + (0 - 128))
     
        net = sourceip And mask
     
        Dim partie1 As Integer, partie2 As Integer, partie3 As Integer, partie4 As Integer
     
        partie1 = net / 16777216
        net = net - partie1 * 16777216
        partie1 = partie1 + 128
     
        partie2 = net / 65536
        net = net - partie2 * 65536
        partie2 = partie2 + 128
     
        partie3 = net / 256
        net = net - partie3 * 256
        partie3 = partie3 + 128
     
        partie4 = net / 1
        net = net - partie4 * 1
        partie4 = partie4 + 128
        MsgBox "net : " & partie1 & "." & partie2 & "." & partie3 & "." & partie4
    En espérant que cela vous aide

    Edit: un pe ude recherche papier, ca donnerai plutot ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
        Dim net As Long, sourceip As Long, mask As Long
        sourceip = ((171 - 128 * 2) * 16777216 + (140 - 128 * 2) * 65536 + (48) * 256 + (10))
        mask = ((255 - 128 * 2) * 16777216 + (255 - 128 * 2) * 65536 + (224 - 128 * 2) * 256 + (0))
     
        net = sourceip And mask
     
        Dim partie1 As Integer, partie2 As Integer, partie3 As Integer, partie4 As Integer
     
        partie1 = net / 16777216
        net = net - partie1 * 16777216
        If partie1 < 0 Then
            partie1 = partie1 + 128 * 2
        End If
     
        partie2 = net / 65536
        net = net - partie2 * 65536
        If partie2 < 0 Then
            partie2 = partie2 + 128 * 2
        End If
     
        partie3 = net / 256
        net = net - partie3 * 256
        If partie3 < 0 Then
            partie3 = partie3 + 128 * 2
        End If
     
        partie4 = net / 1
        net = net - partie4 * 1
        If partie4 < 0 Then
            partie4 = partie4 + 128 * 2
        End If
        MsgBox "net : " & partie1 & "." & partie2 & "." & partie3 & "." & partie4
    Il faut en fait, pour les nombres > 128, leur enlever 128*2.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec le type double
    Par smil1 dans le forum Général Java
    Réponses: 6
    Dernier message: 05/10/2011, 10h01
  2. Probléme variable type double
    Par Pierre005 dans le forum Débuter
    Réponses: 5
    Dernier message: 02/12/2009, 15h10
  3. Probléme de recordset avec variable
    Par crovette51101 dans le forum VBA Access
    Réponses: 3
    Dernier message: 11/05/2007, 09h40
  4. Réponses: 5
    Dernier message: 11/05/2006, 08h51
  5. Réponses: 1
    Dernier message: 27/07/2005, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo