Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Optimiser 4 "if" dansune boucle [ Archives Visual Basic / J'AI BESOIN D'AIDE !!!! :) ] (kakenette)

lundi 6 février 2006 à 00:09:39 | Optimiser 4 "if" dansune boucle

kakenette

Bonjour, voila jaurai voulu savoire si c pas possible d'optimiser ce code pour reduire le nombre de "if" ? je suis sur que sa doit etre possible lol, jai essaye une autre boucle dans la boucle mais sa change rien etant donner quil va faire 4 fois la boucle et donc 4 fois le test "if"...

Bon je suis consciente que je viens pas ici pour me faire servire sur un plateau le nouveau code ! sa minteresserai de voire les possibilitées ou si il ya dautre moyen de pouvoire optimiser ca :


For T = 1 To 50

    Rem Haut ( = 1 )
    If JMove(T) = 1 Then
    Joueur(T).Top = Joueur(T).Top - JMoveSpeed(T)
    If Joueur(T).Top <= JTop(T) Then JMove(T) = 0: Joueur(T).Top = JTop(T)
    End If
   
    Rem Bas ( = 2 )
    If JMove(T) = 2 Then
    Joueur(T).Top = Joueur(T).Top + JMoveSpeed(T)
    If Joueur(T).Top >= JTop(T) Then JMove(T) = 0: Joueur(T).Top = JTop(T)
    End If
    
    Rem Gauche ( = 3 )
    If JMove(T) = 3 Then
    Joueur(T).Left = Joueur(T).Left - JMoveSpeed(T)
    If Joueur(T).Left <= JLeft(T) Then JMove(T) = 0: Joueur(T).Left = JLeft(T)
    End If
    
    Rem Droite ( = 4 )
    If JMove(T) = 4 Then
    Joueur(T).Left = Joueur(T).Left + JMoveSpeed(T)
    If Joueur(T).Left >= JLeft(T) Then JMove(T) = 0: Joueur(T).Left = JLeft(T)
    End If
    
Next T




Merci! kakenette

lundi 6 février 2006 à 00:33:47 | Re : Optimiser 4 "if" dansune boucle

Galain

Membre Club
Salut kakenette

Essaie ceci et dis-moi si cela te convient

For T = 1 To 50
    Select case JMove(T)
          case 1  ' Haut
                 Joueur(T).Top = Joueur(T).Top - JMoveSpeed(T)
                 If Joueur(T).Top <= JTop(T) Then JMove(T) = 0: Joueur(T).Top = JTop(T)
          case 2  ' Bas
                 Joueur(T).Top = Joueur(T).Top + JMoveSpeed(T)
                 If Joueur(T).Top >= JTop(T) Then JMove(T) = 0: Joueur(T).Top = JTop(T)
          case 3  ' Gauche
                 Joueur(T).Left = Joueur(T).Left - JMoveSpeed(T)
                 If Joueur(T).Left <= JLeft(T) Then JMove(T) = 0: Joueur(T).Left = JLeft(T)
          case 4  ' Droite
                 Joueur(T).Left = Joueur(T).Left + JMoveSpeed(T)
                 If Joueur(T).Left >= JLeft(T) Then JMove(T) = 0: Joueur(T).Left = JLeft(T)
    End Select
    
Next T


GRENIER Alain

lundi 6 février 2006 à 00:50:30 | Re : Optimiser 4 "if" dansune boucle

kakenette

c se que javais pensée faire mais on ma dit que sa va pas changer le problem car les case il va les faire 1 par 1 comme meme

kakenette

lundi 6 février 2006 à 01:08:08 | Re : Optimiser 4 "if" dansune boucle

Galain

Membre Club

Salut Kakenette

Avec les 4 If le programme va les tester un par un jusqu'à trouver le bon bloc à traiter 
Avec select case le programme va directement au bon bloc à traiter ans les tester un par un

Dans le second cas tu gagnes du temps
GRENIER Alain

lundi 6 février 2006 à 01:09:42 | Re : Optimiser 4 "if" dansune boucle

Galain

Membre Club
Salut Kakenette

Faute de frappe : sans les tester un par un

