1

プロシージャの外でいくつかの変数/配列を渡すにはどうすればよいですか?

たとえば、inputparameters {abcde} を使用したプロシージャ「myproc」があるとします。

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

この手順の中で、それ自体がリストである変数 ae から配列 phiN(1),phiN(2),...phiN(18) を計算したいと思います。

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

(値 1 ~ 9 が入力変数 ae から計算されたとします)。そして、他のパラメータのアルファとベータを計算したい

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

とにかくいいえ、これらの新しい計算変数をプロシージャの外に渡したいと思います。matlab と比較すると、「関数」の外でこれらの変数を取得するように sg と書くだけです。

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

私がtclでどのように対処できるか考えている人はいますか?? ありがとう!

4

1 に答える 1

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
    }
    

編集:Donalが示唆したように、辞書を返すことも可能です:

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]

その他のアイデア (これは配列に関するものですが、値にも適用できます) については、この wiki エントリを参照してください。

于 2013-04-18T14:39:26.213 に答える