2012-06-21 43 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