Avec les 4 If le programme va les tester un par un jusqu'à trouver le bon bloc à traiter 
Avec select case le programme va directement au bon bloc à traiter sans les tester un par un

Dans le second cas tu gagnes du temps


GRENIER Alain

lundi 6 février 2006 à 01:26:18 | Re : Optimiser 4 "if" dansune boucle

kakenette

na jai un amis "BurNews" il dit que sa les test un par un car il dit que le compilateur n'est pas devaint enfin voila en attendant jutilise ta solution, celle que je voulais faire.

mais je suis sur que je peut enlever le select case et les if en treiton direcement la valeur de JMove(T)

kakenette

lundi 6 février 2006 à 01:38:41 | Re : Optimiser 4 "if" dansune boucle

Galain

Membre Club
Brunews a raison : dans les 2 cas on les teste un par un et je reconnais m'être trompé
Désolé

GRENIER Alain

lundi 6 février 2006 à 01:42:09 | Re : Optimiser 4 "if" dansune boucle

ScSami

Membre Club
Dis donc, toi tu sais choisir tes amis !!! Si BruNews le dit c'est que c'est vrai et on se doit donc de s'incliner.

Cependant, je pense quand même qu'un Select Case reste plus "pratique" dans ce genre de cas.
Mais je ne vois pas ce qu'ici on pourrait réduire si ce n'est le nombre de joueurs!

Enjoy

( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )

lundi 6 février 2006 à 02:00:21 | Re : Optimiser 4 "if" dansune boucle

Gobillot

Salut,
ça les teste un par un jusqu'au moment où il trouve
c'est à dire que pour le cas 1 les autres cas sont pas traités, pour le cas 2 on gagne le test 3 et 4, etc...
tout ceci pouvant être remplacé par des ElseIf.

pour utiliser JMove(T) il faudrait l'utiliser en tant qu'opérateur
            Top  et Left
JMove(1) --> -1 et  0
JMove(2) --> +1 et  0
JMove(1) -->  0 et -1 
JMove(2) -->  0 et +1
traiter Left et Top en même temps, mais ça n'empêchera pas les autres tests qui sont différents à chaque fois donc gain de temps ???

NB:
ce qui semble bizarre c'est qu'il n'y a pas de valeurs mini et maxi pour JTop et JLeft
If Joueur(T).Top <= JTopMin(T) Then ...
If Joueur(T).Top >= JTopMax(T) Then ...

Daniel

lundi 6 février 2006 à 05:38:34 | Re : Optimiser 4 "if" dansune boucle

Zlub

Membre Club

Salut kakenette,



Le cas des ElseIf est pas mal vu qu'on arrete de tester des qu'on trouve un test à True.

If JMove(T) = 1 Then 
    ' Haut ( = 1 )
ElseIf JMove(T) = 2 Then 
    ' Bas ( = 2 )
ElseIf JMove(T) = 3 Then 
    'Gauche ( = 3 )
Else 
    ' Droite ( = 4 )
End If

Mais pas top, je m'explique avec deux cas extremes :

- si
JMove(T) = 1  alors on fait 1 test (nickel)
- si
JMove(T) = 4  alors on aura fait 3 tests  (pas top, mais mieux que tes 4)

Tout dépend de la répartition des tes valeurs. Si tu as plus de cas 4 que de cas 1 c'est pas génial.



Tu peux réduire le nombre de test en orientant la recherche de façon dichotomique. En gros, c'est la stratégie visant à diviser pour mieux regner.

Je te propose donc de réduire de moitié les tests effectués à chaque tour.
L'idée c'est de derterminer  :

1) si on est dans le couple (droite,gauche) ou dans le couple (haut,bas)
2) puis afiner pour trouver le bon cas




Const HAUT = 1 
Const BAS = 2 
Const GAUCHE = 3 
Const DROITE = 4 

