2012-10-29 190 views
0

我有两个tcl文件。一个是主要的tcl文件(main.tcl),另外一个是用于主要tcl文件的帮助文件(help.tcl)。我想在主文件执行时从主文件执行该帮助文件。我使用命令“source filename”为此。但我得到了一些错误。我发布了两个tcl文件,执行时发生了什么错误。请帮我解决这个...TCL脚本错误

Error 
num_nodes is set 4 
warning: Please use -channel as shown in tcl/ex/wireless-mitf.tcl 
INITIALIZE THE LIST xListHead 
Enter Source Node (0 to 4) 
0 
Enter Destination Node (0 to 4) 
3 
SORTING LISTS ...DONE! 
channel.cc:sendUp - Calc highestAntennaZ_ and distCST_ 
highestAntennaZ_ = 1.5, distCST_ = 716.1 
ns: proc1: can't read "n0": no such variable 
    while executing 
"attach-CBR-traffic $n0 $sink1 64 0.07" 
    invoked from within 
"set inf0_1[attach-CBR-traffic $n0 $sink1 64 0.07]" 
    (file "final.tcl" line 1) 
    invoked from within 
"source.orig final.tcl" 
    ("uplevel" body line 1) 
    invoked from within 
"uplevel source.orig [list $fileName]" 
    invoked from within 
"if [$instance_ is_http_url $fileName] { 
set buffer [$instance_ read_url $fileName] 
uplevel eval $buffer 
} else { 
uplevel source.orig [list $fileName] 
..." 
    (procedure "source" line 8) 
    invoked from within 
"source final.tcl" 
    (procedure "proc1" line 6) 
    invoked from within 
"proc1" 

在文件Main.tcl:

set val(chan)   Channel/WirelessChannel ;# Channel Type 
set val(prop)   Propagation/TwoRayGround ;# radio-propagation model 
set val(netif)   Phy/WirelessPhy   ;# network interface type 
set val(mac)   Mac/802_11     ;# MAC type 
set val(ifq)   CMUPriQueue   ;# interface queue type 
set val(ll)    LL       ;# link layer type 
set val(ant)   Antenna/OmniAntenna  ;# antenna model 
set val(ifqlen)   340      ;# max packet in ifq 
set val(nn)    4       ;# number of mobilenodes 
set val(rp)    DSR      ;# routing protocol 
set val(x)  630   ;# X axis distance 
set val(y)  570   ;# Y axis distance 
set opt(energymodel) EnergyModel    ;# Initial Energy 
set opt(initialenergy) 100      ;# Initial energy in Joules 

set ns [new Simulator] 

set nam1 [open nam11.nam w] 
$ns namtrace-all-wireless $nam1 $val(x) $val(y) 

set trace1 [open trace11.tr w] 
$ns trace-all $trace1 
$ns use-newtrace 

set topo [new Topography] 
$topo load_flatgrid $val(x) $val(y) 

create-god $val(nn) 
Phy/WirelessPhy set Pt_ 0.81 

$ns node-config -adhocRouting $val(rp) \ 
     -llType $val(ll) \ 
     -macType $val(mac) \ 
     -ifqType $val(ifq) \ 
     -ifqLen $val(ifqlen) \ 
     -antType $val(ant) \ 
     -propType $val(prop) \ 
     -phyType $val(netif) \ 
     -topoInstance $topo \ 
     -agentTrace ON \ 
     -routerTrace ON \ 
     -macTrace ON \ 
     -movementTrace ON \ 
     -rxPower 0.36 \ 
     -txPower 0.14 \ 
      -channelType $val(chan) \ 
     -initialEnergy $opt(initialenergy) \ 
     -energyModel $opt(energymodel) \ 


for { set i 0 } {$i < $val(nn)} { incr i } { 
    set n($i) [$ns node] 
    $n($i) random-motion 0 
    $n($i) color black 
    $ns initial_node_pos $n($i) 30 
} 

for { set i 0 } { $i < $val(nn)} { incr i } { 
    $ns at 0.0 "$n($i) color black" 
    $ns at 0.0 "$n($i) label-color maroon" 
} 

$ns at 0.0 "$n(0) setdest 220.00 210 3000" 
$ns at 0.0 "$n(1) setdest 320.00 310 3000" 
$ns at 0.0 "$n(2) setdest 420.00 110 3000" 
$ns at 0.0 "$n(3) setdest 520.00 210 3000" 


for {set i 0} {$i<$val(nn)} {incr i} { 
    set sink($i) [new Agent/LossMonitor] 
    $ns attach-agent $n($i) $sink($i) 
} 

proc attach-CBR-traffic { node sink size itval} { 
    #Get an instance of the simulator 
    set ns_ [Simulator instance] 
    set udp [new Agent/UDP] 
    $ns_ attach-agent $node $udp 
    #Create a CBR agent and attach it to the node 
    set cbr [new Application/Traffic/CBR] 
    $cbr attach-agent $udp 
    $cbr set packetSize_ $size ;#sub packet size 
    $cbr set interval_ $itval 
    #Attach CBR source to sink; 
    $ns_ connect $udp $sink 
    return $cbr 
} 
set cbr001 [attach-CBR-traffic $n(0) $sink(1) 256 0.082] 
$ns at 1.0 "$cbr001 start" 
$ns at 1.001 "$cbr001 stop" 

set cbr001 [attach-CBR-traffic $n(1) $sink(3) 256 0.082] 
$ns at 1.002 "$cbr001 start" 
$ns at 1.003 "$cbr001 stop" 

# neighbor node calculation 
set nbr [open Neighbor w] 
puts $nbr "\t\t\t\t\tNeighbor Detail" 
puts $nbr "\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 
puts $nbr "\tNode\t\tNb node\t\tNode-Xpos\tNode-Ypos\tNb-Xpos\t\tNb-Ypos\t\tDistance(d)" 
puts $nbr "\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 
close $nbr 


#~~~~~~~~~~~~~~~~ Calculation of neighbor nodes of all node~~~~~~~~~~~~~~~~~~~ 
proc distance { n1 n2 nd1 nd2} { 
    global c n bnd 
    set nbr [open Neighbor a] 
    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 int(sqrt(pow(($x2-$x1),2)+pow(($y2-$y1),2)))] 
    if {$d<300} { 
    if {$nd2!=$nd1} { 
     puts $nbr "\t$nd1\t\t$nd2\t\t$x1\t\t$y1\t\t$x2\t\t$y2\t\t$d" 
    } 
    } 
    close $nbr 
} 


