Programme bug au débugage mais pas en "pas à pas"

mathieutu Messages postés 5 Date d'inscription jeudi 11 novembre 2010 Statut Membre Dernière intervention 23 novembre 2010 - 21 nov. 2010 à 20:33
mathieutu Messages postés 5 Date d'inscription jeudi 11 novembre 2010 Statut Membre Dernière intervention 23 novembre 2010 - 23 nov. 2010 à 22:53
Salut à tous.
Voila j'ai un problème avec mon premier programme sous vb.net
C'est une calculatrice à la base, mais quand je debug, au lieu de me faire c=a+b,
elle me sort c=a&b+b.
donc par exemple 1+1 donne 12 soit 1&1 + 1 = 11 + 1

OR : quand je débug pas à pas où quand je mets des points d'arrêts à certains endroits pour voir ce qu'il se passe, je n'ai AUCUN problème !! (donc 1+1 donne 2 quoi...)

je prends le cas de l'addition mais tous les signes sont pareils (et construits de la même façon).

vous trouverez mon projet ici : http://dl.free.fr/bEfZGIrlI
il y a deux dossiers c'est dans calc2 et le debug est dans Calculatrice\bin\Debug
Voila bon je sais que mon code doit être moche et lourd, mais c'est mon premier donc un poil d'indulgence svp


Merci à tous !

8 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
21 nov. 2010 à 21:14
Bonjour,

N'oublie pas de mettre :
Option Explicit
et
Option Strict
à On

Je pense que c'est un problème de type de variable.

Mon site
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 nov. 2010 à 21:27
Regarde la valeur de la variable res quand tu clique sur le bouton "=" avant de commencer le calcul.


Plus globalement, la variable res n'a aucune utilité dans les procédures des chiffres et des opérations, tu dois travailler directement sur Calcul.Text comme tu le fais d'ailleurs pour les chiffres.

Donc la variable res, ainsi que nb et terme ne sont utilisées que dans la procédure du bouton "=" ok_click. Elles n'ont aucunement besoin d'être des variable globales. Déclare les plutôt en local dans la procédures, ça t'évitera d'avoir des erreurs de ce genre.
De manière générale, les variables globales sont au mieux à éviter, au pire à réserver au strict minimum quand il n'y a pas d'autres choix.

Autre point, dans la procédure ok_click, les éléments du tableau terme (comme tout tableau, liste et collection en .Net) commence à 0. Il faut donc que ton For i commence lui aussi à 0 sinon tu oublie le premier terme


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
mathieutu Messages postés 5 Date d'inscription jeudi 11 novembre 2010 Statut Membre Dernière intervention 23 novembre 2010
21 nov. 2010 à 22:55
@ NHenry :
Je n'ai pas compris dans quoi je devais mettre ces options, et à quoi elles servent.

@ Casy :
ok pour les variables locales. Par contre res me permet de pouvoir bosser sur du double directement et pas sur du string.
De plus, res apparait aussi dans les boutons chiffres et signes, mais peut être à tord. A force je me suis un peu
embrouillé tout seul.

En fait quand on arrive dans ok_click, res a déjà la valeur du premier terme (mais du coup je sais pas si ca a un grand intérêt) donc c'est pour ca que je ne rajoute pas le premier terme par la suite.

Le pire c'est que tout marche très bien en "pas à pas" ou quand je met un point d'arrêt dans la procédure additionner le + marche très bien ! il faut que j'arrête dans sa procédure pour que le signe marche comme il faut..

Sinon que pensez vous de l'ensemble, la gestion des signes notamment, y avait il possibilité de faire autrement ? je n'ai pas réussit à convertir du string en véritable calcul, ca ca serait le top c'est sur !


Concrètement je voulais qu'avec ça le calcul puisse se faire automatiquement c'est à dire que lorsque je tape a+b+c
au deuxième plus, le label affiche le résultat de a+b appelons le d et calcul.text affiche d+c et etc..

donc si je tape 2+3+4 calcul.text=5+4 et label.text=5 et quand j'appuie sur = les deux valent 9..

J'espère que vous m'avez compris, merci de votre aide.

Mathieu
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
22 nov. 2010 à 14:22
En fait quand on arrive dans ok_click, res a déjà la valeur du premier terme

res n'a pas la valeur du premier terme, mais la concaténation des 2 termes sans le signe entre.

Le pire c'est que tout marche très bien en "pas à pas" ou quand je met un point d'arrêt dans la procédure additionner le + marche très bien
Chez moi avec ton code, même en pas à pas, je reproduit l'erreur.
L'erreur est clairement visible en mettant un point d'arrêt dans la procédure ok_click et en faisant du pas à pas

Sinon que pensez vous de l'ensemble,
Beaucoup de choses seraient améliorable, mais c'est normal, tu es débutant.
Pour le moment, occupe toi de faire marcher ce code tel que tu l'as imaginé, tu pourra l'améliorer par la suite, petit à petit. Il te sera plus utile de chercher tes problèmes et de galérer un petit peu à réfléchir pourquoi et comment ça ne marche pas plutôt que l'on te fournisse un code finalisé et opérationnel auquel tu ne comprendra pas pourquoi il a été fait comme ça et pas autrement.

