1

私は Ns2 と tcl スクリプトを使用しています。次のコードでは、式で 2Mb の値を持つグローバル変数 rate12 を使用します。

 if { $queuesize>16 } {
     set RL [expr $Rc * $fdec * $hf]
    set rate12 [expr $rate12 * $RL]
    puts $rate12
 }

proc レコード内から見つかりました。しかし、次のエラーが表示されます。

ns: レコード _o104 file5: 無効なベアワード "Mb"
式で "4_@_Mb * 0.40000000000000002";
"$Mb" または "{Mb}" または "Mb(...)" または ...
    (構文解析式 "4Mb * 0.40000000000000...")
    内部から呼び出された
"expr $rate12 * $RL"
    (手続き「記録」26行目)
    内部から呼び出された
「record _o104 file5」

どうすればエラーを修正できますか?

コード全体は次のとおりです。

#Create a simulator object

set ns [new Simulator]

 global rate02 
 global rate12 
 global rate23 
 global rate32 

#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
# constants
global Rc 
global Fdec
global hf 

#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]

set rate02 2Mb
set rate12 4Mb
set rate23 2Mb
set rate32 0.1Mb

#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 16

#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

#creat file record infomation at queues

set queue03 [$ns monitor-queue $n2 $n3 [open qsize03.tr w] 0.05]
set qsize03 [open qsize03.tr w]


proc record {queue qsize} {
        global ns
        #set ns [Simulator instance]
        set time 0.1
        set now [$ns now]
        #print current qsize in $queuesize
        $queue instvar parrivals_ pdepartures_ bdros_ bdepartures_ pdrops_
        #set queuesize [expr $parrivals_ - $pdepartures_ - $pdrops_]
        set queuesize $parrivals_
        puts $queuesize
        puts $qsize "$now [expr $parrivals_ - $pdepartures_ - $pdrops_]"
        #puts "$now [expr $parrivals_ - $pdepartures_ - $pdrops_]"
        set $bdepartures_ 0

        set Rc 2
        set fdec 0.4
        set hf 0.5
        global rate12
        set n0 [$ns node]
        set n1 [$ns node]
        set n2 [$ns node]

        if { $queuesize>16 } {
        set RL [expr $Rc * $fdec * $hf]
        set rate12 [expr $rate12 * $RL]
        puts $rate12
        $ns duplex-link $n0 $n2 0.8Mb 10ms RED
        } elseif { $queuesize==20 } {
        puts "full"
        } else {
        puts "under"
        }

        $ns at [expr $now + $time] "record $queue $qsize"
}

#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 $n1 $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

#Schedule events for the CBR and FTP agents
$ns at 0.1 "$ftp2 start"
$ns at 0.5 "record $queue03 $qsize03"
$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
4

2 に答える 2

4

Tcl のexprコマンドは、Mb などの単位が付加された値では機能しません。

$rate12そのため、4Mbの値を解釈しようとしますが、これは有効な数値リテラルではないため、エラーが発生します。表現を括弧で囲んでいないという事実と組み合わせると、たとえば次のように書きます。

set rate12 [expr $rate12 * $RL]

それ以外の

set rate12 [expr {$rate12 * $RL}]

expr が二重に評価され、誤解を招くエラー メッセージが表示されます (さらに処理が遅くなる可能性があります)。

これを修正するには、単位なしで値の計算を行うか、単位を含めて計算を行う小さな proc を作成する必要があります。

于 2012-06-24T13:53:15.290 に答える
1

キーワードglobalは、 a の範囲内でのみ意味がありprocます。にアクセスするrate12には、 の先頭にproc record次の行を追加します。

global rate12

これで問題が解決するはずです。

アップデート

global残念ながら、proc の途中でコマンドが表示されませんでした。問題はあなたが持っている最初にあります:

set rate12 4Mb 

その後、 でproc record

set rate12 [expr $rate12 * $RL]

Tcl によると、4Mbは数値ではありません。次の修正を提案します。

set rate12 4

または、より説明的に:

set rateInMb12 4
于 2012-06-24T16:30:58.830 に答える