2012-06-21 2 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" вещь не переопределяет global команду TCL, сценарий должен якобы что-то вроде этого прочитать:

#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'sКомандаимеет семантику, определенную как global varname ?varname ...?, то есть только объявляет именами , которые передаются ему как относящиеся к глобальным переменным. Следовательно, вызов global set rate02 2.0Mb просто объявляет имена «set», «rate02» и «2.0Mb» для обозначения глобальных переменных. Скорее всего, не то, что вы хотели.
  • Подкоманда duplex-link, вероятно, ожидает значение как аргумент «rate», и вы передаете ему имя переменной. Похоже, что некоторый код NS2 пытается интерпретировать такую ​​строку как значение с плавающей запятой, что по очевидным причинам не выполняется. Следовательно, вам нужно разыменовать переменную, чтобы получить ее значение, когда вы хотите передать значение этой переменной команде. Это делается с помощью команды set varname или сокращенной нотации с использованием синтаксиса $: $varname (more info об этом).

Похоже, вы должны начать с the Tcl tutorial, который посвящен этим основам.

+0

спасибо за ваш ответ, это мне очень помогло. – user1472289

+0

@ user1472289, отметьте его как принятый тогда. – kostix