for {set i 0} {$i <$val(nn)} {incr i} { 
    for {set j 0} {$j <$val(nn)} {incr j} { 
    $ns at 1.002 "distance $n($i) $n($j) $i $j" 
    } 
} 

# For Input 
set f 1 
while {$f} { 
    puts "Enter Source Node (0 to 4)" 
    gets stdin src 
    puts "Enter Destination Node (0 to 4)" 
    gets stdin dst 
    if {$src>=0 && $src<5 && $dst>=0 && $dst<5 && $src!=$dst} { 
    set f 0 
    set sd [open srcdst w] 
    puts $sd "$src $dst" 
    close $sd 
    } else { 
    puts "\n\t---------Enter Proper Input-------\n" 
    } 
} 

#minimum 

proc proc1 {} { 
    exec awk -f distance.awk srcdst Neighbor & 
    exec awk -f mm.awk snd & 
    exec awk -f mnode.awk min snd & 
    exec awk -f final.awk srcdst mnode & 
    source final.tcl 
} 

$ns at 1.5 "proc1" 

proc proc2 {} { 
    global ns trace1 nam1 
    $ns flush-trace 
    close $trace1 
    close $nam1 
    exec nam nam11.nam & 
    exit 0 
} 

$ns at 3.0 "proc2" 

$ns run 

在文件final.tcl:

set inf0_1[attach-CBR-traffic $n0 $sink1 64 0.07] 
$ns at2.1 "$inf0_1 start" 
$ns at2.3 "$inf0_1 stop" 
$ns at2.1 "$n(0) color green4" 
$ns at2.4 "$ns trace-annotate\"Node-0 send data to its neighbor1\"" 
set inf1_3[attach-CBR-traffic $n1 $sink3 64 0.07] 
$ns at2.1 "$inf1_3 start" 
$ns at2.3 "$inf1_3 stop" 
$ns at2.1 "$n(1) color green4" 
$ns at2.4 "$ns trace-annotate\"Node-1 send data to its neighbor3\"" 
+0

