Соответствующая структура данных будет list
. Он отвечает всем вашим требованиям. Если вы хотите, чтобы иметь фиксированный размер, вы «предварительно выделить» это следующим образом:
set data [lrepeat 8 {}]
, который создает восемь пустых отсеков.
Заказывается, вы можете получить доступ к каждому элементу по индексу (на основе 0), и вы можете передать его значение в процедуры/функции, а также вернуть его. Вы можете перемещать его, например. foreach
и for
, и есть много команд управления списком.
В то время как
list
является контейнером данных на Tcl, который наиболее близко соответствует матрице C, можно использовать
array
или
dict
для имитации фиксированного размера, прямой доступ, заказал контейнер.
# 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, set
То, что соответствует массив C список Tcl. (Они реализованы с помощью C-массивов за кулисами.) Вы можете вернуть их, поскольку они являются обычными значениями копирования на запись, и они по сути знают свой порядок. Установка значения по индексу - вторая операция - выполняется с помощью 'lset' (или' lreplace', если используется правильно). True _insertion_ делает список длиннее и обычно использует 'linsert'. Это также не то, о чем вы, видимо, просите. –