更改名称的变量的全局声明

问题描述:

我已经根据设备的端口号创建了变量。我怎样才能将它们声明为全局的,以便我可以在不同的函数中使用它们?更改名称的变量的全局声明

set txresults_$portIndex [stc::get $generator1 \ 
         -children-GeneratorPortresults] 

    set rxresults_$portIndex [stc::get $Analyzer1 \ 
         -children-AnalyzerPortresults] 
+1

“全局”或范围解析运算符“::”都可以完成这项工作。例如。 'set :: txresults_ $ portIndex ' – Dinesh

+4

另外,无论何时你有一个像'txresults_ $ portIndex'这样的名字,都可以考虑使用一个数组:'txresults($ portIndex)'(使用'global txresults'或':: txresults '使其成为全球性的)。 –

global命令可以在任何地方在过程放,不只是在它的顶部。

proc yourprocedure {...} { 
    set portIndex [something here] 

    # ... 

    global txresults_$portIndex rxresults_$portIndex 
    set txresults_$portIndex [stc::get $generator1 \ 
          -children-GeneratorPortresults] 
    set rxresults_$portIndex [stc::get $Analyzer1 \ 
          -children-AnalyzerPortresults] 

    # ... 
} 

但是...

这可能是一个坏主意,要做到这一点,与可变命名变量的工作是有点讨厌(你可以用[set …],而不是$…做到这一点,或者通过使用别名upvar,但它仍然很烦人)。相反,你应该使用数组来代替,因为这使代码更容易理解:

proc yourprocedure {...} { 
    global txresults rxresults 

    set portIndex [something here] 

    # ... 

    set txresults($portIndex) [stc::get $generator1 \ 
          -children-GeneratorPortresults] 
    set rxresults($portIndex) [stc::get $Analyzer1 \ 
          -children-AnalyzerPortresults] 

    # ... 
} 

当你这样做,你组中的所有这些变量命名的变量纳入变量的集合 - 数组 - ,你会得到

global txresults 
    do-something-with $txresults($portIndex) 

这是在可理解性方面比这些更好的替代品:

global txresults_$portIndex 
    do-something-with [set txresults_$portIndex] 
然后做只是指他们在别处
upvar ::txresults_$portIndex txr 
    do-something-with $txr 
+0

非常感谢Donal。 – user3565150