3

在 ns2 中,我使用声明了一个简单的数组

array set ktree {}   

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

create-god $ktree

但这给出了错误

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

任何帮助是极大的赞赏。

4

1 回答 1

2

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

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

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


传入数组的示例

按名称传入数组的一个例子是parray应该成为每个 Tcl 发行版一部分的命令。这是一个打印数组的过程。这是没有一些样板注释的源代码:

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 代码

于 2013-06-02T21:30:42.220 回答