none
dépassement de capacité d'un int 64 RRS feed

  • Question

  • Bonjour,
    Je m'amuse à faire un calculette et j'essaye de tester le dépassement de capacité d'un int 64 pour la multiplication
    mais j'ai quand même une erreur de dépassement de capacité
    Operande1 et 2 sont des int64
    Avez-vous une idée ?

    Voici mon code:

     Private Sub ButtonEgale_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonEgale.Click

            Operande2 = Val(TextBoxAffichage.Text)

            If Operation = 1 Then

                TextBoxAffichage.Text = Operande1 + Operande2

            ElseIf Operation = 2 Then

                TextBoxAffichage.Text = Operande1 - Operande2

            ElseIf Operation = 3 And ((Operande1 * Operande2) < Int64.MaxValue) Then

                'Gérer le dépassement de capacité d'un int 64

                TextBoxAffichage.Text = Operande1 * Operande2

            ElseIf Operation = 4 And Operande2 <> 0 Then

                TextBoxAffichage.Text = Operande1 / Operande2

            End If
        End Sub


    dimanche 30 novembre 2008 15:11

Réponses

  • Tu obtiens une erreur car dans le test tu effectues l'opération qui provoque ce dépassement, pour être plus clair (enfin un peu ^^) tu teste si Opérande1 * Opérande2 est inférieur à Int64.MaxValue, pour tester cela, l'opération doit être effectuée mais si elle est effectuée et qu'elle dépasse, c'est déjà trop tard, donc l'erreur survient.

    Un moyen de faire (et de simplifier ta procédure au passage):

    Private Sub ButtonEgale_Click(ByVal sender As Object, ByVal e As EventArgs) Handles ButtonEgale.Click
    ' Initialise Operande2 à zéro
    Operande2 = 0
    ' Teste si le contenu du TextBox est convertible en Int64
    ' et si oui le stocke dans Operande2
    If
    Int64.TryParse(TextBoxAffichage.Text, Operande2) Then
    Select Case Operation
    Case 1
    TextBoxAffichage.Text = (Operande1 + Operande2).ToString()
    Case 2
    TextBoxAffichage.Text = (Operande1 - Operande2).ToString()
    Case 3
    Try
    TextBoxAffichage.Text = (Operande1 * Operande2).ToString()
    Catch oex As OverflowException
    TextBoxAffichage.Text = "L'opération a provoqué un dépassement de capacité."
    End Try
    Case 4 ' Case Else s'il n'y a pas d'autre cas
    If Operande2 <> 0 Then
    TextBoxAffichage.Text = (Operande1 / Operande2).ToString()
    Else
    TextBoxAffichage.Text = "Division par zéro impossible."
    End If
    End Select
    Else
    TextBoxAffichage.Text = "Vous n'avez pas saisi un nombre."
    End If
    End Sub

    Ce n'est qu'une suggestion parmi d'autres (nombreuses) possibilités, toutefois; quelques conseils:
    - Penser à ajouter "Option Strict On" et "Option Explicit On" pour éviter les erreurs de variables non déclarées ou les erreurs de conversion.
    - Utiliser un contrôle (ou une limitation) sur la saisie de tes TextBox si elles ne doivent contenir que des nombres ou mieux dans ce cas, utiliser un contrôle NumericUpDown qui est tout particulièrement pratique dans ce genre de cas.

    En espérant que tout cela te sera utile !
    dimanche 30 novembre 2008 22:51

Toutes les réponses

  • Tu obtiens une erreur car dans le test tu effectues l'opération qui provoque ce dépassement, pour être plus clair (enfin un peu ^^) tu teste si Opérande1 * Opérande2 est inférieur à Int64.MaxValue, pour tester cela, l'opération doit être effectuée mais si elle est effectuée et qu'elle dépasse, c'est déjà trop tard, donc l'erreur survient.

    Un moyen de faire (et de simplifier ta procédure au passage):

    Private Sub ButtonEgale_Click(ByVal sender As Object, ByVal e As EventArgs) Handles ButtonEgale.Click
    ' Initialise Operande2 à zéro
    Operande2 = 0
    ' Teste si le contenu du TextBox est convertible en Int64
    ' et si oui le stocke dans Operande2
    If
    Int64.TryParse(TextBoxAffichage.Text, Operande2) Then
    Select Case Operation
    Case 1
    TextBoxAffichage.Text = (Operande1 + Operande2).ToString()
    Case 2
    TextBoxAffichage.Text = (Operande1 - Operande2).ToString()
    Case 3
    Try
    TextBoxAffichage.Text = (Operande1 * Operande2).ToString()
    Catch oex As OverflowException
    TextBoxAffichage.Text = "L'opération a provoqué un dépassement de capacité."
    End Try
    Case 4 ' Case Else s'il n'y a pas d'autre cas
    If Operande2 <> 0 Then
    TextBoxAffichage.Text = (Operande1 / Operande2).ToString()
    Else
    TextBoxAffichage.Text = "Division par zéro impossible."
    End If
    End Select
    Else
    TextBoxAffichage.Text = "Vous n'avez pas saisi un nombre."
    End If
    End Sub

    Ce n'est qu'une suggestion parmi d'autres (nombreuses) possibilités, toutefois; quelques conseils:
    - Penser à ajouter "Option Strict On" et "Option Explicit On" pour éviter les erreurs de variables non déclarées ou les erreurs de conversion.
    - Utiliser un contrôle (ou une limitation) sur la saisie de tes TextBox si elles ne doivent contenir que des nombres ou mieux dans ce cas, utiliser un contrôle NumericUpDown qui est tout particulièrement pratique dans ce genre de cas.

    En espérant que tout cela te sera utile !
    dimanche 30 novembre 2008 22:51
  • merci beaucoup
    je savais bien qu'il fallait utiliser un try catch mais je ne savais pas comment
    un pro fait tout de suite la difference Surprise)

    lundi 1 décembre 2008 21:41