0

我是 Tcl/tk 的初学者,在程序中访问数组时遇到问题

以下是我的问题陈述

proc myproc {args} {
  set aaa ""
  set bbb ""
  set ccc ""

  foreach "field value" $args { 
    set $field $value
  }

  # assigning input args values to an array a   
  set a(3:0) $aaa
  set a(6:4) $bbb
  set a(25:7) $ccc

  #do some computation on input arguments may be addition
  #
  #
  #

  # now the result am trying to fetch into another array b

  set  $b(word0) $x
  set  $b(word1) $y
  set  $b(word2) $z
  set  $b(word3) $u

  return [array get b]
}

现在我需要将参数传递给 myproc 并返回我需要访问的数组。

set args_1 "g 1 h 4 k 6"

我尝试了下面的语法,它给我带来了错误。

array set a [myproc[array get $args_1]]

有人可以帮我解决这个问题吗

试图将字符串作为过程 myproc 的输入

然后尝试使用该输入值进行一些计算。

后来在所有计算得到一组字符串值之后,这些值被分配给数组,如下所示

set  $b(word0) $x
set  $b(word1) $y
set  $b(word2) $z
set  $b(word3) $u

想要将此数组b作为返回发送。

例子:

proc myproc {} {  
    set  $b(word0) $x
    set  $b(word1) $y
    set  $b(word2) $z
    set  $b(word3) $u

    return [array get b]
}

我试图访问数组 b 如下

array set a [myproc[array get b]]

它工作:) 能够在调用函数中创建新数组。

但是,需要将字符串参数传递给 myproc 并以数组形式返回

4

1 回答 1

1

该功能对我来说看起来不错。可能有更好的方法来编写它,但它基本上没问题。

但是,如何调用该函数存在一些问题。

首先,您混淆了数组和列表。在 tcl 中,数组是键值对的集合。其他语言称之为“散列”或“映射”。列表听起来像:值列表。其他语言将此称为“数组”或“列表”。

所以,首先:

tcl     other languages
---     ---------------
array = hash
list  = array

之所以选择“数组”这个名称,是因为键值对集合的概念在计算机科学中被称为“关联数组”。这是一个早于使用“数组”一词来表示 C 和 Java 等语言中的值列表的术语。

所以,在这里你要声明一个列表:

set args_1 "g 1 h 4 k 6"

您正尝试将其作为数组访问:

array get $args_1

这应该会抛出一个错误,指出这$args_1不是一个数组。这实际上是真的。

因此,只需将其替换为列表变量:

$args_1

这给了我们:

array set a [myproc$args_1]

这应该会引发另一个错误,基本上说该函数myproc g 1 h 4 k 6不存在。是的,在 tcl 中,函数名称中包含空格是有效的。例如:

proc "an example" {} {return "an example"}

这是有效的代码。你这样称呼它:

set x ["an example"]

因此,tcl 找不到名为“myproc g 1 h 4 k 6”的函数也就不足为奇了。

这意味着空格在 tcl 中很重要。你不能这样做:

set x [y[z]]

这很可能是语法错误。它应该是:

set x [y [z]]
#       ^
#       |______ whitespace was missing

所以你的代码应该是:

array set a [myproc $args_1]
于 2013-07-19T07:48:39.727 回答