Procedure

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Procedure

Message 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 !
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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.
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message 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
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message 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
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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...
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message 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:
Denis

Bonne Jounée à tous
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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.
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Répondre