Boucle et Overflow

cs_Merkator Messages postés 12 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 10 octobre 2007 - 29 avril 2005 à 19:02
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 - 3 mai 2005 à 11:41
Boucle :

Débutant en VB, je ne connais pas les balises servant à faire des boucles.
Mon but est de faire une boucle se répétant sans cesse tant que la condition n'est pas vrai.
Ca doit être une question toute bête, mais nécessaire.

Overflow :

Dans deux programme que je suis en train de faire, un message d'erreur s'affiche à un moment. Pour seul explication, il me marque : Overflow.

Qu'est-ce ?
Comment résoudre ce problème ?

( J'ai cru comprendre que c'était un problême lié au calcul )

Merci aux personnes qui m'aideront !

Bye

13 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
29 avril 2005 à 19:19
While - Wend, Do - Loop, Do until condition ou Do while condition, etc...

ton problème doit venir d'une variable qui s'incrémente et qui dépasse la capacité maximum, par exemple un Integer qui dépasse la valeur 32767.

Daniel
0
cs_Merkator Messages postés 12 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 10 octobre 2007
29 avril 2005 à 21:48
Merci pour ces précisions mais je n'ai pas réussi à mettre en pratique.

J'ai essayé les commandes :
While condition
....
Wend

Do
....
Loop

Do While condition

