【问题标题】:C-Like Array in TCLTCL 中的类 C 数组
【发布时间】:2015-07-22 15:58:56
【问题描述】:

我正在将一个程序从 C 移植到 TCL,并且我正在尝试在 C 中实现一个类似于数组的数据结构。我需要它做的两个主要事情是

  • 下单
  • 允许插入任何索引
  • 从过程中返回数组

我会在运行前知道数组的大小,并且在整个程序中大小不应该改变(所以它是静态的)。有没有符合这个要求的数据结构?

如果重要的话,我正在使用 TCL 8.6

编辑:我还需要能够从函数返回数据结构。

【问题讨论】:

  • 匹配 C 数组的东西是 Tcl 列表。 (它们是在幕后用 C 数组实现的。)您可以返回它们,因为它们是普通的写时复制值,并且它们本身就知道它们的顺序。在索引处设置一个值——你的第二个操作——是通过lset(或者lreplace,如果使用正确的话)完成的。真正的 insertion 使列表更长,通常使用linsert。这也不是您显然想要的。

标签: c arrays data-structures tcl


【解决方案1】:

对应的数据结构是list。它满足您的所有要求。如果您希望它具有固定大小,您可以像这样“预分配”它:

set data [lrepeat 8 {}]

这会创建八个空隔间。

它是有序的,您可以通过索引(从 0 开始)访问每个元素,并且可以将其值传递给过程/函数并返回它。您可以使用例如遍历它foreachfor,还有很多列表操作命令。


虽然list 是与C 数组最接近的Tcl 数据容器,但可以使用arraydict 来模拟固定大小、直接访问、有序的容器。
# allocation
set listdata [lrepeat 8 {}]
array set arraydata {0 {} 1 {} 2 {} 3 {} 4 {} 5 {} 6 {} 7 {}}
set dictdata [dict create 0 {} 1 {} 2 {} 3 {} 4 {} 5 {} 6 {} 7 {}]
# or
set dictdata {0 {} 1 {} 2 {} 3 {} 4 {} 5 {} 6 {} 7 {}}

# access (write, then read)
lset listdata 5 96
lindex $listdata 5 ;# -> 96
set arraydata(5) 96
set arraydata(5) ;# -> 96
dict set dictdata 5 96
dict get $dictdata 5 ;# -> 96

# return from procedure
# (not possible with arraydata, arrays are shared using either
# scope manipulation or namespaces)
return $listdata
return $dictdata

# traversal
for {set i 0} {$i < 8} {incr i} {puts [lindex $listdata $i]}
# or
foreach elem $listdata {puts $elem}
for {set i 0} {$i < 8} {incr i} {puts [lindex $arraydata($i)]}
dict for {idx val} $dictdata {puts $val}

文档:array, dict, for, foreach, incr, lindex, lrepeat, lset, puts, return, return, p>

【讨论】:

  • 如果它是预分配的,它将允许我在任何我想要的地方插入对象,对吗?
  • @Sawyer:是的,会的。
  • 这正是我想要的。在我已经接受您的回答之后,您甚至添加了示例。我感激不尽。
  • @Sawyer:没问题。祝你移植顺利。
【解决方案2】:

tcl array (some examples) 或 tcl dict 命令将满足您的需求。

【讨论】:

  • 我不明白您所说的“新订单”是什么意思。基本上,我想要一个有 8 个隔间的盒子。隔间标记为 0 到 7。我可以在隔间 7 中放一些东西,即使隔间 0 到 6 是空的。如果我遍历我的盒子里的东西,它每次都会去“Compartment0,Compartment1,... Compartment7”。希望这是有道理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多