Я использую дискретный симулятор событий, называемый ns-2, который был построен с использованием Tcl и C++. Я пытаюсь написать код в 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. У кого-нибудь есть идея относительно того, что здесь может быть неправильным?
EDIT: Спасибо за помощь. На самом деле, 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 или мой код ...
Вы считаете 'incr state' вместо' set state [expr {$ state + 1}] '? –
Да. Просто попробовал ... не работает. – Legend
он должен с глобальным refs –