Tcl &引用;can';t读取:变量为数组;ns2中的错误

Tcl &引用;can';t读取:变量为数组;ns2中的错误,tcl,ns2,Tcl,Ns2,在ns2中,我使用 array set ktree {} 然后我试着用它作为上帝变量 create-god $ktree 但这就产生了错误 can't read "ktree": variable is array while executing "create-god $ktree {}" 非常感谢您的帮助。在Tcl中,$varName表示“从名为varName的变量读取”,并且不是对该变量的一般引用(与其他一些语言不同,特别是Perl和PHP,它们做的事情截然不同)。在Tcl中,

在ns2中,我使用

array set ktree {}   
然后我试着用它作为上帝变量

create-god $ktree
但这就产生了错误

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

非常感谢您的帮助。

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

要将数组传递给命令,请在中传递该数组的名称。然后由该命令根据需要访问它。对于用Tcl编写的过程和方法,通常需要
upvar
将数组链接到本地视图中。(C或C++中直接写入的东西限制较少,因为它们不会自动推送TCL堆栈帧)。 但是请注意,在传入数组名称时,该命令必须使用该名称。(优秀的程序员当然会记录这一事实。)我真的不知道
是否创造了上帝;它不是一般的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
将调用者中的命名变量绑定到局部变量,然后使用
数组进行测试
,查看用户是否真的通过了数组(以便给出一个好的错误消息,而不是一个无用的错误消息)。然后,其他的一切都只是如何真正漂亮地打印关联数组的实现(找出最大键长度并进行格式化输出);这只是简单的Tcl代码。

@Chhama是的,很可能。这取决于你的意思。公正对待你提出的问题将使我无法发表评论;你能把它作为一个恰当的问题问吗?我不确定它是否会被接受为一个恰当的问题:)。我基本上想做的是使用tcl创建一个权重平衡的AVL树,而不使用OTcl。我的计划涉及结构,但我读到一个结构不能包含另一个结构,所以我在这里有点不知所措。