Avec le debugger ca marche mais sans... ca marche pas

Résolu
firens Messages postés 68 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 24 août 2008 - 17 janv. 2006 à 21:05
firens Messages postés 68 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 24 août 2008 - 17 janv. 2006 à 22:32
Hello,



voila mon prob bizarre... j'ai fais une fonction qui permet de placer
une valeur TRUE dans un tableau en fonction de certaines comparaisons..



Pour générer l'index j'utilise un random sur une intervalle (c'est testé tout seul est ça fonctionne).

Malgré tout...lorsque je lance le programme ... il ne sort jamais de la
fonction.. par contre si j'utilise le débugger en faisant du pas a
pas.. la pas de problème..... A ne rien comprendre

8 réponses

firens Messages postés 68 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 24 août 2008
17 janv. 2006 à 22:27
En fait la boucle n'est pas infinie mais bien finie :)

Le seul problème je viens de le remarquer.. c'est que pour un petit intervalle (par exemple 19 à 25) et bien on a une probabilité non-nulle de tomber sur un séquence à deux voir une solution... on a donc effectivement à ce moment là l'impossibilité de tomber sur le bon nombre....alors que l'on pourrait avoir 7 possibilités différentes si l'on avait une vrai séquence aléatoire...
je pensais donc faire la chose suivante... simplement multiplié par 100 l'intervalle à randomizé...puis divisé par 100 le résultat et faire un round du genre :

intRandIntervalTemp = intvInterval.intMinIntv + Round(Int(Rnd * ((intvInterval.intMaxIntv - intvInterval.intMinIntv)*100))/100)

on augmente ainsi la probabilité de tomber sur le bon nombre ...faut que je teste
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 janv. 2006 à 21:16
C'est que l'on comprend pas grand chose au code de ta fonction que tu as eu l'amabilité de mettre pour nous expliqué ton problème

Met non ton code si tu veux que l'on puisse t'aider.

<hr size="2" width="100%">
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 janv. 2006 à 21:16
C'est vrai que l'on comprend pas grand chose au code de ta fonction que tu as eu l'amabilité de mettre pour nous expliqué ton problème

Met non ton code si tu veux que l'on puisse t'aider.

<hr size="2" width="100%">
0
firens Messages postés 68 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 24 août 2008
17 janv. 2006 à 21:19
Et maintenant on va me dire qu'on comprend rien lol...





'pour placer aléatoirement une pub dans un interval donné

Private Function SelectHour(intvInterval As Interval, blValidAdvert()
As Boolean, blLastValidAdvert() As Boolean, intMinDeltaHourPermission
As Integer) As Integer



Dim intRandIntervalTemp As Integer

Dim blValidateExclusion As Boolean

Dim intMin As Integer

Dim intMax As Integer



blValidateExclusion = True



'si on trouve une seule exclusion dans l'index pub choisi alors on recommence

Randomize

While blValidateExclusion



intMin = intMinDeltaHourPermission - 1

intMax = intMinDeltaHourPermission - 1

blValidateExclusion = False





intRandIntervalTemp = intvInterval.intMinIntv +
Int(Rnd * (intvInterval.intMaxIntv - intvInterval.intMinIntv))



'Pub toutes les heures donc vérifier si le chiffre donné est impair sinon on recommence

If intRandIntervalTemp And 1 Then

'Y avait-il une pub à la même heure le jour d'avant?

blValidateExclusion = blLastValidAdvert(intRandIntervalTemp)



'Est-ce une plage déja utilisée?

blValidateExclusion = blValidAdvert(intRandIntervalTemp)



'Pour ne pas dépasser l'intervalle donnée ce qui fausserait le résultat

If intRandIntervalTemp - intMinDeltaHourPermission < intvInterval.intMinIntv Then

intMin = intRandIntervalTemp - intvInterval.intMinIntv

End If

If intRandIntervalTemp + intMinDeltaHourPermission > intvInterval.intMaxIntv Then

intMax = intvInterval.intMaxIntv - intRandIntervalTemp

End If

'pas de pub présente dans à +/- intMinDeltaHourPermission de l'index pub choisi

For i = -intMin To intMax


blValidateExclusion = blValidateExclusion Or
blValidAdvert(intRandIntervalTemp + i)

Next

Else

blValidateExclusion = True

End If



Wend

SelectHour = intRandIntervalTemp

End Function
0

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

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 janv. 2006 à 21:58
Alors je n'ai pas réellement vu ton problème, il faut que tu vérifie tes conditions à l'intérieur du IF. Moi j'ai mis ce code en commentaire pour pouvoir tester et ça a l'air de marcher.

Par contre, j'ai vu 2 points :
- il te manque une condition de sortie de ta boucle, en effet si tu ne trouve pas de plage libre (soit utilisée la veille, soit utilisé aujourd'hui, soit trop près d'une autre), ta variable blValidateExclusion sera toujours à TRUE et tu ne sortira plus de ta boucle (boucle infini).
- revois tes tests blValidateExclusion blLastValidAdvert(intRandIntervalTemp) et blValidateExclusion blValidAdvert(intRandIntervalTemp). En effet même si ta plage a été utilisée la vielle (blLastValidAdvert=true) mais que ta plage n'est pas utilisée aujourd'hui (blValidAdvert=false) ta variable blValidate.. sera écrasé et prendra la valeur false et donc tu sélectionnera cette plage.

Peut-etre que ça te donnera une piste

<hr size="2" width="100%">
0
firens Messages postés 68 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 24 août 2008
17 janv. 2006 à 22:06
Oki merci

j'ai quand même pensé à une chose.. étant donnée que Randomize se base sur un timer.. on a donc une séquence pseudo-aléatoire...
Si on part tout le temps avec le même nombre... on aura donc la même séquence...au niveau du programme... la vitesse d'exécution pourrais poser problème j'ai l'impression...
Il n'y aurait pas moyen en VB d'avoir une séquence purement aléatoire (par modélisation d'un bruit blanc par exemple)...enfin c'est une idée je ne sais pas si tu connais des techniques valables ?
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 janv. 2006 à 22:19
Effectivement Randomize basé sur le timer renvoie un nombre pseudo-aléatoire, donc au bout d'un certain nombre d'appel, tu peux retomber sur la séquence.

Par contre je ne sais pas comment avoir un vrai nombre aléatoire, je ne me suis jamais posé la question, mais fait une recherche sur le site, il ya peut-etre la réponse.

Par contre pour ton code, tu gagnerais peut-etre à tout casser et à repenser ta fonctionnalité. Peut-etre que tu n'as pas pris la bonne piste. Cette possibilité de boucle infinie me perturbe.



<hr size="2" width="100%">
0
firens Messages postés 68 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 24 août 2008
17 janv. 2006 à 22:32
Ben voila ca marche

donc c'était bien ça.. maintenant ça bloque plus

Merci quand même d'avoir pris du temps pour moi.. t'as trouvé des autres bugs que j'avais pas vu ...donc merci pour tout
0
Rejoignez-nous