[R] Fonction Call avec un nombre de paramètres variables

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Tetdoss
Niveau 3
Niveau 3
Messages : 39
Enregistré le : mar. 15 nov. 2011 23:23
Localisation : France 76
Status : Hors ligne

[R] Fonction Call avec un nombre de paramètres variables

#1

Message par Tetdoss »

Salut à tous, je sais pas du tout mais alors là pas du tout si c'est possible mais ça serait cool si on pouvait le faire car ça sera plus propre et plus pratique.

Je m'explique, je voudrais pouvoir utiliser la fonction Call mais en utilisant un nombre de paramètre définie au préalable.

Pour le moment, je suis obligé de faire comme ça :

Code : Tout sélectionner

Func _TetSrv_Recv($ClientID, $IP, $Data)
    
    If ($ClientID = $_TETSRV_CLIENTID) Then
        
        $Array = StringSplit($Data, "‚")

        Switch $Array[0]
            
            Case 2
                Call($Array[1], $Array[2])
            Case 3
                Call($Array[1], $Array[2], $Array[3])
            Case 4
                Call($Array[1], $Array[2], $Array[3], $Array[4])
            Case 5
                Call($Array[1], $Array[2], $Array[3], $Array[4], $Array[5])
        
        EndSwitch
    
    EndIf

EndFunc
Ça marche bien mais c'est un peu lourd de devoir écrire un case à chaque paramètre de plus. Je me demandais donc s'il existait un autre moyen...

En espérant me faire comprendre, merci d'avance ! N'hésitez pas si vous n'avez pas tout saisi.
Modifié en dernier par Tetdoss le ven. 25 nov. 2011 17:02, modifié 2 fois.
Tetdoss
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Des callbacks avec un nombre de paramètres variable

#2

Message par Tlem »

Un truc dans ce genre là :

Code : Tout sélectionner

Func _TetSrv_Recv($ClientID, $IP, $Data)
    If ($ClientID = $_TETSRV_CLIENTID) Then

        Local $Array = StringSplit($Data, "‚")
        Local $aCall[5]
        
        For $i = 1 to UBound($Array) - 1
            $aCall[$i] = $Array[$i]
        Next

        Call($aCall[1], $aCall[2], $aCall[3], $aCall[4], $aCall[5])
    EndIf
EndFunc
Si le nombre de paramètres peut être supérieur à 5, alors il sera facile d'adapter le code. ;)

Par contre, pour info, l'appel à la fonction Call n'a rien à voir avec une CallBack. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Des callbacks avec un nombre de paramètres variable

#3

Message par jchd »

Code : Tout sélectionner

Func _TetSrv_Recv($ClientID, $IP, $Data)
    If ($ClientID = $_TETSRV_CLIENTID) Then
        Call("ma_fonction", $Data)
    EndIf
EndFunc
Func Ma_Fonction($sData)
    Local $Array = StringSplit($sData, "‚")
    For $i = 0 To $Array[0] - 1
        ; traiter
    Next
    ; suite
EndFunc
Il y a d'autres possibilités, moins efficaces. Voir doc de Call()

Par contre je ne vois pas le nom de la fonction appelée dans vos codes, mes chéri[e]s ?
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Des callbacks avec un nombre de paramètres variable

#4

Message par matwachich »

Et pourquoi ne pas bien relire la documentation de Call??!!! :P
Le passage d'arguments sous forme d'un array, qu'il suffirait de construire???

Ou sinon, on peut toujours utiliser Execute
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Des callbacks avec un nombre de paramètres variable

#5

Message par Tlem »

Ce serait bien de connaitre la teneur des données reçue et quel est le but du traitement.

Perso, je verrais bien là un outil qui permettrait de lancer des commandes/fonctions AutoIt par le biais du réseau. :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Des callbacks avec un nombre de paramètres variable

#6

Message par jchd »

Oui j'avais commencé à composer une réponse avec "CallArgArray" mais me suis ravisé entretemps, dans l'expectative du QUOI COMMENT POURQUOI.

Décidément, on joue au jeopardy ces temps-ci, à peu de choses près.
Voici la réponse. Quelle est la question ?

Ce qui, mine de rien nous ramène à 42 :P
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Des callbacks avec un nombre de paramètres variable

#7

Message par sylvanie »

+1 avec matwachich
La fonction à déjà prévu le cas de figure de passage d'arguments par tableau
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Des callbacks avec un nombre de paramètres variable

#8

Message par jchd »

