変数の値を変更することができません。
-
22-09-2019 - |
質問
私は、TclやC ++を使用して構築されたNS-2と呼ばれる離散事象シミュレータを使用しています。私はTCLでいくつかのコードを記述しようとしていた。
set ns [new Simulator]
set state 0
$ns at 0.0 "puts \"At 0.0 value of state is: $state\""
$ns at 1.0 "changeVal"
$ns at 2.0 "puts \"At 2.0 values of state is: $state\""
proc changeVal {} {
global state
global ns
$ns at-now "set state [expr $state+1]"
puts "Changed value of state to $state"
}
$ns run
ここでは出力があります:
At 0.0 value of state is: 0
Changed value of state to 0
At 2.0 values of state is: 0
の状態の値を変更していないようです。私はTCLを使用して何かを間違ってやっている場合、私はわかりません。誰もがここで間違って行くかもしれないものへとアイデアを持って?
編集:助けてくれてありがとう。実際には、NS-2は、(私は、シミュレータ自体を再コンパイルしなければ)私は多くのコントロールを持っていない、その上に何かです。私は提案を試してみたし、ここでは出力です:
コードの
set ns [new Simulator]
set state 0
$ns at 0.0 "puts \"At 0.0 value of state is: $state\""
$ns at 1.0 "changeVal"
$ns at 9.0 "puts \"At 2.0 values of state is: $state\""
proc changeVal {} {
global ns
set ::state [expr {$::state+1}]
$ns at-now "puts \"At [$ns now] changed value of state to $::state\""
}
$ns run
出力されます:
At 0.0 value of state is: 0
At 1 changed value of state to 1
At 2.0 values of state is: 0
やコードのための
set ns [new Simulator]
set state 0
$ns at 0.0 "puts \"At 0.0 value of state is: $state\""
$ns at 1.0 "changeVal"
$ns at 9.0 "puts \"At 2.0 values of state is: $state\""
proc changeVal {} {
global ns
set ::state [expr {$::state+1}]
$ns at 1.0 {puts "At 1.0 values of state is: $::state"}
}
$ns run
出力されます:
At 0.0 value of state is: 0
At 1.0 values of state is: 1
At 2.0 values of state is: 0
...動作していないようわからない場合はNS2との問題があるか、私のコード...
解決
の編集:今、ステートマシンを理解するの
まず、あなたが使用している引用構文は、トラブルにあなたを取得する予定です。あなたは一般的に、リストを使用して、この性を保証するTclコマンドを構築する必要があることをはしませんあなたはそれがを拡大したくないものを展開します。
あなたが電話をかけるとき、あなたのat-now
コールがstate
変数を代入している(すなわち、値が変更されず、0が何をしたいことはあるときます:
$ns at-now 0.0 {puts "At 0.0 value of state is: $::state"}
$ns at-now 2.0 {puts "At 2.0 value of state is: $::state"}
あなたのchangeVal
が適切に書かれているように、に見えます(最初のバージョンと同じ置換問題のいくつかを持っていた)、だけでなく、ローカルで使用される変数の参照を渡し、そのためグローバルな状態を設定していなかったという事実。
質問の最初のバージョンの一部に のソリューションの - 利用グローバル参照、およびコールの時点で置換を防ぐために[
と$
の両方を引用します:
$ns at-now "set ::state \[expr {\$::state + 1}\]"
や、中括弧を使用します:
$ns at-now {set ::state [expr {$::state + 1}]}
他のヒント
問題は、あなたがすぐに変数の値を代入していて、一度にコードが評価されていません。あなたは、置換を延期する必要があります。したがって、代わりに:
$ns at 2.0 "puts \"At 2.0 values of state is: $state\""
これを行います:
$ns at 2.0 {puts "At 2.0 values of state is: $state"}
これは、このような呼び出しを行う際の手順でコマンドのなしの置換を簡単に呼び出しよりも複雑なものを置くようにするとよいでしょう。それが正しい動作させるためにはるかに簡単ます。
[EDIT]
また、at-now
はまだ現在のat
戻った後まで、その身体をして延期されています。
私はなぜこれが作品かわからないが、それは動作します:
set ns [new Simulator]
set state 0
proc changeVal {} {
global ns
incr ::state
$ns at-now {puts "Local::At [$ns now] values of state is: $::state"}
}
$ns at 0.0 "puts \"Global::At 0.0 value of state is: $state\""
changeVal
$ns at 9.0 "puts \"Global::At 2.0 values of state is: $state\""
$ns run
出力:
Global::At 0.0 value of state is: 0
Local::At 0 values of state is: 1
Global::At 2.0 values of state is: 1
誰もが素晴らしいことだ説明を、知っている場合。