我正在尝试生成三角形的映射,以确定它们如何相互连接。为此,我需要将任何三角形的索引存储到数组中(数组比列表更清晰)。问题在于三角形的数组有两个维度。第一个是单元格编号,第二个是指向索引的指针,其中有三个。因此,一个单元格的典型声明是:
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
作为第一个要检查的单元格;所以这是正确的。但是检查数组内容表明我没有正确执行某些操作。我缺少什么或做错了什么?
答案 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}]]
}