ns2中的“无法读取:变量是数组”错误

时间:2013-06-02 19:54:01

标签: tcl ns2

在ns2中,我使用

声明了一个简单的数组
array set ktree {}   

然后我尝试将它用作GOD变量

create-god $ktree

但这会产生错误

can't read "ktree": variable is array
while executing
"create-god $ktree {}"

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

在Tcl中,$varName表示“从名为varName 的变量中读取”并不是对变量的一般引用(与其他一些语言不同,特别是Perl和PHP ,做不同的事情)。从整个数组中读取,而不是该数组的元素,在Tcl中始终是一个错误。

要将数组传递给命令,请传入该数组的名称。然后由该命令根据其认为合适的方式访问它。对于用Tcl编写的过程和方法,通常需要upvar将数组链接到本地​​视图。 (直接用C或C ++编写的东西的限制要少得多,因为它们不会自动推送Tcl堆栈帧。)

但是请注意,当您传入该名称时,命令必须期待数组的名称。(当然,优秀的程序员会记录这个事实。)create-god是否支持,我真的不知道;它不是一般的Tcl命令,而是更具体的东西。 (ns2的一部分?或者也许是你自己的代码。)


传入数组的示例

按名称传入数组的示例是parray命令,该命令应该是每个Tcl分发的一部分。这是一个打印出阵列的程序。这是source code没有几个锅炉评论:

proc parray {a {pattern *}} {
    upvar 1 $a array
    if {![array exists array]} {
        error "\"$a\" isn't an array"
    }
    set maxl 0
    set names [lsort [array names array $pattern]]
    foreach name $names {
        if {[string length $name] > $maxl} {
            set maxl [string length $name]
        }
    }
    set maxl [expr {$maxl + [string length $a] + 2}]
    foreach name $names {
        set nameString [format %s(%s) $a $name]
        puts stdout [format "%-*s = %s" $maxl $nameString $array($name)]
    }
}

这里的关键是我们首先看到upvar 1将调用者中的命名变量绑定到局部变量,并使用array exists进行测试以查看用户是否确实传入了一个数组(以便给出一个好的错误信息而不是一个垃圾信息。其他一切只是实现如何实际打印关联数组(找出最大键长度和做一些格式化输出);它只是简单的Tcl代码。