Проблема заключается в том, что вы передаете строку «tab» в proc, а затем сохраняете ее в имени переменной «tab».Это просто обычная переменная, а не массив, поэтому, когда вы делаете array names tab
, вы получаете пустой список.Цикл foreach зацикливается ноль раз, а сумма по-прежнему равна нулю.
Вам необходимо использовать команду upvar
, чтобы связать массив «tab» в кадре стека вызывающей стороны:
proc print_sum { arrayName } {
upvar 1 $arrayName a ;# "alias" the array in the caller's scope
set s 0
foreach key [array names a] {
puts "${key}=$a($key)"
incr s $a($key) ;# increment the *variable* not the *variablevalue*
}
puts "the sum = $s"
}
print_sum tab
выходы
"tp"=9
"100"=16
"1"=41
"2"=7
"3"=3
"m2"=5
the sum = 81