Page 1 sur 1

Procedure

Publié : lun. 15/mars/2004 22:41
par hackotedelaplaque
Encore une dernière question pour la route.

Est- il possible de faire une procedure qui accepte un nombre variable d'arguments (disons de 2 arguments minimum à 6 maximum pour prendre un exemple) ?

Si oui comment fait on ?

Merci !

Publié : mar. 16/mars/2004 6:10
par filperj
Non. C'est prévu pour une prochaine version de PB, mais pour l'instant non.
Par contre, tu peux toujours ruser, par ex en donnant à ta proc le pointeur vers le 1er élément d'un tableau et le nombre d'éléments à traiter.

Publié : mar. 16/mars/2004 7:17
par Guimauve
Il y a une solution, tu peux appeler ta procédure avec les 6 paramètres et tu mets une valeur nulle aux paramètres que tu n'as pas besoin. Ça t'oblige à faire des tests et ça ralenti le programme mais tu peux sûrement te dépanner avec cette technique. À toi de l'adapter pour tes besoins.

Regarde l'exemple suivant :

Si le paramètre Rayon.f est égal à 0 on fait quelque chose.
Si le parametre Volume.f est égal à 0 on fait autre chose.

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; Volume d'une Sphère
; Lors de l'appel de la procédure, la valeur (.f) recherché doit être égale à 0

Procedure.f VolumeSphere(rayon.f,volume.f)

 pi.f = 3.141593 
 
     If volume = 0
          ProcedureReturn ((4 / 3) * pi * Pow(rayon, 3))
     EndIf
     
     If rayon = 0
          ProcedureReturn Pow(volume / ((4 / 3) * pi),(1/3))
     EndIf
     
EndProcedure
Tu peux pousser la technique plus loin en faisant une combinaision de paramètres. Dans ce cas, tu dois placer le test le plus long en premier, genre :

Code : Tout sélectionner

If param01 > 0 And param02 > 0 And param03 > 0
     Commande à faire ...
 
Elseif param04 > 0 And param05 > 0
     Commande à faire ...

Elseif param06 > 0
     Commande à faire ...

endif
A+
Guimauve

Publié : mar. 16/mars/2004 12:34
par Patrick88
filperj a écrit : Par contre, tu peux toujours ruser, par ex en donnant à ta proc le pointeur vers le 1er élément d'un tableau et le nombre d'éléments à traiter.
tu peux nous faire un bout de code, ça m'interesse de voir....

pat

Publié : mar. 16/mars/2004 22:52
par filperj
OK, un petit exemple:

Code : Tout sélectionner


Structure point3D
   x.f
   y.f
   z.f
EndStructure

Procedure.l leplusproche(*ref.point3D,*tests.point3D,nbtests.l)
   numproch=0
   distproch.f=Sqr(Pow(*tests\x-*ref\x,2)+Pow(*tests\y-*ref\y,2)+Pow(*tests\z-*ref\z,2))
   nbtests-1
   For t=1 To nbtests-1
      *tests+SizeOf(point3D)
      disttest.f=Sqr(Pow(*tests\x-*ref\x,2)+Pow(*tests\y-*ref\y,2)+Pow(*tests\z-*ref\z,2))
      If disttest<distproch
         distproch=disttest
         numproch=t
      EndIf
   Next
   ProcedureReturn numproch
EndProcedure




Dim despoints.point3D(9)

For t=0 To 9
   RandomSeed(t*t+Date())
   despoints(t)\x=Random(99000)*0.001
   despoints(t)\y=Random(99000)*0.001
   despoints(t)\z=Random(99000)*0.001
Next


DefType.point3D mamaison
mamaison\x=0.01
mamaison\y=17
mamaison\z=100.15

monvoisin=leplusproche(@mamaison,@despoints(0),10)

For t=0 To 9
   Debug "n°"+Str(t)
   Debug despoints(t)\x
   Debug despoints(t)\y
   Debug despoints(t)\z
Next
Debug "chez moi"
Debug mamaison\x
Debug mamaison\y
Debug mamaison\z

Debug "Le plus proche de chez moi est le n°"+Str(monvoisin)
Voilà, j'ai la flemme de commenter le code, mais demandez si ça vous semble pas clair...

Publié : mer. 17/mars/2004 14:40
par brossden
Bonjour
Juste ce petit mot pour dire un grand Bravo à "filperj"
Il est vrai que avec un minimum de réflexion, les commentaires non pas lieux d'être, et l'astuce est excellente ! :wink:

Publié : mer. 17/mars/2004 21:51
par filperj
:oops: C'est gentil, mais l'astuce n'est pas de moi! Tu l'as surement déjà vue sous d'autres formes.