2013-04-18 2 views
1

Как я могу передать некоторые переменные/массивы вне процедуры?переменные/массивы из процедуры tcl

Допустим, у меня есть моя процедура 'myproc' с входными параметрами {a b c d e}, например.

myproc {a b c d e} { 
    ... do something 
    (calculate arrays, lists and new variables) 
} 

Внутри эту процедуру я хочу, чтобы вычислить массив Фин (1), Фин (2), ... Фины (18) из переменных а-е, который сам представляет собой список, например,

set phiN(1) [list 1 2 3 4 5 6 7 8 9]; 

(скажем, значения 1-9 были рассчитаны из входных переменных a-e). И я хочу рассчитать некоторые другие параметры alpha и beta

set alpha [expr a+b]; 
set beta [expr c+d]; 

В любом случае, я не хочу передавать эти новые вычисляемые переменные за пределы моей процедуры. Сравните с matlab, я просто напишу sg, чтобы получить эти переменные за пределами «функции».

[phiN,alpha,beta] = myproc{a b c d e} 

Есть ли у кого-нибудь идеи, как я могу заниматься в tcl ?? Благодаря!

+0

Возможный дубликат [Возвращаемые массивы из процедур в TCL] (http://stackoverflow.com/questions/9755182/returning-arrays-from-procedures-in-tcl) – kostix

+0

Почему вы не искали в первую очередь? В поисках вопросов, в которых упоминаются два слова, «массив» и «процедура», помеченные тегом «tcl», приносят пару уже заданных и ответов на вопросы. – kostix

+0

Спасибо за ссылку. Я искал в другом направлении. Я искал, как я могу передать более одной переменной из proc, но не особенно для массивов. –

ответ

2

Есть несколько вариантов:

  1. Вернуть список и использовать lassign вне
    Пример:

    proc myproc {a b c d e} { 
        set alpha [expr {$a+$b}] 
        set beta [expr {$c+$d}] 
        return [list $alpha $beta] 
    } 
    
    lassign [myproc 1 2 3 4 5] alpha beta 
    

    Это нормально, если вы возвращают значения, но не массивы.

  2. Использование upvar и обеспечивают имя массива/переменной в качестве аргумента
    Пример:

    proc myproc {phiNVar a b c d e} { 
        upvar 1 $phiNVar phiN 
        # Now use phiN as local variable 
        set phiN(1) [list 1 2 3 4 5 6 7 8 9] 
    } 
    
    # Usage 
    myproc foo 1 2 3 4 5 
    foreach i $foo(1) { 
        puts $i 
    } 
    
  3. использовать комбинацию обоих
    Пример:

    proc myproc {phiNVar a b c d e} { 
        uplevel 1 $phiNVar phiN 
        set alpha [expr {$a+$b}] 
        set beta [expr {$c+$d}] 
        set phiN(1) [list 1 2 3 4 5 6 7 8 9] 
        return [list $alpha $beta] 
    } 
    
    lassign [myproc bar 1 2 3 4 5] alpha beta 
    foreach i $bar(1) { 
        puts $i 
    } 
    

Редактировать: Как предположил Донал, это также можно вернуть Dict:

ДИКТ представляет собой список Tcl, где нечетные элементы являются ключами и даже элементы значения. Вы можете преобразовать массив в dict с помощью array get и преобразовать dict обратно в массив с array set. Вы также можете использовать сам dict.
Пример

 proc myproc {a b c d e} { 
     set alpha [expr {$a+$b}] 
     set beta [expr {$c+$d}] 
     set phiN(1) [list 1 2 3 4 5 6 7 8 9] 
     return [list [array get phiN] $alpha $beta] 
    } 

    lassign [myproc 1 2 3 4 5] phiNDict alpha beta 
    array set bar $phiNDict 
    foreach i $bar(1) { 
     puts $i 
    } 
    # Use the [dict] command to manipulate the dict directly 
    puts [dict get $phiNDict 1] 

Для большего количества идей (это о массивах, но может применяться к значениям, а) см this wiki entry.

+0

большое спасибо. именно то, что я искал. –

+1

Также рассмотрите вопрос о возврате словаря; иногда это имеет больше смысла. –

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