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 !

Publié : mer. 17/mars/2004 21:51
par filperj

C'est gentil, mais l'astuce n'est pas de moi! Tu l'as surement déjà vue sous d'autres formes.