Присвойте случайное число узлу в сценарии TCL для ns-2: переменная ERROR является массивом - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь запустить следующий tcl-скрипт, но получаю сообщение об ошибке

can't set "val": variable is array
    while executing
"set val [random_int $upper_limit]"

Вот мой код, пожалуйста, помогите

proc random_int { upper_limit } {
    global myrand
    set myrand [expr int(rand() * $upper_limit + 1)]
    return $myrand
}
set upper_limit 21

set val [random_int $upper_limit]

$ns at 0.6 "[$node($val) set ragent_] malicious" 

1 Ответ

0 голосов
/ 23 октября 2018

В настоящее время основная проблема заключается в том, что val используется как массив;Переменные Tcl не могут быть одновременно скалярами и массивами.Наиболее целесообразным решением является изменение имени переменной, возможно, на value.

set value [random_int $upper_limit]
$ns at 0.6 "[$node($value) set ragent_] malicious" 

Кроме того, ваш генератор случайных чисел может быть немного более четким кодом.Возможно, ему не требуется доступ к каким-либо глобальным переменным, и на самом деле выражение должно быть заключено в фигурные скобки (по ряду причин, включая скорость и безопасность).Вот урезанная / настроенная версия:

proc random_int { upper_limit } {
    expr { int(rand() * $upper_limit + 1) }
}

Иногда я пишу такие процедуры немного по-другому, например, так:

proc random_int { upper_limit } {expr {
    int(rand() * $upper_limit + 1)
}}

Это семантически идентично, но оно проясняет, что автордействительно думаю о.

...