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.NET Discussion :

Bug sur une simple opération arithmétique ?


Sujet :

VB.NET

  1. #1
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut Bug sur une simple opération arithmétique ?
    Bonjour,
    Je viens de tomber sur un os, j'avoue que je n'arrive pas à comprendre quelle erreur j'aurais pu faire, et j'en viens à supposer un bug du compilateur.
    Alors avant d'envoyer un ticket, je viens voir si quelqu'un ne verrait pas une bourde de ma part dans le code, pourtant simple, que je vous soumet.
    Le but est simplement de fixer la couleur de texte d'un contrôle quelconque, en fonction de la couleur du fond, de manière à ce qu'on ait une lisibilité minimale.
    En clair, si la couleur du fond est foncée on met le texte en blanc, sinon en noir.
    Mais voilà, à l'exécution, je me retrouve avec une erreur System.OverflowException*: 'L'opération arithmétique a provoqué un dépassement de capacité.'
    Le code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Function set_TextColor_From_BackGround(BGColor As Color) As Color
     
            If ((BGColor.B + BGColor.R + BGColor.G) / 3 <= 128) Then     ' Si couleur foncée 
                Return Color.White                                              ' Texte blanc pour qu'il reste lisible
            Else                                                            ' Si couleur claire
                Return Color.Black                                              ' Texte en noir
            End If
     
        End Function
    Et l'erreur est provoquée par la simple addition (BGColor.B + BGColor.R + BGColor.G), sachant que BGColor.B et BGColor.R valent 128, et BGColor.G vaut 255... (BGColor => "{Name=ff80ff80, ARGB=(255, 128, 255, 128)}" )

    D'avance merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut
    Bon, j'ai compris comment l'erreur se produit.
    Le compilateur doit bien faire une erreur. En l'occurrence, il veut stocker le résultat dans une variable de la même taille que les 3 variables additionnées, c'est à dire sur 1 octet (de 0 à 255).
    Donc l'addition provoque un débordement...
    J'ai modifié le code comme suit pour utiliser des variables capables de stocker le résultat, et désormais l'exécution est OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Function set_TextColor_From_BackGround(BGColor As Color) As Color
     
            Dim colorB As Int16 = BGColor.B
            Dim colorR As Int16 = BGColor.R
            Dim colorG As Int16 = BGColor.G
     
            If ((colorB + colorR + colorG) / 3 <= 128) Then     ' Si couleur foncée 
                Return Color.White                                  ' Texte blanc pour qu'il reste lisible
            Else                                                ' Si couleur claire
                Return Color.Black                                  ' Texte en noir
            End If
     
        End Function

  3. #3
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Tu dépasses l'espace alloué à une valeur de type Color et tu obtiens un message du genre "Dépassement de capacité".

    Essaie donc le code de l'illustrtion suivante pour t'en rendre compte. Sur l'illustration, une couleur Beige donne un total de 710.
    En passant par des variables de type Integer, il est bien sûr possible de faire l'addition (c'est ce que j'ai fait), mais je ne sais pas comment tu peut interpréter le résultat ...

    Nom : Color.jpg
Affichages : 81
Taille : 29,3 Ko


  4. #4
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut
    Si tu regardes bien, c'est ce que j'ai fait. ;-)
    Mais il y a quand même un souci à la base.
    Je n'ai fait que reprendre un bout de code en C# que j'utilise habituellement, et qui fonctionne parfaitement. C'est le simple fait de le traduire en VB (pour un projet écrit dans ce langage) qui a provoqué l'erreur.
    Le compilateur C# sait additionner sans débordement (comme la plupart de ceux que je connais), le compilateur VB, non.
    Le code C# qui ne pose pas souci lui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                Color colorFond = appointment.Color;
                Color colorText;
                // Si couleur foncée, on passe à un texte blanc pour qu'il reste lisible
                if ((colorFond.B + colorFond.R + colorFond.G) / 3 <= 128)
                {
                    colorText = Color.White;
                }
                else
                {
                    colorText = Color.Black;
                }

  5. #5
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Ah oui !
    Nos messages se sont croisés : 11h10 et 11h13.

    Pourquoi ça fonctionne en C# et pas en VB, je n'en sais rien. C'est une question de tolérance du langage, pas de compilateur.
    Et pourtant C# est réputé plus rigoureux !

    )))

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    En C#, une conversion implicite est réalisée entre le type byte et le type int.
    Cela autorise donc l'utilisation de l'opérateur d'addition sur les valeur de R, G et B.

    En VB.Net, l'option Strict ou Explicite (je ne sais plus laquelle) interdit cette conversion et provoque donc une erreur.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut
    Citation Envoyé par popo Voir le message
    En C#, une conversion implicite est réalisée entre le type byte et le type int.
    Cela autorise donc l'utilisation de l'opérateur d'addition sur les valeur de R, G et B.

    En VB.Net, l'option Strict ou Explicite (je ne sais plus laquelle) interdit cette conversion et provoque donc une erreur.
    Voilà une réponse qui me plait parce qu'elle me donne l'explication.
    L'option Strict ne définit que les erreurs de compilation, et ne change pas l'exécution. Mais si VB.NET ne fait pas de conversion contrairement à C#, çà explique tout.

    Et en même temps cette réponse ne me plait pas (c'est pas de ta faute hein, c'est celle de Kro$oft ! ), car elle pose un souci. Tous les compilateurs que je connais sont capables de gérer des débordements sur des calculs intermédiaires. Car au final le résultat de mon calcul sera bien sur 1 octet.
    Mais comme je n'ai pas le choix, je vais prendre çà en compte.
    Vivement que je puisse tout reprendre en Swift !

  8. #8
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Très bonne explication en effet.
    Mais Option Strict est Off (conversion implicite autorisée) par défaut et l'erreur existe quand même.
    Nous ne savons donc pas encore tout ...

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

Discussions similaires

  1. [Utilisation] Fix de bug sur une version livré
    Par Scalp4 dans le forum Subversion
    Réponses: 1
    Dernier message: 04/05/2009, 11h45
  2. Bug sur une requête UPDATE
    Par parab dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 19/01/2009, 11h09
  3. [POO] Bug sur une fonction récursive : renvoit undefined
    Par zaboug dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/06/2008, 14h10
  4. [HTML] bug sur une liste déroulante
    Par GreatDeveloperOnizuka dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 30/01/2008, 11h58
  5. Bug sur une allocation dynamique de tableau
    Par Atharendil dans le forum C++
    Réponses: 6
    Dernier message: 15/12/2007, 23h42

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