2017-09-06 13 views
1

J'ai écrit un scénario dans le logiciel ns2 qui a 5 nœuds fixes et 1 récepteur mobile. Le récepteur mobile doit collecter les informations sur les nœuds. Je veux calculer le moyen avg (niveau de l'énergie, le nombre de nœuds & les données du trafic sur les nœuds) et stockez-le dans le récepteur mobile. Le code que j'ai écrit ne contient aucune erreur mais il ne s'imprime pas. Mon code & fichier de trace sont en pièce jointe Je dois calculer cette moyenne avec proc en code script tcl pas avec awk code.S'il vous plaît me aider.écriture proc avg dans le script tcl dans ns2_new

proc create_common_app {destination_id disseminating_type disseminating_interval energy_level } { 
 
    global val 
 
    #puts "executing create_common_app\n" 
 
    if { $val(commonApp) == "Application/SensorBaseApp/CommonNodeApp" } 
 
    { 
 
\t \t \t set app_ [new $val(commonApp)] 
 
\t \t \t $app_ set destination_id_ $destination_id 
 
    } 
 
    $app_ set disseminating_type_ $disseminating_type 
 
    $app_ set disseminating_interval_ $disseminating_interval 
 
    $app_ set energy_level _ $energy_level 
 
    return $app_ 
 
} 
 
proc create_mobile_sink_app { source _id disseminating_type disseminating_interval energy_level outside_network} { 
 
    global val 
 
    set app_ [new $val(sinkApp)] 
 
    $app_ set source _id _ $source _id 
 
    $app_ set disseminating_type_ $disseminating_type 
 
    $app_ set disseminating_interval_ $disseminating_interval 
 
    $app_ set energy_level _ $energy_level 
 
    $app_ set outside_network_ $outside_network 
 
    #$app_ set avg_ $avg 
 
    return $app_ 
 
} 
 
######################################################################### 
 
#Me 
 
#################################################################### 
 
proc avg { energy_level nn disseminating_interval } { 
 
    set avgen 0 
 
    for {set i 0} {$i < 5} {incr i} { 
 
    set $avgen [expr $energy_level(i) + $avgen ] 
 
    } 
 
    set $avgen [expr $avgen/$nn] 
 
    return $avgen 
 
\t set xl [list $avgen $nn $disseminating_interval] 
 
} 
 

 
proc ArithmeticMean { $xl } { 
 
    set length [llength $xl] 
 
    if {$length == 0} { 
 
     return 0.0 
 
    } 
 
    set sum [::tcl::mathop::+ {*}$xl] 
 
    return [expr {double($sum)/$length}] 
 
    set avgt [expr {double($sum)/$length}] 
 
    puts "average is $avgt_" 
 
} 
 
#####################################################################

tracefile


 
M 0.00000 0 (9.00, 5.00, 0.00), (0.00, 0.00), 0.00 
 
s 5.000000000 _1_ AGT --- 0 cbr 150 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [0] 0 0 
 
r 5.000000000 _1_ RTR --- 0 cbr 150 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [0] 0 0 
 
s 5.000000000 _1_ AGT --- 1 cbr 150 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [1] 0 0 
 
r 5.000000000 _1_ RTR --- 1 cbr 150 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [1] 0 0 
 
s 5.000000000 _1_ AGT --- 2 cbr 150 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [2] 0 0 
 
r 5.000000000 _1_ RTR --- 2 cbr 150 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [2] 0 0 
 
s 5.000000000 _1_ AGT --- 3 cbr 150 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [3] 0 0 
 
r 5.000000000 _1_ RTR --- 3 cbr 150 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [3] 0 0 
 
s 5.000000000 _1_ AGT --- 4 cbr 150 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [4] 0 0 
 
r 5.000000000 _1_ RTR --- 4 cbr 150 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [4] 0 0 
 
s 5.000000000 _1_ AGT --- 5 cbr 150 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [5] 0 0 
 
r 5.000000000 _1_ RTR --- 5 cbr 150 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [5] 0 0 
 
s 5.000000000 _1_ AGT --- 6 cbr 100 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [6] 0 0 
 
r 5.000000000 _1_ RTR --- 6 cbr 100 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:0 2:0 32 0] [6] 0 0 
 
s 5.000000000 _1_ RTR --- 0 AODV 48 [0 0 0 0] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:255 -1:255 30 0] [0x2 1 1 [2 0] [1 4]] (REQUEST) 
 
s 5.000535000 _1_ MAC --- 0 AODV 106 [0 ffffffff 2 800] [energy 0.050000 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:255 -1:255 30 0] [0x2 1 1 [2 0] [1 4]] (REQUEST) 
 
N -t 5.000535 -n 0 -e 0.049980 
 
N -t 5.000535 -n 4 -e 0.049980 
 
N -t 5.000535 -n 2 -e 0.049980 
 
N -t 5.000535 -n 3 -e 0.049980 \t 
 
r 5.001383005 _0_ MAC --- 0 AODV 48 [0 ffffffff 2 800] [energy 0.049980 ei 0.000 es 0.000 et 0.000 er 0.000] ------- [1:255 -1:255 30 0] [0x2 1 1 [2 0] [1 4]] (REQUEST) 
 
r 5.001383013 _4_ MAC --- 0 AODV 48 [0 ffffffff 2 800] [energy 0.049980 ei 0.000 es 0.000 et 0.000 
 
. 
 
. 
 
.....

Répondre

1
proc avg { energy_level nn disseminating_interval } { 
    set avgen 0 
    for {set i 0} {$i < 5} {incr i} { 
    set $avgen [expr $energy_level(i) + $avgen ] 
    } 
    set $avgen [expr $avgen/$nn] 
    return $avgen 
    set xl [list $avgen $nn $disseminating_interval] 
} 

Notes:

  • Vous ne pouvez pas passer des tableaux en valeur: vous devez passer le tableau nom et utiliser upvar pour relier le nom au tableau réel dans le contexte
  • de l'appelant Utilisez des accolades autour de vos expressions expr. Vous devez déréférencer $i dans l'extension du tableau.
  • Ne pas utiliser $ dans le premier argument de set
  • voulez-vous utiliser $nn dans la boucle for, ou la valeur codée en dur 5?

code corrigé

proc avg { energy_level_var nn disseminating_interval } { 
    upvar 1 $energy_level_var energy_level 
    if {$nn == 0} { 
     error "denominator cannot be zero" 
    } 
    set sum 0 
    for {set i 0} {$i < $nn} {incr i} { 
     set sum [expr {$energy_level($i) + $sum}] 
    } 
    return [expr {$sum/$nn}] 
} 

Et appeler comme ça

array set energy_level {0 1.0 1 1.1 2 1.2 3 1.3 4 1.4 5 1.5} 
puts "average is: [avg energy_level 6 "?"]"   ;# average is: 1.25 

En outre, ne pas utiliser $ dans la déclaration de la proc moyenne arithmétique:

proc ArithmeticMean { xl } {