2017-01-31 12 views
0

Я хочу разделить весь список на один номер. Предположим, я беру переменную $ Content и хочу разделить следующий список на 300 узлов. поэтому я принять команду $ Content/300Разделите список с единственным номером в tcl NS-2

  1. $ Содержание = {1 2 3 4 5} {2 3 4 5 6} {4 5 6 7 8 9} {3 4 6 8 9 0}

В результате вывод получается {1 2 3 4 5} {2 3 4 5 6} {4 5 6 7 8 9} {3 4 6 8 9 0}/300 с отсутствующими скобками и недопустимыми аргументами ,

Пожалуйста, скажите мне, как мы разделим весь список с одним номером (300 узлов), потому что в фигурных скобках каждый номер приходит как выход некоторых аргументов

+0

Какой результат вы ожидаете от операции, которую вы пытаетесь выполнить? –

+0

Я хочу сгенерировать некоторый вывод из этого списка. Фактически в $ Content содержатся некоторые аргументы ($ delay, $ range, $ priority), и эти аргументы генерируют некоторое значение в виде списка. Затем мы делим общее число узлов. поэтому на основе этого вывода я решит либо я выберу этот лучший форвардер, либо нет. –

+0

Извините, ваше объяснение того, чего вы пытаетесь достичь, непонятно. Как я уже сказал, пожалуйста, дайте ** буквальный пример примера, который вы ожидаете. –

ответ

0

Обратите внимание, что Tcl является очень пробельным-зависимым языком, так что вы требуется пространство между закрытыми и открытыми фигурными скобками в объявлении $ Content.

Вы можете перебрать $ Content, и для каждого подсписка, перебирать элементы и разделить на 300, собирая результаты:

set Content {{1 2 3 4 5} { 2 3 4 5 6} { 4 5 6 7 8 9} {3 4 6 8 9 0}} 
# note the spaces ......^............^..............^ 
set divisor 300 
set newContent [list] 
foreach sublist $Content { 
    set newSublist [list] 
    foreach elem $sublist { 
     lappend newSublist [expr {$elem * 1.0/$divisor}] 
    } 
    lappend newContent $newSublist 
} 
puts $newContent 

Выход является

{0.0033333333333333335 0.006666666666666667 0.01 0.013333333333333334 0.016666666666666666} {0.006666666666666667 0.01 0.013333333333333334 0.016666666666666666 0.02} {0.013333333333333334 0.016666666666666666 0.02 0.023333333333333334 0.02666666666666667 0.03} {0.01 0.013333333333333334 0.02 0.02666666666666667 0.03 0.0} 

Если ваша версия Tcl является 8.6 вы можете использовать команду lmap сократить до код:

set newContent [lmap sublist $Content { 
    lmap elem $sublist {expr {$elem * 1.0/$divisor}} 
}] 

Обратите внимание, что я умножаю значение на 1.0, чтобы использовать разделение с плавающей точкой, а не целое деление.

+0

Большое вам спасибо за ваш ответ @Glenn Jackman. Фактически $ content содержит некоторые аргументы ($ delay $ range $ priority $ i) на основе этих аргументов $ content генерирует автоматически 4-кортежи {1 2 3 4} {5 6 7 8} список, мы делим этот список на число узлов, чтобы принять какое-либо решение, либо выбрать лучшего форвардера, либо нет. set no_cs [llength expr {[$ Content]/$ num_nodes}] $ Content/$ num_nodes .output дает мне ошибку (недопустимый аргумент, и это должен быть список длин). Теперь вы скажете мне возможное решение или подсказку чтобы просмотреть приведенный выше код –

+0

Glenn Jackmen я запустил ваш код, но, к сожалению, «он дал мне ошибку не может использовать нечисловую строку в качестве операнда« * » при выполнении « expr {$ elem * 1.0/$ divisor } " ("Еогеасп" тело линии 2) вызываются из "Еогеасп эля $ подсписок { lappend newSublist [выражение {$ эля * 1,0/$ делителя}] }" """ теперь, пожалуйста, скажи мне, что я делаю? –

+0

Можете ли вы вы можете сказать, что «разделите список на 300»? Является ли мое предположение правильным, что вы хотите разделить все числа в списке на 300? –