首页 > 解决方案 > 如何使用循环变量创建二维 TCL 数组?

问题描述

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

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

在打印 23 时执行puts $tris(1,1)结果。但是,我想使用循环结构来抽象单元格编号,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第 th 个三角形。当我这样做并检查 的内容时$cells(2,1),我收到一条错误消息,指出无法读取 "cells(2,1)": no such element in array。根据 的返回值[$dom getCell $cell],我得到23 25 34第一个单元格进行检查;所以这是正确的。但是检查数组内容表明我没有正确地做某事。我错过了什么或做错了什么?

标签: arraystcl

解决方案


你可以写这个

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
    }
}

推荐阅读