2013-05-27 2 views
1

Этот вопрос вроде последующих от моего last question ...Tcl проблемы отсылая к переменным

У меня возникли некоторые проблемы в верхней части раствора из ответов там. Итак, история такая. Я пытаюсь написать сценарий в сотрудничестве с программой электронного просмотра. Проблема, которую я испытываю, правильно использует мои переменные в синтаксисе электронной программы.

Так что в основном смысл в этом. Я прочитал некоторые проекты, сохранив разные пути в массиве, а затем прочитал их один за другим. Во время этого чтения один за другим я открываю их в программе.

Исходный код для открытия макета для программы заключается в следующем:

set L1 [ layout create ] 
$L1 create cell layout 

$L1 create cell ONE 
$L1 create cell TWO 

set ONE [ layout create /users/jerre_111/public/imec_logo_zwart_512.gds -dt_expand -log LUN.log] 
set ONE_top [$ONE topcell] 
set TWO [ layout create /users/jerre_111/public/logo-rood.gds -dt_expand -log KTH.log] 
set TWO_top [$TWO topcell] 

$L1 import layout $ONE FALSE overwrite 
$L1 import layout $TWO FALSE overwrite 

$L1 create ref ONE $ONE_top  0  0 0 0 1 
$L1 create ref TWO $TWO_top  0  0 0 0 1 

$L1 create ref build ONE   0  0 0 0 1 
$L1 create ref build TWO 207500  0 0 0 1 

Таким образом, это исходный код. ONE и TWO - оба двух разных макета, которые я открываю в программе.

Вот как он должен работать в моем сценарии: я хочу динамически менять ONE и TWO по имени файла, который я открываю. Поэтому каждый раз я получаю путь из массива, а затем получаю имя из пути. Затем я хочу использовать имя файла вместо ONE и TWO. Я пытаюсь это так:

set L1 [ layout create ] 
$L1 create cell build 

foreach key [array names ::openedFiles] { 
    set filename [file tail $::openedFiles($key)] 
    set parts [split $filename .] 
    set name [lindex $parts 0] 

    $L1 create cell $name 

    set $name[ layout create $::openedFiles($key) -dt_expand -log LUN.log] 
    set cell_top [[set $name] topcell] 

    $L1 import layout [set $name] FALSE overwrite 

    $L1 create ref $name $cell_top  0  0 0 0 1 

    $L1 create ref build $name   0  0 0 0 1 
} 

Таким образом, каждый раз, когда я через петлю я получаю один элемент из массива. и затем я динамически даю им имена. Butt У меня возникли некоторые проблемы с В $ONE или ONE как в исходном коде ... Я пытаюсь заменить ONE значением $name ...

Я надеюсь, что вы понимаете мою проблему и кто-то может помочь меня.

ответ

3

Для этого кода вы, вероятно, захотите использовать переменную с псевдонимом.

# Compute the name of the variable to use as in your code... 
# I assume that the name is what $name produces 

upvar 0 $name ALIAS 

После этого, вы можете использовать ALIAS или $ALIAS, где первоначальный образец, используемый ONE или $ONE; они ведут себя одинаково (до конца кадра стека или, пока вы не переопределите псевдоним другим вызовом upvar 0).

$L1 create cell ALIAS 

set ALIAS [layout create $::openedFiles($key) -dt_expand -log LUN.log] 
set cell_top [$ALIAS topcell] 

$L1 import layout $ALIAS FALSE overwrite 

$L1 create ref ALIAS $cell_top  0  0 0 0 1 
$L1 create ref build ALIAS   0  0 0 0 1 

Единственная проблема может заключаться в том, что код сохраняет ссылку на имя переменной. Я предполагаю, что этого кода нет, но некоторые определенно делают.


Альтернативно использовать массив, так как вещи, кажется, ожидают скаляр. Вы даже можете использовать массив с пустым именем:

$L1 create cell ($name) 

set ($name) [layout create $::openedFiles($key) -dt_expand -log LUN.log] 
set cell_top [$($name) topcell] 

$L1 import layout $($name) FALSE overwrite 

$L1 create ref ($name) $cell_top  0  0 0 0 1 
$L1 create ref build ($name)   0  0 0 0 1 

Я действительно не рекомендую использовать пустое имя; хотя он будет поддерживаться в серии 8 * Tcl, конечно, он используется в библиотечных пакетах (в частности, stooop), и мы не уверены, что мы гарантируем это как поддерживаемую функцию в 9.0. Массив с однобуквенным именем будет более понятным IMO.

+0

Благодарим вас за ответ! Первый вариант, который вы предложили, не работал для меня. Но второй сделал!обычно имя никогда не будет пустым, так что это не будет проблемой, я думаю. Большое спасибо за вашу помощь! –

+1

Ничего себе, никогда не думал об использовании пустого имени переменной для массивов. Это круто. –

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