我有以下代码,我想使用在调用过程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
processDistances
我添加了return $distances
,proc operation
之后我添加了proc 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
请帮帮我。
答案 0 :(得分:0)
嗯,代码说distances
变量是全局的,这很好,但在实际编写之前 - 模拟器回调在模拟时间5.5发出后 - 你仍然可以&#39;从中读取;在Tcl中,变量不存在,除非它中有某些东西,即使该东西是空字符串。您可以随时执行此操作,使变量可读(即,使其始终包含某些内容):
if {![info exist ::distances]} {
set ::distances {}
}
如果您在脚本开头设置变量,则可以跳过info exist
测试部分。