0

我已经阅读了线程,Cant read variable, isnt array,我认为可能以某种方式相关,但我不知道如何。在以下 TCL 片段中,测试了一个三维数组 ::stream 并读取了一个值。该数组包含一个标量 ID 值。片段中的最后一行创建了一个错误,上面写着

can't set "::streamId(1,10,1)": variable isn't array
    while executing
"set ::streamId($chas,$card,$port) $nextId"
    (procedure "getNextStreamId" line 28)

我将此解释为意味着 $nextId 不是标量,它不能放入标量的 3 维数组中。我对错误的解释不正确吗?我非常有信心该数组包含标量值,所以我开始认为这里可能存在一些数据安全问题。

# get current streamId
if { [ catch {info exists $::streamId($chas,$card,$port)} ] == 0 } {
if {$::testEnv(verbose) >= $verbLevel} {
    logInfo [getProcName] "pre-existing streamId found for: \
        \n dutAndPort:  $dutAndPort \
        \n ixiaPort:    {$chas $card $port}\
        \n streamId:    $::streamId($chas,$card,$port) \
        \n incrementing to next one..."
}
set nextId [ mpexpr $::streamId($chas,$card,$port) + 1 ]
} else {
if {$::testEnv(verbose) >= 0} {
    logInfo [getProcName] "No pre-existing streamId found for: \
        \n\t dutAndPort:    $dutAndPort \
        \n\t ixiaPort:      {$chas $card $port}\
        \n\t setting to 1"
}
set nextId 1
}
set curId  [ mpexpr $nextId - 1 ]

set ::streamId($chas,$card,$port) $nextId
4

1 回答 1

2

在你的代码中,我猜你想检查数组::streamId是否有索引$chas,$card,$port

info exists $::streamId($chas,$card,$port)

这是不正确的。你应该使用

info exists ::streamId($chas,$card,$port)

即没有美元符号。那么只有if循环才能保证索引的存在$chas,$card,$port

然后,最后您尝试将索引的值设置$chas,$card,$port$nextId.

set ::streamId($chas,$card,$port) $nextId

这是不正确的,因为它保留在索引的变量存在检查的 if 循环之外$chas,$card,$port

然后实际的错误消息是指存在一个名为streamId存在的标量变量的事实。

% set ::streamId 1
1
% set ::streamId(1,10,1) 20
can't set "::streamId(1,10,1)": variable isn't array
%

确保您没有相同的变量名称。

于 2017-12-09T02:29:26.733 回答