如何使用循环变量创建二维TCL数组?

时间:2018-07-12 15:15:45

标签: arrays tcl

我正在尝试生成三角形的映射,以确定它们如何相互连接。为此,我需要将任何三角形的索引存储到数组中(数组比列表更清晰)。问题在于三角形的数组有两个维度。第一个是单元格编号,第二个是指向索引的指针,其中有三个。因此,一个单元格的典型声明是:

array set tris {
    1,1 23
    1,2 25
    1,3 34
}

执行puts $tris(1,1)导致打印23。但是,我想使用像foreach这样的循环结构来抽象单元格编号:

foreach cell {1 2 3 4 5} {
    set indices [$dom getCell $cell]
    array set tris {
        $cell,1 [lindex indices 0]
        $cell,2 [lindex indices 1]
        $cell,3 [lindex indices 2]
    }
}

在此循环中,[$dom getCell $cell]是一个Pointwise命令,它返回定义一个三角形(在本例中为第$cell个三角形)的索引的列表。执行此操作并检查$cells(2,1)的内容时,出现错误,指出无法读取“ cells(2,1)”:数组中没有此类元素。根据返回的[$dom getCell $cell]值,我得到23 25 34作为第一个要检查的单元格;所以这是正确的。但是检查数组内容表明我没有正确执行某些操作。我缺少什么或做错了什么?

2 个答案:

答案 0 :(得分:2)

你可以写这个

foreach cell {1 2 3 4 5} {
    set indices [$dom getCell $cell]
    set tris($cell,1) [lindex $indices 0]
    set tris($cell,2) [lindex $indices 1]
    set tris($cell,3) [lindex $indices 2]
}

foreach cell {1 2 3 4 5} {
    lassign [$dom getCell $cell] tris($cell,1) tris($cell,2) tris($cell,3)
}

foreach cell {1 2 3 4 5} {
    set j 0
    foreach elem [$dom getCell $cell] {
        set tris($cell,[incr j]) $elem
    }
}

答案 1 :(得分:0)

用大括号括起来的所有内容都是文字,因此$ cell不会扩展。您可以使用parray tris来精确查看其中的内容。

您可以使用:

foreach cell {1 2 3 4 5} {
    set indices [$dom getCell $cell]
    array set tris [list \
        $cell,1 [lindex $indices 0] \
        $cell,2 [lindex $indices 1] \
        $cell,3 [lindex $indices 2] \ 
        ]
}

(请注意,lindex语法需要列表变量的值,而不是名称)

数组集也可以用for循环替换 设置数组元素的正文:

for {set idx 1} {$idx <= 3} {incr idx} {
  set tris($cell,$idx) [lindex $indices [expr {$idx-1}]]
}