[VB.NET] Problème de calcul
Résolu/Fermé
Crackynimous
Messages postés
14
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
13 octobre 2017
-
Modifié le 20 avril 2017 à 15:51
Utilisateur anonyme - 21 avril 2017 à 20:54
Utilisateur anonyme - 21 avril 2017 à 20:54
A voir également:
- [VB.NET] Problème de calcul
- Calcul moyenne excel - Guide
- Calcul km marche à pied gratuit - Télécharger - Sport
- Calcul charpente bois gratuit - Télécharger - Architecture & Déco
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
- Logiciel gratuit calcul surface m2 - Télécharger - Outils professionnels
4 réponses
NHenry
Messages postés
15214
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
16 avril 2025
363
20 avril 2017 à 20:41
20 avril 2017 à 20:41
TextBox1.Text + 0
En VB.NET pensez à activer "Option Explicit" et "Option Strict"
Corriges ton code ensuite reteste.
En VB.NET pensez à activer "Option Explicit" et "Option Strict"
Corriges ton code ensuite reteste.
Utilisateur anonyme
20 avril 2017 à 23:51
20 avril 2017 à 23:51
Bonsoir,
@Patty, c'est du VB.Net pas du VB6, y'a pas de caption.
@Crackynimous,
TextBox.Text c'est une chaine de caractères, + 0 c'est un nombre.
Sans option strict et explicit, tu dis au compilateur ajoute 0 au "Corbeau et le Renard", et t'espères qu'il s'en sorte, des fois ça marche, des fois non.
Quand tu actives les options, tous les cas ou le compilateur doit faire "un choix contre nature", vont retourner des erreurs, qu'il faudra corriger pour avoir un code propre.
Les 2 messages que tu montres sont clair, on ne mélange pas les nombres et les textes. Les langages VB (y'a a 4 familles) sont parmis les rares langages à tolérer cela sous condition, et quand ça plante, le développeur non averti n'y comprend rien.
Par contre pour t'aider à corriger les erreurs, c'est la ligne de code qui plante qu'il faudrait nous montrer, en utilisant la coloration syntaxique
@Patty, c'est du VB.Net pas du VB6, y'a pas de caption.
@Crackynimous,
TextBox.Text c'est une chaine de caractères, + 0 c'est un nombre.
Sans option strict et explicit, tu dis au compilateur ajoute 0 au "Corbeau et le Renard", et t'espères qu'il s'en sorte, des fois ça marche, des fois non.
Quand tu actives les options, tous les cas ou le compilateur doit faire "un choix contre nature", vont retourner des erreurs, qu'il faudra corriger pour avoir un code propre.
Les 2 messages que tu montres sont clair, on ne mélange pas les nombres et les textes. Les langages VB (y'a a 4 familles) sont parmis les rares langages à tolérer cela sous condition, et quand ça plante, le développeur non averti n'y comprend rien.
Par contre pour t'aider à corriger les erreurs, c'est la ligne de code qui plante qu'il faudrait nous montrer, en utilisant la coloration syntaxique
Crackynimous
Messages postés
14
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
13 octobre 2017
7
Modifié le 21 avril 2017 à 13:52
Modifié le 21 avril 2017 à 13:52
Merci beaucoup pour cette réponse.
Lorsque j'ajoute les options, voici les erreurs : https://imgur.com/ziDVkAd
L'auto-correction fait le travail à ma place de cette façon : https://imgur.com/TngekfH
Cependant lorsque je clique sur mon bouton pour effectué le calcul, j'ai une nouvelle erreur qui s'affiche :
Que dois-je faire ?
J'ajoute le code pour ceux qui veulent corriger
Lorsque j'ajoute les options, voici les erreurs : https://imgur.com/ziDVkAd
L'auto-correction fait le travail à ma place de cette façon : https://imgur.com/TngekfH
Cependant lorsque je clique sur mon bouton pour effectué le calcul, j'ai une nouvelle erreur qui s'affiche :
{"L'opération arithmétique a provoqué un dépassement de capacité."}
Que dois-je faire ?
J'ajoute le code pour ceux qui veulent corriger
Option Explicit On Option Strict On Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If CInt(TextBox1.Text) Mod 2 = 0 Then Label1.Text = CType(((CInt(TextBox1.Text) + 0) - 76561197960265728) / 2, String) Else Label1.Text = "" End If End Sub End Class
Utilisateur anonyme
>
Crackynimous
Messages postés
14
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
13 octobre 2017
Modifié le 21 avril 2017 à 17:45
Modifié le 21 avril 2017 à 17:45
Alors en premier lieu, à quoi ça te sert d'ajouter 0?
Crackynimous
Messages postés
14
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
13 octobre 2017
7
>
Utilisateur anonyme
21 avril 2017 à 18:00
21 avril 2017 à 18:00
Parce que dans un second temps j'ajoute 1. J'ai deux types d’évènements mais je n'ai pas commencé le 2eme car le premier déconne pour le moment.
Kalissi
Messages postés
218
Date d'inscription
jeudi 2 mai 2013
Statut
Membre
Dernière intervention
15 juillet 2019
20
21 avril 2017 à 18:04
21 avril 2017 à 18:04
Bonjour,
À mon humble avis ...
1.) Trop d'instruction VB6 dans ce code ...
2.) Pas assez de contrôle sur l'entrée ...
Exemple :
Ça demeure une perception personnel. N'y voyer aucune offense.
J'ai l'étiquette d'être perfectionniste, mais mon code fonctionne :-)
K
À mon humble avis ...
1.) Trop d'instruction VB6 dans ce code ...
2.) Pas assez de contrôle sur l'entrée ...
Exemple :
Private Sub btnCalculer_Click(sender As Object, e As EventArgs) Handles btnCalculer.Click
Dim Valeur As Int64 = 0
Dim Resultat As Double = 0 ' À cause de la division
If Not (String.IsNullOrEmpty(Me.txtEntree.Text)) Then
If (Int64.TryParse(Me.txtEntree.Text, Valeur)) Then
Resultat = ((Valeur + 0) - 76561197960265728) / 2
Me.txtsortie.Text = Resultat.ToString
End If
End If
End Sub
Ça demeure une perception personnel. N'y voyer aucune offense.
J'ai l'étiquette d'être perfectionniste, mais mon code fonctionne :-)
K
Crackynimous
Messages postés
14
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
13 octobre 2017
7
21 avril 2017 à 18:18
21 avril 2017 à 18:18
Bonjour,
Alors tout d’abord un grand merci, en effet ça fonctionne !
Je n'y vois aucune offense, je ne suis pas du tout professionnel, très loin de là.
Mon code est moche, mais je n'arrive pas à comprendre ce qui posait problème exactement. Pourrai-tu m'expliquer d'où venait ce dernier ?
Alors tout d’abord un grand merci, en effet ça fonctionne !
Je n'y vois aucune offense, je ne suis pas du tout professionnel, très loin de là.
Mon code est moche, mais je n'arrive pas à comprendre ce qui posait problème exactement. Pourrai-tu m'expliquer d'où venait ce dernier ?
Kalissi
Messages postés
218
Date d'inscription
jeudi 2 mai 2013
Statut
Membre
Dernière intervention
15 juillet 2019
20
>
Crackynimous
Messages postés
14
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
13 octobre 2017
Modifié le 21 avril 2017 à 19:03
Modifié le 21 avril 2017 à 19:03
Bonjour,
1.) Le contenu de la textbox en entrée est : 76 561 198 204 504 212
Longueur de 4 octets, stocke les nombres de -2 147 483 648 à 2 147 483 647.
ref. : https://docs.microsoft.com/fr-fr/previous-versions/sql/sql-server-2008-r2/ms189324(v=sql.105)?redirectedfrom=MSDN
Il y a largement un dépassement de capacité si on veut mettre ce nombre
dans un type Integer (Int32). Donc, on utilise plutôt un type Long (Int64).
En .Net je recommande d'utiliser le type Int64 dans tous les cas de figure,
l'espace mémoire n'est plus vraiment un problème de nos jours même
pour des millions de traitements.
Le type Int32 sera utilisé lors de la récupération de valeur sur les propriétés
objet.Count [ .Count ].
L'instruction " [ CInt(TextBox1.Text) ] est impossible dans ce cas ci, et de plus
[ CInt ] nous vient du VB6.
J'aurais plutôt utilisé l'instruction .Net pur [ Convert.ToInt64(TextBox1.Text) ].
L'instruction CType nous vient de VB2005, et depuis VB2008, on utilise plutôt
l'instruction Convert.ToInt16, .ToInt32, .ToInt64, .ToDouble, .ToDateTime, ...
Pour des objets complexes, on utilise Directcast(Objet, TypeT)
La conversion vers un string est très simple, on prend n'importe quel
variable, même un nombre fixe et on ajoute .ToString -> [ 435.ToString ].
Autre suggestion : Label1.Text = "" -> Label1.Text = String.Empty
If (Int64.TryParse(Me.txtEntree.Text, Valeur)) Then permet de garantir la conversion.
Si la condition est Vrai, la variable [Valeur] prend le contenu de la conversion.
Considéré toujours un contrôle de saisie comme une boite noir, sur laquelle on effectue
pas de traitement, on valide son contenu en le transférant dans une variable sur
laquelle on va travailler.
Dans les propriétés de votre projet, aller sur l'onglet Référence, dans la liste en bas, si vous voyez la référence Microsoft.VisualBasic, décocher celle-ci, habituez vous à travailler avec des instructions de la version que vous utiliser.
Encore une fois, ceci demeure mon expérience personnel et mon point de vue.
Ce ne sont ici que des pratiques qui uniformise et renforce la qualité du code.
K
1.) Le contenu de la textbox en entrée est : 76 561 198 204 504 212
Longueur de 4 octets, stocke les nombres de -2 147 483 648 à 2 147 483 647.
ref. : https://docs.microsoft.com/fr-fr/previous-versions/sql/sql-server-2008-r2/ms189324(v=sql.105)?redirectedfrom=MSDN
Il y a largement un dépassement de capacité si on veut mettre ce nombre
dans un type Integer (Int32). Donc, on utilise plutôt un type Long (Int64).
En .Net je recommande d'utiliser le type Int64 dans tous les cas de figure,
l'espace mémoire n'est plus vraiment un problème de nos jours même
pour des millions de traitements.
Le type Int32 sera utilisé lors de la récupération de valeur sur les propriétés
objet.Count [ .Count ].
L'instruction " [ CInt(TextBox1.Text) ] est impossible dans ce cas ci, et de plus
[ CInt ] nous vient du VB6.
J'aurais plutôt utilisé l'instruction .Net pur [ Convert.ToInt64(TextBox1.Text) ].
L'instruction CType nous vient de VB2005, et depuis VB2008, on utilise plutôt
l'instruction Convert.ToInt16, .ToInt32, .ToInt64, .ToDouble, .ToDateTime, ...
Pour des objets complexes, on utilise Directcast(Objet, TypeT)
La conversion vers un string est très simple, on prend n'importe quel
variable, même un nombre fixe et on ajoute .ToString -> [ 435.ToString ].
Autre suggestion : Label1.Text = "" -> Label1.Text = String.Empty
If (Int64.TryParse(Me.txtEntree.Text, Valeur)) Then permet de garantir la conversion.
Si la condition est Vrai, la variable [Valeur] prend le contenu de la conversion.
Considéré toujours un contrôle de saisie comme une boite noir, sur laquelle on effectue
pas de traitement, on valide son contenu en le transférant dans une variable sur
laquelle on va travailler.
If Not (String.IsNullOrEmpty(Me.txtEntree.Text)) Then
If (Int64.TryParse(Me.txtEntree.Text, Valeur)) Then
Dans les propriétés de votre projet, aller sur l'onglet Référence, dans la liste en bas, si vous voyez la référence Microsoft.VisualBasic, décocher celle-ci, habituez vous à travailler avec des instructions de la version que vous utiliser.
Encore une fois, ceci demeure mon expérience personnel et mon point de vue.
Ce ne sont ici que des pratiques qui uniformise et renforce la qualité du code.
K
Crackynimous
Messages postés
14
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
13 octobre 2017
7
>
Kalissi
Messages postés
218
Date d'inscription
jeudi 2 mai 2013
Statut
Membre
Dernière intervention
15 juillet 2019
21 avril 2017 à 19:07
21 avril 2017 à 19:07
Un grand merci à toi
patty5046
Messages postés
46
Date d'inscription
lundi 8 février 2016
Statut
Membre
Dernière intervention
15 septembre 2023
5
20 avril 2017 à 20:10
20 avril 2017 à 20:10
Bonsoir
Perso
Dans le 1er cas j'ai 122119256, dans le 2ème:122119248
????Je ne comprends pas
Par contre pour label, je ne mets pas .text, mais .caption et pour textbox, je ne mets pas .text, mais .value
Bon courage
Perso
Dans le 1er cas j'ai 122119256, dans le 2ème:122119248
????Je ne comprends pas
Par contre pour label, je ne mets pas .text, mais .caption et pour textbox, je ne mets pas .text, mais .value
Bon courage
Crackynimous
Messages postés
14
Date d'inscription
jeudi 16 février 2017
Statut
Membre
Dernière intervention
13 octobre 2017
7
Modifié le 20 avril 2017 à 20:27
Modifié le 20 avril 2017 à 20:27
Merci de te pencher sur le sujet,
Étrange, je ne comprend pas pourquoi nos résultats sont différents.
Néanmoins le même problème est là, les résultats sont différents avec le même nombre de départ.
J'avais essayé de mettre .value mais le problème c'est que VB ne le reconnais pas. (Visual Studio 2015). Je viens de regarder pour .caption, même problème que pour .value.
Peut être que je m'y prend mal, mais j'en doute.
Des idées ?
Étrange, je ne comprend pas pourquoi nos résultats sont différents.
Néanmoins le même problème est là, les résultats sont différents avec le même nombre de départ.
J'avais essayé de mettre .value mais le problème c'est que VB ne le reconnais pas. (Visual Studio 2015). Je viens de regarder pour .caption, même problème que pour .value.
Peut être que je m'y prend mal, mais j'en doute.
Des idées ?
20 avril 2017 à 20:56
En activant "Option Strict" mon code se truffe d'erreur de ce type :
"Gravité Code Description Projet Fichier Ligne État de la suppression
Erreur BC30512 Option Strict On interdit les conversions implicites de 'String' en 'Double'. Proj1 C:\Users\PC\Downloads\Proj1\Proj1\Form1.vb 5 Actif
Gravité Code Description Projet Fichier Ligne État de la suppression
Erreur BC30512 Option Strict On interdit les conversions implicites de 'Double' en 'String'. Proj1 C:\Users\PC\Downloads\Proj1\Proj1\Form1.vb 7 Actif
Cependant, je ne sais pas comment les corriger, si vous pouviez m'indiquer la démarche à suivre, je vous en serait reconnaissant.