函数计算给定数组的总和

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