问题与tcl数组索引和函数中传递数组

时间:2017-02-15 15:12:40

标签: tcl

我有两个问题:

在我的一个tcl函数中,声明并初始化数组如下:

 foreach port $StcPorts {
  set dutport [lindex $DutPortsTmp $i]

  set STCPort($dutport) [list 0 [lindex [lindex $cardlist $port] 0] [lindex [lindex $cardlist $port] 1]]
}

这对我来说非常困惑,因为我是tcl的新手。请帮助我理解上面关于STCPort创建的代码。

问题2:

在同一个文件中,STCPort的使用方式如下:

 foreach dutport $DutPortsTmp {
    set slot [lindex $STCPort($dutport) 1]
    set port [lindex $STCPort($dutport) 2]
    set hPort [stc::create port -under $hProject -location //$stcipaddress/$slot/$port -useDefaultHost False ]
    lappend STCPort($dutport) $hPort
 }

我已经找到了这个文件,我的要求是将hPort值放在另一个驻留在另一个文件中的函数中并对其进行处理。下面是函数d_stc:

proc d_stc {args} {
   global DutPorts STCPort 

   upvar 1 $STCPort _STCPort

   #I am trying to get hPort by array index below:
   foreach DutPort $DutPorts {
    set card [lindex $_STCPort($DutPort) 1]
    set port [lindex $_STCport($DutPort) 2]
    set hport [lindex $_STCPort($DutPort) 3]

   }

而且,我收到以下错误:

 can't read "STCPort": variable is array
 while executing
"upvar 1 $STCPort _STCPort"
 (procedure "d_stc" line 3)

我使用global来访问此函数中的数组。但是,我哪里出错了?

谢谢,

1 个答案:

答案 0 :(得分:2)

foreach port $StcPorts {
    set dutport [lindex $DutPortsTmp $i]

    set STCPort($dutport) [list 0 [lindex [lindex $cardlist $port] 0] [lindex [lindex $cardlist $port] 1]]
}

此代码段遍历列表StcPorts的元素,这些元素似乎是表示某种端口号的整数。对于每个端口号,通过从列表dutport中获取 ith 元素来生成数组索引(存储为DutPortsTmp)。此代码段无法解释i的值。同样对于永远的端口号,创建数组STCPort中的数组值,其上面创建了索引,并且构造的值如下所示:

  • 获取与整数索引cardlist对应的列表port中的元素(称为C)
  • 从三个项目0中创建一个列表, C 中的第一个子项目,以及 C 中的第二个子项目。

foreach dutport $DutPortsTmp {
    set slot [lindex $STCPort($dutport) 1]
    set port [lindex $STCPort($dutport) 2]
    set hPort [stc::create port -under $hProject -location //$stcipaddress/$slot/$port -useDefaultHost False ]
    lappend STCPort($dutport) $hPort
}

再次出现用于创建数组索引的列表DutPortsTmp。我们处理列表中的每个项目,列表项/数组索引再次命名为dutport。对于每次迭代,我们查看相应的数组项,将slot设置为数组项的第二项值(上面 C 中的第一项)和{{ 1}}到数组项的第三项值( C 中的第二项)。将port的调用结果分配给变量stc::create port,并使用新的列表项扩展数组项的值,该值为hPort

hPort

这应该是:

proc d_stc {args} {
   global DutPorts STCPort 

   upvar 1 $STCPort _STCPort

   #I am trying to get hPort by array index below:
   foreach DutPort $DutPorts {
    set card [lindex $_STCPort($DutPort) 1]
    set port [lindex $_STCport($DutPort) 2]
    set hport [lindex $_STCPort($DutPort) 3]

}

更正的片段再次遍历proc d_stc {args} { global DutPorts STCPort foreach DutPort $DutPorts { set hport [lindex $STCPort($DutPort) 3] } } 的数组索引,但这次使用STCPort代替DutPorts来获取数组索引。 DutPortsTmp变量获取每个数组项中第四项的值。

但是:hport中的值永远不会在任何地方使用或返回,并且该值会被每个新项目中的新值覆盖。

hport

不起作用,因为upvar 1 $STCPort _STCPort 中没有字符串值。如果从全局级别调用该过程,则可以使用:

STCPort

(看到区别?不是upvar 1 STCPort _STCPort 的值,而是字符串STCPort本身。)你不需要这个:"STCPort"的调用已经使得数组程序中可见global DutPorts STCPort