Appel d’une procédure via son adresse.

Programmation d'applications complexes
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Appel d’une procédure via son adresse.

Message par Mytic »

J’ai besoin de votre avis....

Je veux optimier un code ! , une bonne partie ressemble à ça :

Procedure x1 (p.l)
...
Endprocedure

Procedure x2 (p.l)
...
Endprocedure

Procedure x3 (p.l)
...
Endprocedure

Etc…

For I = 0 to max
IF p(i) = “x1” : x1 (p.l) :goto Fi: Endif
IF p(i) = “x2” : x2 (p.l) :goto Fi: Endif
IF p(i) = “x3” : x3 (p.l) :goto Fi: Endif
etc...

Fi:
Next i

Je voudrai l’optimiser, on faisant ça :
For i = 0 to max
Goto p(i) :
Next i

Avec p(i) l’adresse de la procédure.
Pas vraiment avec un GOTO , mais autre chose.
Je sais pas s’il y’a une telle commande dans PureBasic, mais pour le moment je procède comme ça :

Code : Tout sélectionner

p(i) = @x1()
 
puis 

GoToEIP(p(i))
et ça marche très bien...
Y'a t'il un risque de conflits ou pas ?

Merci d'avance :?
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

En fin de compte, il y a un problème de retour avec ProcedureReturn.
Je garde l’ancienne méthode, c’est plus sûr.
8O
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

C'est quoi ce goto ???
Tu sais que tu peux sortir d'une boucle avec break ?

Je n'ai pas trop compris ce que tu cherchais à faire, mais un truc de ce genre ça n'irait pas ?

Code : Tout sélectionner

Prototype Toto(p.l)
Global Truc.toto 
    
Procedure x1(p.l)
  ProcedureReturn p*2
EndProcedure

Procedure x2(p.l)
  ProcedureReturn p*p
EndProcedure 

truc=@x1()
Debug truc(4)
truc=@x2()
Debug truc(4)
ou encore

Code : Tout sélectionner

Prototype Toto(p.l)
Global Truc.toto 
Dim p(1)
Declare x1(p.l)
Declare x2(p.l)
p(0)=@x1()
p(1)=@x2()    
Procedure x1(p.l)
  ProcedureReturn p*2
EndProcedure

Procedure x2(p.l)
  ProcedureReturn p*p
EndProcedure 

For i=0 To 1
  Truc=p(i)
  Debug Truc(4)
Next i 
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Merci pour l’intérêt, mais je ne veux pas sortir de la boucle, pour le goto c’est pour économiser les testes IF, (je pouvais utiliser un simple Select case, mais c’est pas très rapide coté performances)
Sinon ce que je veux, c’est faire appel à la procédure non pas avec son nom, mais son adresse directement.

Merci beaucoup… j’avais oublié les Prototypes ,Problème résolu grâce à toi comtois .
:wink:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Mytic a écrit :Merci pour l’intérêt, mais je ne veux pas sortir de la boucle, pour le goto c’est pour économiser les testes IF, (je pouvais utiliser un simple Select case, mais c’est pas très rapide coté performances)
Et tu ne peux pas virer ton affreux Goto en remplaçant Break par Continue ?

Perso je n'ai jamais eu besoin d'utiliser Goto , il y a toujours une solution plus élégante.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Déjà je n’utilise pas une Boucle For Next , mais Repeat untile.
Et dans cette boucle y’a des testes avec IF , plus de 100 testes.
Et pour optimiser la chose, une fois qu’un teste s’avère juste, il saute tout les autres testes avec un goto vers le untile pour gagner du temps.

Au fait, pourquoi vous n’aimez pas GOTO ?, il est mignon pourtant, et très rapide !!
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Mytic a écrit :Au fait, pourquoi vous n’aimez pas GOTO ?, il est mignon pourtant, et très rapide !!
moi j'adore !! :D

sans ; j'arrêterai Purebasic !! :)

je l'utilise pour les meme raisons que toi , bien souvent !! :)
ou alors pour relancer a nouveau la batterie de tests, pour etre sur qu'un test
sois choisi apres la validation d'un test (presque recursif pour le coup :lol: )


ce sont les Snobs du langage C qui en general crache sur le Goto
parceque eux, ils l'avaient pas :lol:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Comme Comtois, je ne l'utilise pas.

J'ai fait une tentative, une fois, et j'ai eu des remords :roll:
Je l'ai viré pour mettre du code structuré :D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Dobro a écrit :ce sont les Snobs du langage C qui en general crache sur le Goto
parceque eux, ils l'avaient pas :lol:
Erreur :
B.W. KERNIGHAN & D.M. RITCHIE a écrit :Le langage C fournit l'instruction goto dont on a trop souvent abusé, ainsi que les étiquettes pour effectuer des branchements.
Sur le plan formel, goto n'est jamais nécessaire et, en pratique, son emploi peut-être presque toujours évité.
Ah les têtes de bois !!

Tu peux très bien utiliser Continue dans une boucle Repeat !

Code : Tout sélectionner

k=0
Repeat
k + 1
If k=10
  Continue ; Si k =10 tout ce qui suit n'est pas exécuté !
EndIf

Debug k
 
Until k>=20
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

oui mais Continue =8 octets !!

goto a= 6 octets !! :lol:
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Ah… Dobro , je t’engage comme avocat. :)

Re merci comtois pour l’info , je ne savais pas que Continue existait dans PureBasic.
:wink:
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Mytic a écrit :Ah… Dobro , je t’engage comme avocat. :)

Re merci comtois pour l’info , je ne savais pas que Continue existait dans PureBasic.
:wink:
j'utilise goto lorsque je supprime un clone, alors qu'il y a d'autres tests de clones par la suite. C'est pas clair, hein ? ;)

clone A, identifiant=1: si supprime ce clone, alors goto fin

clone A, identifiant=2: si supprime ce clone, alors goto fin

clone A, identifiant=3: si supprime ce clone, alors goto fin

clone A, identifiant=4: si supprime ce clone, alors goto fin

fin
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

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.

Mets une version réduite de ton code, on te dira quelle est la meilleure solution.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Dobro a écrit :oui mais Continue =8 octets !!

goto a= 6 octets !! :lol:
Punaise!

A l'heure ou on a déjà des milliards d'octets en trop, y compris sur les machines bas de gamme de chez carrefour, qu'on en a tellement qu'on sait même plus quoi en faire, faut qu'y vienne pinailler pour deux pauvres vieux octets en plus sur une instruction! :roll:
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Chris a écrit :
Dobro a écrit :oui mais Continue =8 octets !!

goto a= 6 octets !! :lol:
Punaise!

A l'heure ou on a déjà des milliards d'octets en trop, y compris sur les machines bas de gamme de chez carrefour, qu'on en a tellement qu'on sait même plus quoi en faire, faut qu'y vienne pinailler pour deux pauvres vieux octets en plus sur une instruction! :roll:
N'empêche qu'à l'heure actuelle, je n'arrive pas à faire au cpu une rotation fullscreen (en 1024x768 par exemple) en 75 images/sec, alors que j'arrivais à en faire une en 95 en 1280x512 à 25 images/sec sur un Amiga 1200 (accéléré avec un 68030 à 50Mhz). Bon tu me diras que ça ne sert à rien, et tu auras raison, lol!
Mais Purebreaker 3 sous Vista est plus lent que sur Windows 98 :(
Bienvenue en 2008...
Répondre