Le premier ne fonctionne pas.
Le second tourne sans arrêt, il n'y a pas de conditions.
Le troisième ne termine pas la boucle (selon ce que tu m'as mis!), comme celui que je n'ai pas essayé.

Par contre en faisant Do - Loop, j'ai pensé à arrêter la lecture du script ( et ainsi cassé la boucle ) en mettant une balise Stop. Le problême c'est que je ne sais pas si cet balise existe et comment s'en servir.

Voilà

Bye
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
29 avril 2005 à 21:55
c'est quoi la condition ?
si elle se réalise jamais tu as effectivement une boucle infinie.
si c'est un évênement extérieur que tu attends, il faut inclure un DoEvents dans ta boucle.

Daniel
0
cs_Merkator Messages postés 12 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 10 octobre 2007
30 avril 2005 à 09:59
Non ce n'est pas un évènement extérieur.

Je vais essayé de t'expliqué rapidement.

[ Jour ] [ Mois ] [ Année ]
{ OK }
[ Ce jour est un ............ ]

Voilà donc on entre un jour ( de 1 à 31 ), un mois et une année. Ensuite on clique sur OK. Et pour finir le logiciel t'affiche quel est le jour de la semaine correspondant ( du lundi au dimanche ).

Pour celà, j'ai fait un script assez, je compte le changez. Mais en gros sa marche comme sa :
A chaque retour de boucle je rajoute 1 jour et je rajoute 1 aussi dans le décompte des jours.
La différence entre les deux c'est qu'au bout de sept retour de boucles on en est à 7 jours, après on recommence à zéro, l'autre recommence à zéro quand il arrive à 30 ou 31 jours selon le nombre de jours du moi.

Donc la boucle tourne et tourne encore, ajoutant +1 au jours, puis +1 au mois, pourquoi pas +1 aux années, jusqu'à arrivé précisément sur le jour-Mois-Année demandé.
Là il ne suffit plus que de relever le nombre de jour (qui peut aller jusqu'à 7) et on trouve :

Si varjour = 1 on est un lundi
Si varjour = 2 on est un mardi
Si varjour = 3 on est un mercredi ... etc ...

Voilà j'espère avoir été clair.

Mais si tu pouvais m'expliquer pour la balise Stop se serait encore mieu.

Bye
0

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

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
30 avril 2005 à 10:56
Wahouh !!!!!!

excuse ma réaction.
alors comme ça si on te rentres le 1er janvier 1900 tu va boucler pendant plus de 38350 fois ?
je sais pas en quoi tu programmes, mais est-ce que tu connais Format$, CDate, DateSerial, etc...
je te laisse réfléchir pendant que je te prépare quelque chose.

Ps: pour sortir d'une boucle Do:
If Ladate = Date then Exit Do

Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
30 avril 2005 à 11:28
Private Sub Command1_Click()
Dim jour As Integer
Dim mois As Integer
Dim annee As Integer
Dim dat As Date
Dim J(7) As String

jour = 30
mois = 4
annee = 2005

On Error GoTo ERROR
dat = CDate(jour & "/" & mois & "/" & annee)
On Error GoTo 0

' le numéro de la semaine
MsgBox Format$(dat, "w", vbUseSystemDayOfWeek)
' le jour de la semaine
MsgBox Format$(dat, "dddd", vbUseSystemDayOfWeek)

' Table des jours
J(1) = "Lundi"
J(2) = "Mardi"
J(3) = "Mercredi"
J(4) = "Jeudi"
J(5) = "Vendredi"
J(6) = "Samedi"
J(7) = "Dimanche"
' par calcul direct
MsgBox J(((dat - 2) Mod 7 + 1))

Exit Sub

ERROR:
MsgBox "Date fausse"

End Sub

Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
30 avril 2005 à 11:38
à noter que les contrôles dates ne sont pas fiables.
si on inverse jour et mois, on obtient la même chose.

jour = 4
mois = 30
annee = 2005

Daniel
0
cs_Merkator Messages postés 12 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 10 octobre 2007
30 avril 2005 à 12:22
Nikel je z'yeute ton script cet ap, je te dit ce que j'en pense.

J'avais déjà commencé à chercher un nouveau script. Mais il n'ai pas fini encore. Dès que c'est bon je le mettrai ici.

Bye

PS : Rien à voir, mais sa sert à quoi Réponse acceptée !

Bye
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
30 avril 2005 à 12:38
il y a une correction à faire si date négative ( < 30/12/1899)
je la mets de mémoire parce que je l'ai plus.
c'est dans la dernière partie (calcul direct)

Dim s As Long

'dépassement de capacité si > 32767 ou < -32768
s = CLng(dat) - 2
'Modulo en négatif ça marche !
s = (s Mod 7) + 1
'mais il faut faire une correction
If s < 0 then s = s +1
MsgBox J(s)

Ps:
- à noter qu' en dessous de 1582 (quelque chose comme ça) les dates ne veulent rien dire (calendrier Julien)
- Réponse acceptée c'est pour signaler aux autres que la réponse a été trouvée.

Daniel
0
cs_Merkator Messages postés 12 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 10 octobre 2007
30 avril 2005 à 19:10
C'est du bon boulot.

L'erreur au niveau de l'échange mois jour est un peu cucu, mais elle doit être facile à balayé.

Sinon, je ne sais pas si tu as été obligé de faire ainsi, mais c'est vite lourd de voir marquer successivement le numéro du jour, puis le jour, puis le jour avec une Majuscule à la première lettre.

Ensuite, si on regarde l'année 2100 n'est pas bissextile, l'année 3000 n'ont plus (alors que l'année 2000 l'était), par contre les années 2400 et 2800 le sont.
Pas de panique c'est normale .

Bye et merci

PS : Je poursuis toujours mon script perso, que je mettrais ici.
Pendant que j'y suis, justement, est-ce que la balise isInteger existe (un peu comme la balise isNumeric)
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
30 avril 2005 à 19:25
- pour les majuscules c'est pas obligatoire, d'ailleurs toute la deuxième partie fait redondance avec la première, c'est seulement un exemple pour montrer qu'on peut obtenir le jour sans utiliser les Fonctions Vb.
- les inversions date et mois c'est à cause des dates anglaises, on peut faire un test du genre si jour < 1 ou jour > 31 then "date fausse", idem si mois < 1 ou mois > 12 then "mois faux"
- il n'y a pas de IsInteger .... désolé !!!
- IsNumeric() est encore moins fiable que IsDate()
voir une source à ce sujet:
http://www.vbfrance.com/code.aspx?id=30616

Daniel
0
cs_Merkator Messages postés 12 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 10 octobre 2007
3 mai 2005 à 08:19
Nan mais je m'en fiche de isNuméric. Je cherche juste une balise pour savoir si
un nombre est multiple de 7.

T'aurais pas une idée ?

Bye
(j'ai fait pété les smiles)
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
3 mai 2005 à 11:41
oui
If (nombre Mod 7) = 0 Then ... multiple de 7

Mod x = Modulo x
le reste de la division par x

Daniel
0
Rejoignez-nous