Le cas échéant le forum est pour t'aider, et les nombreux tutos que l'on peut aussi trouver sur Internet.


Pour les améliorations à venir, tu devra revoir ta gestion des signes. Si effectivement tu prend en compte, un peu par hasard, je pense, le cas ou tu as plusieurs signes identiques, cela ne marche plus si tu as des signes différents.
1+2+5 marchera
1-2+5 ne marchera pas.




[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mathieutu Messages postés 5 Date d'inscription jeudi 11 novembre 2010 Statut Membre Dernière intervention 23 novembre 2010
22 nov. 2010 à 21:26
res n'est justement pas censé être cette concaténation, et c'est tout mon problème.
effectivement, en plaçant un arrêt sur ok_click on a bien un res qui arrive à 11.0 je prends le cas de base 1+1
alors qu'en le faisant en pas à pas (détaillé ou pas) je confirme bien arriver de mon coté à 2 !

Je n'arrive donc pas du tout à trouver où ce fait cette concaténation.. car le seul endroit où on a ça c'est dans les boutons chiffres, si signe=false. c'est à dire que si aucun bouton signe n'a été appuyé juste avant il concaténise tout les chiffres qui passent. c'est comme ça que j'arrive à taper un 123 : en faisant 1&2&3 mais il n'est pas censé le faire si le plus à été déclenché, car dans la procédure Form1_Activated si un des signes est true, la variable signe est égal à true. est dans les chifres, si signe=true alors il ne concaténise pas..

Private Sub Form1_Activated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Activated
        If plus True Or moins True Or fois = True Or div = True Then signe = True Else signe = False
    End Sub


 Private Sub un_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles un.Click
        If dejaok True And signe False Then
            efface_Click(sender, e)
            calcul.Text = 1
        Else
            calcul.Text = calcul.Text & 1
            If signe False Then res res & 1
        End If
        ok.Focus()
    End Sub


Je pense donc que le problème vient peut être de là... mais... où ??!



Sinon, ce que j'explique plus haut (
donc si je tape 2+3+4 calcul.text=5+4 et label.text=5 et quand j'appuie sur = les deux valent 9..


C'est justement pour avoir une gestion multisignes car pour 1-2+5 il calcul d'abord 1-2 puis -1+5 car en tapant le + il est censé calculer ce qu'il y a avant donc le 1-2 puis rajouter le moins...
ça aussi c'est censé marcher.. (et ça marche chez moi en pas à pas..) mais en pratique c'est une autre histoire...


Merci en tout cas de t'occuper de moi !!
Mathieu
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
23 nov. 2010 à 18:13
Je maintiens, res n'a pas à faire la concaténation. La concaténation est faite directement dans Calcul.Text.

res doit per contre être initialisé dans ok_click par le premier terme de l'expression.

Ci dessus le code modifié et corrigé pour l'ensemble des opérations. Tu risque de pas trop le reconnaitre car j'en ai profité pour gérer différemment (en plus des corrections) avec une seule procédure qui gère le click des 10 chiffres.
J'ai aussi corrigé les initialisation/réinitialisations de signe et dejaok, qui n'était pas bonne.
...

Public Class Form1

Dim dejapoint, dejaok, plus, moins, fois, div, signe As Boolean

Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
If e.KeyChar = "1" Then Chiffre_Click(sender, e)
If e.KeyChar = "2" Then Chiffre_Click(sender, e)
If e.KeyChar = "3" Then Chiffre_Click(sender, e)
If e.KeyChar = "4" Then Chiffre_Click(sender, e)
If e.KeyChar = "5" Then Chiffre_Click(sender, e)
If e.KeyChar = "6" Then Chiffre_Click(sender, e)
If e.KeyChar = "7" Then Chiffre_Click(sender, e)
If e.KeyChar = "8" Then Chiffre_Click(sender, e)
If e.KeyChar = "9" Then Chiffre_Click(sender, e)
If e.KeyChar = "0" Then Chiffre_Click(sender, e)
If e.KeyChar = "+" Then additioner_Click(sender, e)
If e.KeyChar = "-" Then soustraire_Click(sender, e)
If e.KeyChar = "*" Then multiplier_Click(sender, e)
If e.KeyChar = "/" Then diviser_Click(sender, e)
If e.KeyChar = "." Then point_Click(sender, e)
If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Enter) Then ok_Click(sender, e)

e.Handled = True
End Sub


'Chargement de la fenêtre
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.KeyPreview = True

dejapoint = False
dejaok = False
End Sub

#Region "Clics sur les boutons"
#Region "boutons chiffres"

Private Sub Chiffre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles un.Click, _
 deux.Click, trois.Click, quatre.Click, cinq.Click, six.Click, sept.Click, huit.Click, neuf.Click, zero.Click

If dejaok True And signe False Then efface_Click(sender, e)

