2010-03-29 6 views
1

저는 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 

출력은 다음과 같습니다

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 changed value of state to 1 
At 2.0 values of state is: 0 

그리고 코드 is :

,210

는 확실하지 ... 작동하지 않는 것의 경우 NS2 또는 내 코드에 문제가 ...

+2

'set state [expr {$ state + 1}] 대신'incr state'를 사용하셨습니까? –

+0

예. 그냥 시도했는데 ... 작동하지 않는 것 같습니다. – Legend

+0

글로벌 레퍼런스와 함께해야합니다 –

답변

2

편집 : 지금 이해하는 상태 머신

첫째, 인용 구문 당신에게 너를 곤경에 빠지게 할거야. 일반적으로 list를 사용하여 Tcl 명령을 빌드해야합니다. 그러면 Tcl will not expand what you don't want it to expand이됩니다. 값이 변경되지 때 당신이 전화를 걸 때

귀하의 at-now 호출이 state 변수를 대체하는 (즉, 0 당신이 원하는 것은 :

그것은 당신의 changeVal처럼 보이는
$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"} 

가 제대로 기록 (첫 번째 버전에 동일한 대체 문제가 있음)뿐만 아니라 로컬에서 사용되는 변수 참조를 전달 했으므로 전역 상태를 설정하지 않았으므로 전역 상태를 설정하지 않았습니다. 중괄호를 사용하여,

$ns at-now "set ::state \[expr {\$::state + 1}\]" 

또는 : -호출의 시점에서 대체를 방지하기 위해 글로벌 참조 및 인용 모두 [$를 사용

$ns at-now {set ::state [expr {$::state + 1}]} 
+0

답변 해 주셔서 감사합니다. ns-2는 시뮬레이터이므로, 내가 제안한 변경 사항을 반영하기 위해 다시 컴파일해야 할 것입니다. 나는 그것에 대해 연구 할 것이다. 다른 것들에 관해서는, 나는 방금 내 게시물을 업데이 트했습니다. 시간 내 줘서 고마워. – Legend

+0

@Legend, 명확한 답변을 제공하도록 업데이트되었습니다. (b/c 질문을 자세히 읽었습니다.) 극복해야 할 두 가지 문제가 있었고, 나는 덜 중요한 것으로 대답했습니다. 이 답변은 ns-2를 변경할 필요없이 귀하의 우려 사항을 해결해야합니다. –

+0

Thanks Trey ... 올바른 코드 조각에 관심이있는 사람은 내 대답을 찾으십시오. – Legend

2

문제를 당신이 대체하고있다 변수의 값은 코드가 평가되는 시점이 아니라 즉시 반환됩니다. 대체를 연기해야합니다.따라서, 대신 :

$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 복귀 후까지 몸을 연기하고있다.

+0

감사. 내 게시물을 출력으로 업데이트했습니다. 문제가되지 않는 것 같습니다. – Legend

0

이 작동하는 이유는 확실하지 않다 그러나 그것은 작동합니다

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 

, 즉 좋은 것입니다.

+0

그것이 작동하는 이유에 대한 내 대답을 참조하십시오 (힌트 : 대체 된 명령에 영향을주는 명령의 순서를 변경 함). –