Pointeurs de fonction

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Pointeurs de fonction

Message par Dräc »

Le saviez-vous ?
Il est possible de récupérer l’adresse d’une procédure :

Code : Tout sélectionner

Procedure test(a,b)
  ProcedureReturn a+b
EndProcedure
*f=@test()
Ici, *f est un pointeur et comme il pointe l’adresse d’une procédure, on pourrait le nommer pointeur de procédure en Pure, mais le terme commun est pointeur de fonction (référence au C)

Du coup, on peut se servir de la commande CallFunctionFast pour executer une procedure en possédant son pointeur :

Code : Tout sélectionner

 Procedure test(a,b)
  ProcedureReturn a+b
EndProcedure

Procedure test2(a,b)
  Debug a+b
EndProcedure

c=10
d=20

*f=@test()
Debug CallCFunctionFast(*f, c, d)

*f=@test2()
CallCFunctionFast(*f, c, d)
Je vous laisse imaginer tout ce qu’il est possible alors de faire. Bref, que du bon :)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

bah oué on est plusieurs à le savoir ^^
http://purebasic.hmt-forum.com/viewtopi ... r+fonction

Dri

PS. c'est un sujet entre autres... ;)
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Je due passer à coté à cause du titre… mais c’est bien cela en effet ;)
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Et c'est meme très util pour faire des callback pour des userlib par exemple ;)
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

C'est aussi comme àa que l'on utilise les threads :wink:
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Dr. Dri a écrit :bah oué on est plusieurs à le savoir ^^
http://purebasic.hmt-forum.com/viewtopi ... r+fonction
A lire ce post, on apprend que ce serait une astuce limitée à Windows.
Pourtant, cela ne me semble pas évident.
Pour moi l’astuce se situe plus au niveau de l’utilisation de CallFunctionFast() comme fonctionnant aussi avec des fonctions autres que simplement issues d’une librairie, que sur la notion de pointeurs de fonction…
Bref, et la remarque d’Oliv vient appuyer ceci, normalement la notion de pointeurs de fonction existe déjà en Pure.

D’où ma question : est-ce que l’astuce CallFunctionFast() fonctionne aussi pour les utilisateurs Linux et AmigaOS ?
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Dräc a écrit :
Dr. Dri a écrit :bah oué on est plusieurs à le savoir ^^
http://purebasic.hmt-forum.com/viewtopi ... r+fonction
A lire ce post, on apprend que ce serait une astuce limitée à Windows.
Pourtant, cela ne me semble pas évident.
Pour moi l’astuce se situe plus au niveau de l’utilisation de CallFunctionFast() comme fonctionnant aussi avec des fonctions autres que simplement issues d’une librairie, que sur la notion de pointeurs de fonction…
Bref, et la remarque d’Oliv vient appuyer ceci, normalement la notion de pointeurs de fonction existe déjà en Pure.

D’où ma question : est-ce que l’astuce CallFunctionFast() fonctionne aussi pour les utilisateurs Linux et AmigaOS ?

Code : Tout sélectionner

CallFunctionFast()

Syntaxe

Resultat = CallFunctionFast(*PointeurFonction [,Parametre1 [, Parametre2...]]) 
Description

Appelle une fonction en librairie en utilisant son pointeur obtenu par IsFunction() ou par LibraryFunctionAddress(). Cette méthode est plus rapide. Le nombre de paramètres autorisés est quelconque mais doit correspondre exactement aux besoins de la fonction. Par exemple, si une fonction nécessite 2 paramètres, alors 2 paramètres doivent être passés même si les valeurs de ces 2 paramètres sont nulles. 'Resultat' contient le résultat de la fonction appelée. 

Note: Pour l'instant le nombre maximum de paramètres est 20. 
OS Supportés 

Windows, AmigaOS, Linux

Library - Index
La réponse est dans la doc :wink:
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

zut!...: Merci Oliv :wink:
Répondre