Tcl中的循环调用过程和赋值

Tcl中的循环调用过程和赋值,tcl,ns2,Tcl,Ns2,我目前正在使用循环将值迭代到Tcl中的进程(邻居) 这是流程中循环的结束。put只是一个标记,但它检查两个列表中是否包含一个项目。如果它在任一列表中,则将其递增,然后移动到下一个可能的值。该值不再需要检查/循环,因为它已被放入列表中 如何防止继续使用该值?“流程调用”循环将始终覆盖流程中发生的事情,因此即使是指定的值也将继续使用。在Tcl中调用进程有不同的方式吗?或者至少,在Tcl中以不同的方式向流程提供值?或者我猜,把他们拉出来 需要注意的是,这里是我想要输入的进程(n1和n2是内存位置,nd

我目前正在使用循环将值迭代到Tcl中的进程(邻居)

这是流程中循环的结束。
put
只是一个标记,但它检查两个列表中是否包含一个项目。如果它在任一列表中,则将其递增,然后移动到下一个可能的值。该值不再需要检查/循环,因为它已被放入列表中

如何防止继续使用该值?“流程调用”循环将始终覆盖流程中发生的事情,因此即使是指定的值也将继续使用。在Tcl中调用进程有不同的方式吗?或者至少,在Tcl中以不同的方式向流程提供值?或者我猜,把他们拉出来

需要注意的是,这里是我想要输入的进程(n1和n2是内存位置,nd1和nd2是实际的数字标识符)


感觉你想这样做:

proc neighbors {n1 n2 nd1 nd2} {
    global heads members bool allNodes 
    if {$nd1 in $heads || $nd2 in $members} then return
    ... do the neighborly stuff ...
}

请参阅操作符中的

如果
邻居
操作为(通常为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]
    }
}
对于{set i 0}{$i<$val(nn)}{incr i}{
对于{set j$i}{$j<$val(nn)}{incr j}{
0.0处的$ns[列出邻居$node($i)$node($j)$i$j]
}
}
内部循环从
$i
(或者
[expr{$i-1}]
开始,如果您不想检查事物本身),而不是从零开始。这确保了
$j
始终不小于
$i
,有效地(大约)将您需要完成的工作量减半。 (样式点:使用
[list…]
为以后的执行准备代码,而不是
“…”
,这被认为是一种好的样式;前者效率更高,后者在处理可能包含空格的值时会出现一些不好的情况。)


您不能做的(至少不容易;可能有一种方法可以做到)是使用
邻居
操作的结果来阻止未来对
邻居
的调用发生,因为您已经计划在他们中任何一个可能表达意见的时候发生这些调用。在您的情况下,保留一个状态变量并对照它检查提前拒绝的选项可能更容易。这是使用延迟命令调用而不是直接调用的一个基本限制:将值传递回以执行诸如跳过未来迭代之类的操作相当困难(而且在Tcl 8.6之前非常棘手;它具有
coroutine
,这大大简化了任务).

邻居进程是否能够访问
成员
列表?@glennjackman是的,我也在邻居进程之外创建列表。在循环开始之前,在新的编辑中有“内部邻居”。我能看到列表上的每一个更新——放置的原因。我不记得NS-2中使用了什么版本的Tcl;它是唯一已知的OTcl的剩余用户,OTcl是一个已被XOTcl和TCLO(以非常不同的方式)取代的不存在的对象系统。感谢您的回答。我确实认为
中的
ni
选项更适合测试部分。回报也让我保持在正确的循环中。但是,它仍然无法解决调用流程的外部循环不断添加和计算已处理/分配给头或成员的
nd1
值这一事实。我在上面添加了一点额外的代码,以更好地展示我正在尝试做的事情。嗯,谢谢你,多纳尔-从你在第二段中所说的,我想我必须将它分成两个过程,只将有效项传递给第二个。
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 

proc neighbors {n1 n2 nd1 nd2} {
    global heads members bool allNodes 
    if {$nd1 in $heads || $nd2 in $members} then return
    ... do the neighborly stuff ...
}
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]
    }
}