您是否尝试阅读错误消息和堆栈跟踪?它告诉你(直接)问题是什么。它没有告诉你(为什么不是'n0'设置?“),但这就是为什么你需要把你的智慧带上。 –

+0

感谢您的回答,我读了那个错误..我知道是什么问题,但我无法解决它...我提到旧程序,他们只有这样...它意味着节点n0在主要.tcl和它在final.tcl中使用,并在final.tcl中再次声明n0 ... – user1779084

+0

感谢您的回复,我阅读了错误消息,并且知道问题所在。是否有可能或不使用在main.tcl – user1779084

回答

2

似乎没有给在您的main.tcl文件中的任何地方,您的源代码为help.tcl。但是,在错误消息中,看起来您声称为help.tcl的文件实际上名称为final.tcl。假设这是你的意思,那么我可以诊断错误。

的问题是,在你的final.tcl文件中,第一行试图执行该语句:

set inf0_1 [attach-CBR-traffic $n0 $sink1 64 0.07] 
#  ^
#   | 
# BTW, unrelated to the error, there is also a missing space here which 
# is probably not what you intended. 

这种说法的问题在于变量n0sink1是不确定的。

更新回答

OK,似乎有很多误解你的Tcl的理解。我强烈建议阅读Tcl语言的文档。幸运的是,与C或Perl或几乎任何其他语言不同,tcl语法的完整文档仅为单个页面:http://www.tcl.tk/man/tcl/TclCmd/Tcl.htm。特别注意规则编号8(变量替换)。

首先你需要知道你的脚本是错误的是错误信息告诉你:你没有在程序中的任何地方定义变量n0(也没有定义sink1)。然而,有一个全局变量n恰好是一个数组。从你的评论看来,这是你的意思当你试图访问n0。如果是这样,规则编号8给出了正确的语法:使用arrayname(index)语法访问数组。在我们进一步讨论之前,我想提醒你,Tcl调用数组的东西是技术上关联的数组(在其他语言中,它们有时称为哈希或映射),因此索引可以是字符串。现在,话说回来,访问n正确的语法是:

set inf0_1 [attach-CBR-traffic $n(0) $sink(1) 64 0.07] 
#        ^ ^

但是,这仍然是行不通的。如果您尝试此操作,它仍会抱怨nsink未定义。这是因为tcl范围规则的工作原理。在函数内部,只有局部变量是可见的。全局变量在函数内部不可用,除非你明确要求tcl导入它们。要访问全局变量,您有两种选择:

首先,传统方式:使用global命令导入全局变量。你可以做到这一点在源的final.tcl文件PROC:

proc proc1 {} { 
    global n sink 
    # ... 
    source final.tcl 
} 

,或者你可以在最后做。TCL文件本身:

global n sink 
set inf0_1 [attach-CBR-traffic $n(0) $sink(1) 64 0.07] 
# ... 

第二种方法是访问使用全局命名空间::全局变量。这样,您就不需要导入使用global命令中的变量:

set inf0_1 [attach-CBR-traffic $::n(0) $::sink(1) 64 0.07] 

修复所有我上面强调应该让你的代码运行(假设我已经猜中你的意图)的问题。不过,我强烈建议阅读tcl手册页并熟悉tcl以避免将来出现错误。您至少应该了解的语法规则,一套手册页和PROC手册页:

以下页面也是一个很好的介绍to tcl:An Introduction to Tcl Scripting

+0

中声明的final.tcl中的节点感谢您的回答...我在main.tcl中声明了n0。是否有可能在第二个tcl文件中使用(final.tcl_ – user1779084

+1

我在main.tcl中没有看到它,你确定它在吗?它不在上面的代码中。 – slebetman

+0

请看看“node creation”在for循环中,该循环将创建节点,如n0,n1,n2,n3 – user1779084