【问题标题】:function to calculate the sum of a given array计算给定数组之和的函数
【发布时间】:2018-11-18 22:08:39
【问题描述】:

我是 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 而不是实际的总和,并且不输出任何元素。但是当我直接使用代码而不写在函数中时,它可以工作。

【问题讨论】:

  • 欢迎您!请。提供您尝试过的MVE。您显示的 sn-ps 不会按原样执行而不会出错。例如,print_sum $tab 肯定不会成功,但会给出 sth。沿线can't read "tab": variable is array。在我看来,您在发布之前重写了您的示例,而不是实际执行您发布的内容。
  • 除此之外:注意 incr 期望一个变量名 (s),而不是它当前保持的值 ($s)。此外,您可能需要考虑使用tcl::mathop::+,而不是逐步使用incr
  • 我更新了我的代码.. 现在它执行得很好但输出仍然是 0
  • 不,您的编辑只能解决一种错误情况。它不能解决它。首先,确保您了解how to pass around an array in Tcl。其次,看看我之前关于incr 的评论。一步一步,你在你的 sn-p 中加入了两个问题。
  • stackoverflow.com/questions/53364162/… 的重复(这是 相同 问题,尽管是在列表而不是数组上)。

标签: tcl


【解决方案1】:

问题是您将字符串“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

【讨论】:

  • 完美运行!!抱歉,这个问题对你来说似乎很愚蠢,但对我来说不是,谢谢
  • 一点也不傻。我希望我没有给你这样的印象:upvar 命令有点棘手,但是一旦你理解了它的工作原理,你就可以开始编写命令,让你的代码看起来更像 Tcl-ish。
猜你喜欢
  • 2012-11-17
  • 1970-01-01
  • 2012-12-30
  • 2021-10-17
  • 2022-08-19
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
相关资源
最近更新 更多