函数计算给定数组的总和
function to calculate the sum of a given array
我是 Tcl 的新手,所以我正在学习基础知识。我写了一个函数来计算数组的总和并打印它的元素。这是代码
proc print_sum { tab } {
set s 0
foreach key [array names tab] {
puts "${key}=$tab($key)"
incr $s $tab($key)
}
puts "the sum = $s"
}
我是这样称呼它的:
print_sum tab
然后我创建了这样的标签:
set tab("1") 41
set tab("m2") 5
set tab("3") 3
set tab("tp") 9
set tab("2") 7
set tab("100") 16
但是输出错误!它输出 0 而不是实际的总和,并且不输出任何元素。但是当我直接使用代码而不写在函数中时,它起作用了。
问题是您将字符串 "tab" 传递给 proc,然后将其存储在变量名称 "tab" 中。这只是一个普通变量,而不是数组,所以当你执行 array names tab
时,你会得到一个空列表。 foreach循环循环了0次,总和还是0
你需要使用upvar
命令将link到调用者栈帧中的"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
我是 Tcl 的新手,所以我正在学习基础知识。我写了一个函数来计算数组的总和并打印它的元素。这是代码
proc print_sum { tab } {
set s 0
foreach key [array names tab] {
puts "${key}=$tab($key)"
incr $s $tab($key)
}
puts "the sum = $s"
}
我是这样称呼它的:
print_sum tab
然后我创建了这样的标签:
set tab("1") 41
set tab("m2") 5
set tab("3") 3
set tab("tp") 9
set tab("2") 7
set tab("100") 16
但是输出错误!它输出 0 而不是实际的总和,并且不输出任何元素。但是当我直接使用代码而不写在函数中时,它起作用了。
问题是您将字符串 "tab" 传递给 proc,然后将其存储在变量名称 "tab" 中。这只是一个普通变量,而不是数组,所以当你执行 array names tab
时,你会得到一个空列表。 foreach循环循环了0次,总和还是0
你需要使用upvar
命令将link到调用者栈帧中的"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