Sub test() 

  For T = 1 To 50 
    If JMove(T) < GAUCHE Then 
      If JMove(T) = HAUT Then 
        ' Haut
        Joueur(T).Top = Joueur(T).Top - JMoveSpeed(T) 
        If Joueur(T).Top <= JTop(T) Then JMove(T) = 0: _ 
            Joueur(T).Top = JTop(T) 
      Else 
        ' Bas
        Joueur(T).Top = Joueur(T).Top + JMoveSpeed(T) 
        If Joueur(T).Top >= JTop(T) Then JMove(T) = 0: _ 
            Joueur(T).Top = JTop(T) 

      End If 

    Else 
      If JMove(T) = GAUCHE Then 
        'Gauche
        Joueur(T).Left = Joueur(T).Left - JMoveSpeed(T) 
        If Joueur(T).Left <= JLeft(T) Then JMove(T) = 0: _ 
            Joueur(T).Left = JLeft(T) 
      Else 
        ' Droite
        Joueur(T).Left = Joueur(T).Left + JMoveSpeed(T) 
        If Joueur(T).Left >= JLeft(T) Then JMove(T) = 0: _ 
            Joueur(T).Left = JLeft(T) 
      End If 

    End If 
  Next i 

End Sub 



Ainsi à chaque tour de boucle, il ne sera fait que deux tests au lieu des quatre que l'on avait tant avec la méthode des If que celle des Select


On passe donc dans le pire des cas

de 50 * 4  = 200 tests  (If -
Select)
à  50 * 3   = 150 tests (ElseIf)
à  50 * 2   = 100 tests

En stockant dans une variable en début de boucle, le contenu de JMove(T) et en utilisant cette variable dans les tests, c'est possibles que tu gagnes un peux de temps.

NB: tu devrais utiliser des constantes pour aider à la lisibilitée de ton code et également à la maintenance. Ecrire en dur dans le code des valeurs, c'est souvent pas une bonne idées.


A toi de selectionner le code qui convient en fonction de la répartition de tes données dans le tableau.

Bon dev,

++

Zlub


1 2 3 4

Cette discussion est classé dans : boucle, left, joueur, top, jmove


Répondre à ce message

Sujets en rapport avec ce message

!!!KeyCode!!! [ par luke44 ] bon, je veut que ImgQc se bouge sur la form (en haut lorsque la fleche vers le haut est enfoncée, en bas lorsque c'est la flèche du bas, à gauche pour A l'aide, please, je deviens fou... !!! :) [ par echo200 ] Bonjour,J'ai un petit problème "d'apparition de fenètres"...En plus clair :Sur un projet de popup, j'ai voulu ajoutter un splash screen afin de laisse Créer des OptionButtons dynamiquement : AIDEZ MOI SVP [ par mayerp ] Bonjour,Voilà, j'aimerai créer dynamiquement une frame contenant 2 optionbuttons.J'arrive à créer les frames, mais les boutons d'option n'apparaissent utiliser VERSION 5.00 [ par Yesai ] Quand j'ecris mon programme sur un fichier txt que je le converti en .frm le programme me dis ke l'entré depasse la fin du fichier:" dans le fichier l technique de prog pour casse brick [ par bobo91 ] bonsoir tous le mondeje connais pas la technique pour les coordonnees de la balle par rapport au brick si kelk1 connai une reponse merci d'avance et t aide 'aspiration' [ par retaks666 ] Bonjour, je voudrait faire en sorte, a l'aide d'un timer que des objets se dirigent vers le centre de la form puis quand ils soient au mileu reviennen pb keydown qui ne se déclenche pas [ par acorna ] hello, j'ai un petit souci concernant le keydown, qui ne se déclenche pas lors de l'appui sur les touches (ds mon cas les flèches directionnelles). pb n°2 pour fair un pong [ par dOsSpr0uTosS ] salut à tous,j'ai encor un problèm pour fair un pong deux joueur^^j'ai mon interface qui est fait de deux labels(pour les points)de deux raquettes et Position de fenêtre VB6 [ par valtrase ] Lut,J'ai une fenêtre (Form1) avec un labelsi j'ouvre une 2ème fenêtre comment faire pour que son .top et son .left corresponde au .top et .left du lab creer en dynamique des OptionButton [ par mayerp ] Bonjour,Les 2 Boutons d'option sont deja sur ma form dans une frame avec tous les deux un index à 0 ( comme tous mes autres controles).Donc je fais bi


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,484 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.