Appel d’une procédure via son adresse.

Programmation d'applications complexes
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

djes a écrit :Et le select case existe aussi. Et puis vouloir utiliser un goto pour éviter un if, et pourtant appeler une procédure, au niveau performances c'est du n'importe quoi.
ah oui, excusez moi, je raconte des bétises. D'ailleurs, avec peur basique, on peut voir que je n'utilisais déjà plus cette méthode:

Code : Tout sélectionner

; Affichage clone bonbon si existe.
 ForEach bonbon()

   If bonbon()\attract=0; Si ghost n'est pas à proximité d'un bonbon, alors ce dernier continu son chemin.
    bonbon()\x=bonbon()\x+bonbon()\sensx
    bonbon()\Y=bonbon()\Y+bonbon()\sensy
   EndIf
           
           
            ;ZoomSprite3D(#eonbon3D, 32+bonzoom, 32-bonzoom) ; 32, 32) 
   DisplaySprite3D ( bonbon()\id , bonbon()\x, bonbon()\Y, 255)
   DisplaySprite3D ( #eonbon3D , bonbon()\x-4, bonbon()\Y-4, 105)
   zattract=(30+10)
   If gtaille>80:zattract=(60+20):EndIf
   If gtaille>120:zattract=(90+30):EndIf
   If gtaille>160:zattract=(120+40):EndIf   
       
   bonbon()\attract=0; remise à 0 variable attraction
 
   If bonbon()\x+8>repereX-zattract And bonbon()\x+8<repereX+zattract And ghostaie<2   
    If bonbon()\Y+8>repereY-zattract And bonbon()\Y+8<repereY+zattract
     bonbon()\attract=1
     If bonbon()\x+8>repereX
      bonbon()\x-4
     Else
      bonbon()\x+4   
     EndIf
     If bonbon()\Y+8>repereY
      bonbon()\Y-4
     Else
      bonbon()\Y+4   
     EndIf
     
     If bonbon()\x+8>repereX-10-(zattract/10) And bonbon()\x+8<repereX+10+(zattract/10)   
      If bonbon()\Y+8>repereY-10-(zattract/10)  And bonbon()\Y+8<repereY+10+(zattract/10)
       mange=1:pointd=1:pointm=0:pointt=255:pointg=gtaille:pointn=niveau:pointX=bonbon()\x+8:pointY=bonbon()\Y+8
      EndIf
     EndIf
    EndIf
   EndIf
     
  ; Si un clone sort de l'écran, alors il faut le supprimer, mais...
  If  bonbon()\x>1024+128 Or bonbon()\x<0-128 Or bonbon()\Y>768+128 Or bonbon()\Y<0-128
   supprbonbon=1 ; ...soyons prudent...
  EndIf
   ; si ghost mange bonbon, alors...
   If mange=1 And ghostaie<2:supprbonbon=1:EndIf ; ...très prudent...
   
   If supprbonbon=1
     supprbonbon=0
     DeleteElement(bonbon()):LastElement(bonbon()); <- ...car ces 2 là, faut pas en mettre partout.
      If mange=1
     
        If energie<20:energie+1:EndIf   
        If gtaille<200:gtaille+10:EndIf 
     
        If gtaille<200:score+(10*niveau):EndIf
        If gtaille=200:score+(100*niveau):EndIf
     
        mange=0
      EndIf
   EndIf   

 
   
 Next 
Heu... j'ai quand même mis le couple DeleteElement(bonbon()):LastElement(bonbon()) à la fin de la boucle, donc c'est quand même délicat. grat, grat, bon, je ne suis pas encore arrivé à ce niveau lors de ma convertion de mon projet, commencé depuis 2 semaines( 3.000 lignes sur les 13.000, j'ai encore du boulot moi), je vous tiendrai au courant si j'arrive à me passer des goto...ou pas.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

:?:
Apparemment cette portion de code n'est pas concernée... Il y a quelque chose qui ne fonctionne pas? Mis à part le lastelement(), qui risque de causer un problème (regarde la syntaxe de deleteelement(), on peut mettre une option pour rester sur un element valide)

Pour revenir au débat, j'utilise parfois des goto, et après avoir fait de l'assembleur, je pense souvent en termes de gosub. Mais pour avoir un code propre et portable, l'utilisation de procédures est quand même préférable, surtout grâce à shared, protected, static... :)
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

djes a écrit ::?: Apparemment cette portion de code n'est pas concernée...
effectivement, cet exemple est trop simple. En fait, faudrai que je fasse un exemple...
Répondre