2016-08-06 1 views
0

Je dois modifier un paramètre nommé test à l'intérieur de process_data et changer de cas en dehors de cette fonction en fonction de la valeur test. Je ne pouvais pas le passer par référence en utilisant upvar parce que le process_data représente une fonction statique pour le traitement du paquet udp reçu, et il n'acceptera pas plus de deux paramètres 'taille et données'.
Aussi, autant que j'ai trouvé, il n'y a aucune valeur retournée pour la fonction process_data.Comment passer en référence à une fonction qui n'acceptera pas de nouveaux arguments?

code:

set test "0" 

Agent/UDP instproc process_data {size data} { 
    //some stuff 
    if (...) 
     set test "1" 
} 

// switch cases depending on test value. 

Répondre

1

Vous n'avez pas besoin d'un argument supplémentaire pour utiliser upvar si vous connaissez le nom de la variable que vous allez alias. Vous devriez être en mesure de faire l'une de ces (ne pas utilisation à la fois):

global test 
upvar #0 test test 

Il est pas vraiment la programmation modulaire classique, mais il fonctionnera.

Un bon endroit pour mettre la commande est au début du corps de la procédure, comme suit:

Agent/UDP instproc process_data {size data} { 
    global test 
    # some stuff 
} 

Même chose si vous utilisez upvar #0 test test (ces deux commandes sont essentiellement équivalentes).

Documentation: global, upvar

+0

Je ne suis pas un expert en codage tcl, donc pouvez-vous s'il vous plaît modifier votre réponse à être plus précis où mettre chacun, utiliser mon exemple, si vous le souhaitez. Merci –

+0

@EmadAldeen: fait. –

+0

A l'intérieur de 'process_data', je peux changer' test' comme j'aime, mais en dehors de 'process_data' il reste" 0 "comme je l'ai défini au début. –