如何访问程序外的列表

时间:2017-06-24 18:29:01

标签: list tcl global proc

我有以下代码,我想使用在调用过程processDistances之后生成的排序列表来使用外部过程。我尝试使用全局命令通过声明distances全局内部过程并使用外部程序我也重写了global distances外部程序。但是得到了错误can't read "distances": no such variable

代码:

proc distance {n1 n2 nd1 nd2} {
    set x1 [expr int([$n1 set X_])]
    set y1 [expr int([$n1 set Y_])]
    set x2 [expr int([$n2 set X_])]
    set y2 [expr int([$n2 set Y_])]

    set d [expr hypot($x2-$x1,$y2-$y1)]

    return [list $nd1 $nd2 $x1 $y1 $d]
}
proc processDistances {count threshold {filter ""}} {
    global node_
    global distances
    set distances {}
    for {set i 1} {$i < $count} {incr i} {
        for {set j 1} {$j < $count} {incr j} {
            # Skip self comparisons
            if {$i == $j} continue

            # Apply target filter
            if {$filter ne "" && $j != $filter} continue

            # Get the distance information
            set thisDistance [distance $node_($i) $node_($j) $i $j]

            # Check that the nodes are close enough
            if {[lindex $thisDistance 4] < $threshold} {
                lappend distances $thisDistance
            }
        }
    }

    # Sort the pairs, by distances

    set distances [lsort -real -increasing -index 4 $distances]



    # Print the sorted list
    foreach tuple $distances {
        puts "{$tuple}"

    }
}
$ns at 5.5 [list processDistances $val(nn) 300 11]

实际上我希望这个排序列表在时间5.5作为另一个过程的参数,如

proc operation {distances} { 

所以时间也很重要。我必须在特定时间生成排序列表。有没有办法在特定时间将排序列表存储到新变量中?只是为了理解我想要的东西。

$ns at 5.5 [list processDistances $val(nn) 300 11]-->$nbr #(o/p i.e sorted list) 

更新: 1.我尝试在proc processDistances之外使用下面的代码,只是为了检查我是否可以将调用结果存储到变量中。但它会打印一个值170虽然我改变了11到41或时间..任何东西

set nbr {}
Set nbr [$ns at 5.5 [list processDistances $val(nn) 300 11]]
Puts $nbr
  1. 我也试过这个 在processDistances我添加了return $distancesproc operation之后我添加了proc
  2. proc final {} { set nbr {} set nbr [list processDistances 42 300 11] puts $nbr operation $nbr } $ns at 5.5 final

    但是把$ nbr命令赋予输出processDistances 42 125 41 请帮帮我。

1 个答案:

答案 0 :(得分:0)

嗯,代码说distances变量是全局的,这很好,但在实际编写之前 - 模拟器回调在模拟时间5.5发出后 - 你仍然可以&#39;从中读取;在Tcl中,变量不存在,除非它中有某些东西,即使该东西是空字符串。您可以随时执行此操作,使变量可读(即,使其始终包含某些内容):

if {![info exist ::distances]} {
    set ::distances {}
}

如果您在脚本开头设置变量,则可以跳过info exist测试部分。