L'inconvénient est que la méthode "CallArgArray" implique que la fonction appellée accepte un nombre variable de paramètres, mais en nombre borné.
Tandis que si on passe un tableau...
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Des callbacks avec un nombre de paramètres variable

#9

Message par sylvanie »

Là j'ai du mal à comprendre.
D'après la lecture de l'aide, on a bien la possibilité de lancer un

Code : Tout sélectionner

Call("Fct_toto",$tableau_arg)
 
avec $tableau_arg contenant l'ensemble des paramètres passé à Fct_toto (en plus de l'entête spéciale).
Donc si on est bien dans ce cas de figure pourquoi ça pause problème sur le nombre borné ?
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Des callbacks avec un nombre de paramètres variable

#10

Message par jchd »

Regarde bien l'exemple avec "CallArgArray" : ta fonction appelée récupère 3 arguments s'il i a 4 entrées dans le tableau (avec [0] = chaîne magique) et pas le tableau entier.

Pour un nombre fixe d'arguments, ça va. sinon il faut faire :
Func Appelee($arg1 = Default, $arg2 = Default, ... $ArgN = Default) mais on est limité à N et ensuite if faut utiliser @NumParams (<= N).
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Des callbacks avec un nombre de paramètres variable

#11

Message par Tlem »

Ceci devrait résoudre le problème :

Code : Tout sélectionner

Func _TetSrv_Recv($ClientID, $IP, $Data)
    If ($ClientID = $_TETSRV_CLIENTID) Then

        $Func = Stringleft($Data,StringInStr($Data, ",") - 1)
        $aArg = Stringsplit(Stringtrimleft($Data,StringInStr($Data, ",")), ",")
        $aArg[0] = "CallArgArray"

        Call($Func, $aArg)
    EndIf
EndFunc
Par contre, comme je l'ai déjà dit, je suis presque sur que le but de cette fonction est de lancer d'autres fonctions AutoIt à travers le réseau. Donc juste au cas ou, je signale ceci :
Documentation de la commande Call a écrit :Remarks
The function cannot be a built-in AutoIt function or plug-in function.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Des callbacks avec un nombre de paramètres variable

#12

Message par jchd »

Thierry,
La fonction appelée ainsi récupère autant d'argument que d'entrées dans $aArg (sauf $Arg[0]).
D'où ma remarque concernant le nombre variable d'arguments.

Comme on ne sait toujours pas le pourquoi du comment ...
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Des callbacks avec un nombre de paramètres variable

#13

Message par Tlem »

jchd a écrit :Comme on ne sait toujours pas le pourquoi du comment ...
Les paris sont ouvert ...

Moi je dit un dérivé de PsExec, mais pour des commandes AutoIt. :roll:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Des callbacks avec un nombre de paramètres variable

#14

Message par sylvanie »

C'est drôle que tu vois ça comme ça. Jusqu'à présent j'ai vraiment l'impression qu'il veut simplement synthétiser tous les appels à call avec 2 arguements (fct + tableau d'argument).
Mais bon aujourd'hui je ne suis pas très en forme
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Tetdoss
Niveau 3
Niveau 3
Messages : 39
Enregistré le : mar. 15 nov. 2011 23:23
Localisation : France 76
Status : Hors ligne

Re: [..] Fonction Call avec un nombre de paramètres variable

#15

Message par Tetdoss »

Hoho je vois qu'il y a eu pas mal de réponse à ce sujet. Désolé si le sujet n'était pas clair mais vous l'avez tous compris, j'envoie par le réseau un String avec le nom de la fonction à appeler et les paramètres ensuite.

Honte à moi, je n'ai pas lu l'exemple de la doc de Call... J'ai bien compris grâce à vous et à la doc et en fait c'est simple, même très simple !

J'adapte le dernier code de Tlem, merci beaucoup à tous ;)

PS : J'ai fait comme ça et ça marche super :

Code : Tout sélectionner

Func _TetSrv_Recv($ClientID, $IP, $Data)
    
    If ($ClientID = $_TETSRV_CLIENTID) Then
        
        $Array = StringSplit($Data, "‚")
        
        _ArrayDelete($Array, 0)
        
        $FunctionName = $Array[0]
        
        $Array[0] = "CallArgArray"

        Call($FunctionName, $Array)
        
    EndIf

EndFunc
Tetdoss
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Fonction Call avec un nombre de paramètres variables

#16

Message par Tlem »

Array.au3 fait 69Ko, donc si vous n'avez pas besoin d'autres fonctions de cet UDF, le plus simple reste le code que je vous ait écrit, sinon, effectivement _ArrayDelete() simplifie en apparence le code. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre