2

以下のようなカウンターを実行して手動で配列を設定するのではなく、動的に配列にデータを入力しようとしています。

set all_list  { <my list>}
set num_pc_a_b 10

for {set i 0 ;set j 0 ; set k 0} {$j < $num_pc_a_b} {incr j; incr i ;incr k} {
    array set link_map  {[lindex $all_list $i] $j $k 0 }
}

そして、以下のような変数にアクセスすることを望んでいます:

foreach {key value value1 value2} [array get link_map] {
    puts "key is $key"
    puts "value is $value"
    puts "value is $value1"
    puts "value is $value2"
}

しかし、それは機能しません。私はここで何か間違ったことをしていますか?

4

1 に答える 1

6

あなたが本当に何をしたいのかすぐにはわかりませんので、推測します。

いずれの場合も、の使用法array set ...が間違っているように見えることに注意してください。このコマンドは、配列の名前と、キーと値を交互に使用するものとして解釈するリストを取得し、そのキーに続く値にマップされたキーごとにその配列にエントリを作成します。反復ごとに特定のキーを特定の値に設定したいようです—これはset array(key) value構文によって行われます。

jまた、あなたの例では、ik変数は各反復で同じ値を持っているように見えることに注意してください。おそらくそれは実際のコードからの残り物ですが、そうでなければ1つの変数だけで十分です。

1つを推測します。各キーを値のリストにマップします。Tclの場合のように、これは例のようには機能しません。配列は各キーを1つの値にマップします。ただし、この値はリストである可能性があります。私の推測が正しければ、進むべき道は次のとおりです。

for {set i 0 ;set j 0 ; set k 0} {$j < $num_pc_a_b} {incr j; incr i ;incr k} {
    set link_map([lindex $all_list $i]) [list $j $k 0]
}
foreach {key val} [array get link_map] {
    foreach {v1 v2 v3} $val break ;# see a note below
    puts "key is $key"
    puts "value is $v1"
    puts "value is $v2"
    puts "value is $v3"
}

2つを推測します。foreach表示の使用法から判断すると、配列をまったく使用せず、リストを使用することをお勧めします。

set links [list]
for {set i 0 ;set j 0 ; set k 0} {$j < $num_pc_a_b} {incr j; incr i ;incr k} {
    lappend links [lindex $all_list $i] $j $k 0
}
foreach {key v1 v2 v3} $links {
    puts "key is $key"
    puts "value is $v1"
    puts "value is $v2"
    puts "value is $v3"
}

フラットリストではなく、変更するキーと値のリストを作成することもできます。各値[list $j $k 0]は、最初の推測の例のようになります。

アップデート

3つだと思います。あなたは私たちの質問にとしてタグを付けましmultidimensional-arrayた。スニペットに多次元性の痕跡は見当たりませんが、本当に必要な場合は、Tclの通常のパラダイムは複合キーを使用することです。たとえば、の値で配列にキーを設定する必要があり、jこれらの変数が各反復で持つ場合は、次のようなものを使用します。ik

for {set i 0 ;set j 0 ; set k 0} {$j < $num_pc_a_b} {incr j; incr i ;incr k} {
    set link_map($i,$j,$k) ...
}

これにより、コンマを使用して3つの値を連結する文字列が作成され、その結果がキーとして使用されます。


リストを分解するための使用法はforeach ... break巧妙なトリックですが、Tcl 8.5以降を使用している場合は、lassign $list v1 v2 v3代わりに使用してください。

于 2012-11-09T20:31:38.377 に答える