Frage

Ich verwende ein diskretes Ereignis Simulator namens ns-2, die gebaut wurde mit Tcl und C ++. Ich habe versucht, einige Codes in TCL zu schreiben:

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

Hier ist der Ausgang:

At 0.0 value of state is: 0
Changed value of state to 0
At 2.0 values of state is: 0

Der Wert des Staates scheint nicht zu ändern. Ich bin nicht sicher, ob ich bei der Verwendung TCL etwas falsch mache. Wer hat eine Idee, was könnte falsch hier gehen?

EDIT: Danke für die Hilfe. Eigentlich ns-2 ist etwas, über das ich nicht viel Kontrolle (es sei denn, ich den Simulator selbst neu kompilieren). Ich habe versucht, die Vorschläge aus, und hier ist die Ausgabe:

für den Code:

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

Die Ausgabe lautet:

At 0.0 value of state is: 0
At 1 changed value of state to 1
At 2.0 values of state is: 0

Und für den Code ein:

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

Die Ausgabe lautet:

At 0.0 value of state is: 0
At 1.0 values of state is: 1
At 2.0 values of state is: 0

scheint nicht zu arbeiten ... Nicht sicher, ob es ein Problem mit ns2 oder meinem Code ...

War es hilfreich?

Lösung

Edit: jetzt die Zustandsmaschine zu verstehen

Zuerst wird die zitierte Syntax Sie verwenden wird Sie in Schwierigkeiten bringen. Sie sollten in der Regel Tcl-Befehle Liste aufzubauen, dies stellt sicher, dass Tcl wird nicht erweitern, was Sie nicht wollen, um es erweitern .

Ihre at-now Anrufe werden Ersetzen der state Variable, wenn Sie den Anruf zu tätigen (das heißt, wenn der Wert unverändert und 0. Was Sie wollen, ist:

$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"}

Es sieht aus wie Ihre changeVal richtig geschrieben wird (die erste Version einige der gleichen Substitutions Probleme hatte), sowie die Tatsache, dass Sie in Variablenreferenzen passierten, die lokal verwendet werden würde und daher nicht den globalen Zustand zu setzen.

Lösung auf einen Teil der ersten Version der Frage - Verwenden Sie globale Referenzen und zitiert sowohl die [ und $ Substitution an der Stelle des Aufrufs zu verhindern:

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

oder unter Verwendung von geschweiften Klammern:

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

Andere Tipps

Das Problem ist, Sie den Wert Ihrer Variablen sofort ersetzen, und nicht zum Zeitpunkt der Code ausgewertet. Sie müssen die Substitution verschieben. Statt also:

$ns at 2.0 "puts \"At 2.0 values of state is: $state\""

Tun Sie dies:

$ns at 2.0 {puts "At 2.0 values of state is: $state"}

Es ist eine gute Übung etwas komplexer als ein einfacher Aufruf eines Befehls zu setzen ohne Substitution in einem Verfahren, wenn ein Anruf wie dies zu tun. Viel einfacher, um es richtig zu arbeiten.

[EDIT]
Auch ist die at-now noch seinen Körper zu tun, bis nach dem aktuellen at kehrt zu verschieben.

Ich bin nicht sicher, warum das funktioniert, aber es funktioniert:

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

Ausgabe:

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

Wenn jemand eine Erklärung weiß, das wäre toll.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top