我目前正在使用一个循环将值迭代到Tcl中的进程(邻居)中。
for {set i 0} {$i < $val(nn)} {incr i} {
for {set j 0} {$j < $val(nn)} {incr j} {
$ns at 0.0 "neighbors $node($i) $node($j) $i $j"
}
}
上面的代码允许我在这个过程中使用所有我需要的值。然而,在进程内部,一些值被分配(到一个列表),不再需要遍历。该过程中的一个简短片段:
} else {
puts "..... Do nothing .... $nd1 - $nd2"
if {([lsearch -exact $heads $nd1] != -1) || ([lsearch -exact $members $nd1] != -1) } {
incr $nd1
}
}
这是该过程中循环的结束。puts
只是一个标记,但它会检查一个项目是否包含在两个列表中的任何一个列表中。如果它在任一列表中,则递增它,然后移动到下一个可能的值。不再需要对该值进行检查/循环,因为它已经被放入列表中。
如何防止该值继续被使用?“流程调用”循环将始终覆盖流程中发生的事情,因此即使分配的值也将继续使用。在Tcl中有不同的调用流程的方式吗?或者至少,以一种不同的方式将值提供给Tcl中的进程?或者我猜,把他们拉出来?
值得一提的是,下面是我希望提供给的进程(n1和n2是内存位置,nd1 nd2是实际的数字标识符)
set heads {}
set members {}
proc neighbors {n1 n2 nd1 nd2} {
global heads members bool allNodes
puts "Members --- $members"
puts "heads --- $heads"
if {([lsearch -exact $heads $nd1] == -1) && ([lsearch -exact $members $nd1] == -1) } {
lappend heads $nd1
set currentHead $n1
puts "Current Head: $currentHead $n1 $nd1"
} else {
puts "..... Do nothing .... $nd1 - $nd2"
if {$nd1 in $heads || $nd1 in $members} then return
#here I want it to go to the next nd1 value and NEVER use it again if it
#has already been processed
}
#Otherwise, do neighbor test with nd2
发布于 2019-07-11 03:47:42
如果neighbors
操作为symmetric (通常为true),则对所有内容进行检查,如下所示:
for {set i 0} {$i < $val(nn)} {incr i} {
for {set j $i} {$j < $val(nn)} {incr j} {
$ns at 0.0 [list neighbors $node($i) $node($j) $i $j]
}
}
内部循环从$i
开始(如果不想自己检查,则从[expr {$i - 1}]
开始)而不是从零开始。这确保了$j
始终不小于$i
,有效地(大约)减少了您需要做的工作量的一半。(风格要点:使用[list ...]
而不是"..."
来准备代码以便稍后执行被认为是一种很好的风格;前者效率更高,而后者在处理中可能包含空格的值时有一些难看的情况。)
您不能做的(至少不是很容易;可能有一种方法可以做到这一点)是使用neighbors
操作的结果来阻止将来发生对neighbors
的调用,因为您已经安排它们在任何一个可以表达意见的时候发生。在您的情况下,保持状态变量并检查它是否可以选择提前拒绝可能会更容易一些。这是使用延迟命令调用而不是直接命令调用的一个基本限制:将值传回以做跳过未来迭代之类的事情是相当困难的(在TCL8.6之前,这是非常棘手的;它有coroutine
,它大大简化了任务)。
发布于 2019-07-11 00:35:28
感觉你想这样做:
proc neighbors {n1 n2 nd1 nd2} {
global heads members bool allNodes
if {$nd1 in $heads || $nd2 in $members} then return
... do the neighborly stuff ...
}
有关in
运算符,请参见https://tcl.tk/man/tcl8.6/TclCmd/expr.htm#M15。
https://stackoverflow.com/questions/56973732
复制相似问题