我有两个问题:
在我的一个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来访问此函数中的数组。但是,我哪里出错了?
谢谢,
答案 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)
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
。