If sender Is Me.un Then calcul.Text = calcul.Text & 1
If sender Is Me.deux Then calcul.Text = calcul.Text & 2
If sender Is Me.trois Then calcul.Text = calcul.Text & 3
If sender Is Me.quatre Then calcul.Text = calcul.Text & 4
If sender Is Me.cinq Then calcul.Text = calcul.Text & 5
If sender Is Me.six Then calcul.Text = calcul.Text & 6
If sender Is Me.sept Then calcul.Text = calcul.Text & 7
If sender Is Me.huit Then calcul.Text = calcul.Text & 8
If sender Is Me.neuf Then calcul.Text = calcul.Text & 9
If sender Is Me.zero Then calcul.Text = calcul.Text & 0

dejaok = False
ok.Focus()

End Sub

Private Sub point_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles point.Click

If dejapoint False Then calcul.Text calcul.Text & "."
dejapoint = True
ok.Focus()

End Sub
#End Region

#Region "boutons signes"
Private Sub additioner_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles additioner.Click

If signe = True Then ok_Click(sender, e)

calcul.Text = calcul.Text & "+"
plus = True

signe = True
ok.Focus()

End Sub

Private Sub soustraire_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles soustraire.Click

If signe = True Then ok_Click(sender, e)

calcul.Text = calcul.Text & "-"
moins = True

signe = True
ok.Focus()

End Sub

Private Sub multiplier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles multiplier.Click

If signe = True Then ok_Click(sender, e)

calcul.Text = calcul.Text & "*"
fois = True

signe = True
ok.Focus()

End Sub

Private Sub diviser_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles diviser.Click

If signe = True Then ok_Click(sender, e)

calcul.Text = calcul.Text & "/"
div = True

signe = True
ok.Focus()

End Sub

Private Sub efface_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles efface.Click

calcul.Text = ""
resultat.Text = ""
dejapoint = False
dejaok = False
plus = False
fois = False
moins = False
div = False

ok.Focus()

End Sub


Private Sub ok_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ok.Click
Dim res As Double
Dim nb As Integer
Dim terme() As String

If plus = True Then
terme = Strings.Split(calcul.Text, "+")	'récupere les termes du calcul
nb = terme.Length	'nbre de termes

res = Val(terme(0))
For i = 1 To nb - 1
res = res + Val(terme(i))	'calcul
Next
End If

If moins = True Then
terme = Strings.Split(calcul.Text, "-")
nb = terme.Length

res = Val(terme(0))
For i = 1 To nb - 1
res = res - Val(terme(i))
Next
End If

If fois = True Then
terme = Strings.Split(calcul.Text, "*")
nb = terme.Length

res = Val(terme(0))
For i = 1 To nb - 1
res = res * Val(terme(i))
Next
End If
If div = True Then
terme = Strings.Split(calcul.Text, "/")
nb = terme.Length

res = Val(terme(0))
For i = 1 To nb - 1
res = res / Val(terme(i))
Next
End If
If res = 42 Then
calcul.Text = "la réponse à la vie, l'univers, et tout le reste !"
Else
resultat.Text = res
calcul.Text = res
End If

dejapoint = False
dejaok = True
signe = False
plus = False
fois = False
moins = False
div = False
ok.Focus()
End Sub
#End Region
#End Region

Private Sub Form1_Activated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Activated
If plus True Or moins True Or fois = True Or div = True Then signe = True Else signe = False
End Sub
End Class



[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
mathieutu Messages postés 5 Date d'inscription jeudi 11 novembre 2010 Statut Membre Dernière intervention 23 novembre 2010
23 nov. 2010 à 22:42
ok merci beaucoup.
effectivement j'ai modifié la gestion du res et ça va beaucoup mieux.
J'ai aussi viré le form1_activated car en mettant signe=false dans efface_clique et efface_clique dans form1_load

Par contre j'ai gardé mes chiffres comme avant, vu que je ne sais pas comment marche le "sender" et le "Me" j'avoue que pour sender, me, e et tout ça j'ai laisser vb.net gérer ça mais je sais pas du tout à quoi ça correspond...
De plus la saisis au clavier ne marchait pas..

Bon en tout cas merci ! j'ai un peu du mal à comprendre exactement ce qui ne marchait pas donc on dira une mauvaise utilisation du res, qui finalement ne sert strictement à rien à part déconner un peu !
(42)

Bon maintenant je me concentre sur mon sqrt et mon exposant.

Ah dernière question : si je veux qu'on puisse annuler les dernières actions en appuyant sur backspace ca peut se faire facilement ?

@+
Mathieu
0
mathieutu Messages postés 5 Date d'inscription jeudi 11 novembre 2010 Statut Membre Dernière intervention 23 novembre 2010
23 nov. 2010 à 22:53
Juste une mise à jour !
j'ai compris d'où venait l'erreur.

c'était dans mon form1_activated apparemment, je crois qu'en débugage normal, "signe" ne passait jamais à true
(pourquoi ?? aucune idée..)
donc on corrige le bug en le faisant passer manuellement, dans chaque procédure de signe comme Casy l'a fait (c'est ce qui m'a fait comprendre), et en le mettant à false dans efface_click...

Problème résolu, merci à vous !
0
Rejoignez-nous