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 :

dépassement de capacité


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 34
    Par défaut dépassement de capacité
    Dim s As Long
    s = 7182231070201 Mod 97


    mon probleme c'est que, durant l'execution de ce code je trouve le message d'erreur "dépassement de capacité"

    si vous avez une solution stp?

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour (eh oui),

    7182231070201 dépassant la limite d'un Long, tu ne peux faire celà en VB6 !

    Seule solution : traiter la chaine de caractères "7182231070201" et procéder aux opératioons de division, telles que tu les ferais à la main (c'est un petit sport), avec calculs des restes à "poser" et "recupérer" (comme à l'école).

  3. #3
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    salut
    A verifier
    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
    Option Explicit
     
    Private Sub Form_Load()
    Dim s As Variant
    Dim t As Variant
    Dim u As Variant
    Dim Lechifr As Double
    Dim Diviseur As Integer
     
    's = 7182231070201# Mod 97
    Lechifr = 7182231070201#
    Diviseur = 97
     
    s = Fix(CDec(Lechifr / Diviseur))
    t = Lechifr - (s * Diviseur)
    u = CDec(t / Diviseur)
     
    MsgBox u
    End Sub
    Motif de l'edit:
    Désolé, le modulo est contenu dans la variable t, non pas dans la variable u.

    Il reste que le code proposé a lui aussi ses limites, la proposition de ucfoutu , un post plus bas, est assurément meilleurs.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour, progelect,
    ça marche bien et le résultat est exact.
    Pour info : la méthode scolaire (traitement de la chaine de caractères) qui permet de traiter d'énormes chaînes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Dim nb As String, Diviseur As Integer, l As Integer
      nb = "7182231070201"
      Diviseur = 97
      l = 9 ' j'ai choisi ici 9, mais je pourrais aussi bien prendre tout autre chiffre entre 3 et 9
      While Len(nb) > l
        nb = CStr(Val(Left(nb, l) Mod Diviseur)) & Mid(nb, l + 1)
      Wend
      nb = CStr(Val(nb Mod Diviseur))
      MsgBox nb
    elle utilise tout simplement la méthode des restes (celle que l'on applique en posant une division)

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonsoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function Modulo(Nombre As Double, Diviseur As Double) As Double
            Modulo = Nombre - (Int(Nombre / Diviseur) * Diviseur)
    End Function
    Tu peux ajouter des tests pour voir si tu passes des entiers, ou tronquer les paramètres, par exemple avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function Modulo(Nombre As Double, Diviseur As Double) As Double
            Nombre = Int(Nombre)
            Diviseur = Int(Diviseur)
            Modulo = Nombre - (Int(Nombre / Diviseur) * Diviseur)
    End Function
    Tout dépend de l'utilisation de la fonction. Je présume que c'est pour vérifier des digits de contrôle dans suites de chiffres (numéros de compte en banque, code d'articles, ...)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Salut aux différents intervenants (reste que le créateur de la discussion n’a pas donné de nouvelles).

    Le calcul avec des grands nombres restent toujours un problème, surtout dans des enchainements d’opérations, mais je doute que les professionnels utilisent des programmes écrits en VB .

    Petite "amélioration" du code posté par Pierre Fauconnier, m’intéressant à ce type de problème, j’ai bien sûr essayé sa fonction, en passant par des Cdecs dans sa fonction, on peut allez un peu plus loin dans le nombre et l’opérateur que l’on veut faire entrées dans l’opération.
    Je n’ai jamais eu l’occasion de lire un article sur le traitement des opérations (en informatique) utilisées en astronomie, chimie, biologie, balistique, ….., cela doit être une sacré usine a gaz.
    Quelques secondes d’arc multiplié par X distance du but a atteindre, par exemple en balistique spatiale, sa doit être quelque chose pour le calcul, et encor là je ne retient que deux données (accélération, attirance lors du croisement d’un autre astre, ….., décélération, ……).

    Un petit bout de code pour les "amoureux" du défi, sous VB, permettant d‘appréhender ses limites .
    Sur un Form, 2 TextBox index 0 et 1, 2 Label et un CommandButton.
    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
    Option Explicit
     
    Private Sub Form_Load()
    Text1(0).Text = "": Text1(1).Text = "": Label1.Caption = ""
    Text1(0).Move 480, 180, 3945, 285
    Text1(1).Move 480, 525, 3945, 285
    Label2.Move 90, 555, 315, 195: Label2.Caption = "Mod"
    Command1.Move 120, 930, 345, 375: Command1.Caption = "="
    Command1.FontBold = True: Command1.FontSize = 10
    Label1.Move 540, 1020: Label1.AutoSize = True
    Me.Height = 1995: Me.Width = 4770
    End Sub
     
    Function Modulo(Nombre As Variant, Diviseur As Variant) As Variant
    On Error Resume Next
        If IsNumeric(Nombre) And IsNumeric(Diviseur) Then
            Modulo = CDec(Nombre) - (Int(CDec(Nombre) / Diviseur) * Diviseur)
        End If
    If Err.Number <> 0 Then Modulo = "Erreur: " & Err.Description
    If Modulo > Diviseur Then Modulo = "Resultat erroné: " & Modulo
    End Function
    Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)
    If KeyAscii = 13 Then KeyAscii = 0: Command1_Click
    End Sub
    Private Sub Command1_Click()
    Label1.Caption = Modulo(CVar(Text1(0).Text), CVar(Text1(1).Text))
    End Sub
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

Discussions similaires

  1. Réponses: 12
    Dernier message: 17/10/2014, 16h08
  2. Transaction, Dépassement de capacité
    Par SkYsO dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 23/12/2008, 14h56
  3. Dépassement de capacité
    Par jean-pierre96 dans le forum Access
    Réponses: 2
    Dernier message: 10/05/2006, 16h04
  4. Réponses: 8
    Dernier message: 06/02/2006, 14h34
  5. détection de dépassement de capacité
    Par tut dans le forum C++
    Réponses: 10
    Dernier message: 01/12/2004, 22h11

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