2015-07-22 2 views
2

Я портирую программу с C на TCL, и я пытаюсь реализовать структуру данных, аналогичную массиву в C. Две основные вещи, которые мне нужны, этоC-Like Array в TCL

  • заказывается
  • Разрешить вставку в любой индекс
  • Возвращения массив из процедуры

я знать размер массива до времени выполнения, и размер не должен меняться в течение всей программы (поэтому он статичен). Существуют ли какие-либо структуры данных, соответствующие этому законопроекту?

Я использую TCL 8.6, если это имеет значение

EDIT: Я также должен быть в состоянии вернуть структуру данных из функции.

+0

То, что соответствует массив C список Tcl. (Они реализованы с помощью C-массивов за кулисами.) Вы можете вернуть их, поскольку они являются обычными значениями копирования на запись, и они по сути знают свой порядок. Установка значения по индексу - вторая операция - выполняется с помощью 'lset' (или' lreplace', если используется правильно). True _insertion_ делает список длиннее и обычно использует 'linsert'. Это также не то, о чем вы, видимо, просите. –

ответ

4

Соответствующая структура данных будет 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

+0

Если это предопределено, это позволит мне вставлять объекты, когда захочу, правильно? – Sawyer

+1

@Sawyer: да, это будет. –

+0

Это именно то, что я хотел. Вы даже добавили примеры после того, как я уже принял ваш ответ. Я не могу тебя отблагодарить. – Sawyer

1

Либо tcl array (some examples), либо команда tcl dict подойдет вашим потребностям.

+0

Я не понимаю, что вы подразумеваете под «новым заказом». В принципе, я хочу коробку с 8 отсеками. Отсеки маркируются от 0 до 7. Я могу положить что-то в отсек 7, даже если отсеки от 0 до 6 пустые. Если я переберусь через то, что у меня в коробке, он будет каждый раз «отделять», «отсек1», «отсек» 7. Надеюсь, это имеет смысл. – Sawyer

Смежные вопросы