2012-06-21 33 views
0

我正在使用ns2模拟器和tcl script.on执行下面的代码,它引发了浮点异常错误。之前我在代码TCL脚本中的浮点异常

$ns duplex-link $n0 $n2 2.0Mb 10ms RED 
$ns duplex-link $n1 $n2 2.0Mb 10ms DropTail 
$ns duplex-link $n2 $n3 1.1Mb 20ms DropTail 
$ns duplex-link $n3 $n2 1.2Mb 10ms DropTail 

这是正常工作的以下部分已经改变了速度值,但它已被更改为以下即后后,我已经使用的变量rate02,rate12,rate23,rate32代替浮点异常值的发生。任何人都可以帮忙吗?

整个TCL代码如下:

#Create a simulator object 

    set ns [new Simulator] 

    global set rate02 2.0Mb 
    global set rate12 2.0Mb 
    global set rate23 1.1Mb 
    global set rate32 1.2Mb 

    #Define different colors for data flows (for NAM) 
    $ns color 1 Blue 
    $ns color 2 Red 
    $ns color 3 Green 

    #Open the NAM trace file 
    set nf [open out.nam w] 
    $ns namtrace-all $nf 

    #Define a 'finish' procedure 
    proc finish {} { 
     global ns nf 
     $ns flush-trace 
     #Close the NAM trace file 
     close $nf 
     #Execute NAM on the trace file 
     exec nam out.nam & 
     exit 0 
    } 

    #Create four nodes 
    set n0 [$ns node] 
    set n1 [$ns node] 
    set n2 [$ns node] 
    set n3 [$ns node] 

    #Create links between the nodes 
    $ns duplex-link $n0 $n2 rate02 10ms RED 
    $ns duplex-link $n1 $n2 rate12 10ms DropTail 
    $ns duplex-link $n2 $n3 rate23 20ms DropTail 
    $ns duplex-link $n3 $n2 rate32 10ms DropTail 

     #Set Queue Size of link (n2-n3) to 10 
     $ns queue-limit $n2 $n3 20 
     $ns queue-limit $n3 $n2 22 

     #Give node position (for NAM) 
     $ns duplex-link-op $n0 $n2 orient right-down 
     $ns duplex-link-op $n1 $n2 orient right-up 
     $ns duplex-link-op $n2 $n3 orient right 

     #Monitor the queue for link (n2-n3). (for NAM) 
     $ns duplex-link-op $n2 $n3 queuePos 0.5 


     #Setup a TCP connection 
     set tcp1 [new Agent/TCP] 
     $tcp1 set class_ 2 
     $ns attach-agent $n0 $tcp1 
     set sink [new Agent/TCPSink] 
     $ns attach-agent $n3 $sink 
     $ns connect $tcp1 $sink 
     $tcp1 set fid_ 1 
     ######################################### 
     #Setup a TCP connection 
     set tcp3 [new Agent/TCP] 
     $tcp3 set class_ 2 
     $ns attach-agent $n3 $tcp3 
     set sink2 [new Agent/TCPSink] 
     $ns attach-agent $n2 $sink2 
     $ns connect $tcp3 $sink2 
     $tcp3 set fid_ 3 

     #Setup a FTP over TCP connection 
     set ftp3 [new Application/FTP] 
     $ftp3 attach-agent $tcp3 
     $ftp3 set type_ FTP 
     ############################################ 
     #Setup a FTP over TCP connection 
     set ftp1 [new Application/FTP] 
     $ftp1 attach-agent $tcp1 
     $ftp1 set type_ FTP 

     #Setup a TCP connection 
     set tcp2 [new Agent/TCP] 
     $tcp2 set class_ 2 
     $ns attach-agent $n1 $tcp2 
     set sink [new Agent/TCPSink] 
     $ns attach-agent $n3 $sink 
     $ns connect $tcp2 $sink 
     $tcp2 set fid_ 2 

     #Setup a FTP over TCP connection 
     set ftp2 [new Application/FTP] 
     $ftp2 attach-agent $tcp2 
     $ftp2 set type_ FTP 

     proc openTrace { stopTime testName } { 
      $self instvar ns_ 
      exec rm -f out.tr temp.rands 
      set traceFile [open out.tr w] 
      puts $traceFile "v testName $testName" 
      $ns_ at $stopTime \ 
       "close $traceFile ; $self finish $testName" 
      return $traceFile 
     } 
     proc traceQueues { node traceFile } { 
      $self instvar ns_ 
      foreach nbr [$node neighbors] { 
       $ns_ trace-queue $node $nbr $traceFile 
       [$ns_ link $node $nbr] trace-dynamics $ns_ $traceFile 
      } 
     } 


     #Schedule events for the CBR and FTP agents 
     $ns at 0.1 "$ftp2 start" 
     $ns at 1.0 "$ftp1 start" 
     $ns at 1.0 "$ftp3 start" 
     $ns at 4.0 "$ftp2 stop" 
     $ns at 4.5 "$ftp1 stop" 
     $ns at 4.5 "$ftp3 stop" 

     #Detach tcp and sink agents (not really necessary) 
     $ns at 4.5 "$ns detach-agent $n0 $tcp1 ; $ns detach-agent $n3 $sink" 
     $ns at 4.5 "$ns detach-agent $n1 $tcp2 ; $ns detach-agent $n3 $sink" 

     #Call the finish procedure after 5 seconds of simulation time 
     $ns at 5.0 "finish" 
     $ns run 
+0

Tcl通常会将实际浮点异常转换为您可以捕获的东西。代码中究竟发生了什么问题?在'errorInfo'全局变量中应该有一个跟踪来说明在哪里(但是如果它正在终止程序,我们可能需要采取特殊的步骤来公开它)。 –

回答

0

除非 “NS2” 的事情重新定义了Tcl的global命令,脚本按理说应该读的东西是这样的:

#Create a simulator object 

set ns [new Simulator] 

set rate02 2.0Mb 
set rate12 2.0Mb 
set rate23 1.1Mb 
set rate32 1.2Mb 

# ... 

#Create links between the nodes 
$ns duplex-link $n0 $n2 $rate02 10ms RED 
$ns duplex-link $n1 $n2 $rate12 10ms DropTail 
$ns duplex-link $n2 $n3 $rate23 20ms DropTail 
$ns duplex-link $n3 $n2 $rate32 10ms DropTail 

# ... 

换句话说,您的代码有两个问题:

  • Tcl的global命令的语义定义为global varname ?varname ...?,也就是说,它只是声明名称它们被传递给它作为全局变量的引用。因此,呼叫global set rate02 2.0Mb只是声明名称“set”,“rate02”和“2.0Mb”来表示全局变量。很可能不是你想要的。
  • duplex-link子命令可能期望的值为作为其“rate”参数,并且您将它传递给变量的名称。看起来,一些NS2代码然后试图将这样一个字符串解释为浮点值,由于显而易见的原因失败。因此,当您想要将该变量的值传递给命令时,您必须取消引用变量以获取其值。这是通过使用set varname命令或使用$语法的简写符号来完成的:$varnamemore info关于此)。

看起来你应该从the Tcl tutorial开始处理这些基础知识。

+0

感谢您的回答,它帮了我很多。 – user1472289

+0

@ user1472289,将其标记为接受。 – kostix