0

xはデバイス名のリストです(デバイス1、デバイス2、デバイス3)文字列ポートを連結することによってデバイス1ごとに作成される変数があるため、最終的にはになり$device-1portます。

xをループすると作成されます

[expr $${x}port-2000 ]   #x is device-1 so it is trying $device-1port-2000 which throws error.

の数値を$device-1portダッシュ​​なしで変数に入れたいのですが。

set xvar $${x}port

[expr $xvar-2000 ]

または、ステートメント$${x}port内で何かをラップできますか。expr

4

2 に答える 2

3

名前に補間を含む変数を読み取るには、 single-argument を使用しますset

set withoutadash [set device-${x}port]

一般に、この種のものには配列を使用する方が適切です。

于 2013-01-10T20:57:53.270 に答える
0

このような複雑な変数を操作する最も優れた方法の 1 つは、upvarコマンドを使用して変数にローカルの「適切な」エイリアスを作成することです。特に、upvar 0ローカル変数にローカル エイリアスを作成します。少しトリッキーですが、既知のテクニックです。

upvar 0 ${x}port current_port

これで、ポートの読み取り、書き込み、または設定解除はcurrent_port、厄介な名前のポートの読み取り/書き込み/設定解除と同じになり、コードを簡単に書くことができます。

puts [expr { $current_port - 2000 }]
set current_port 12345
# etc.

エイリアスは、現在の手順の最後で忘れられます。


もちろん、代わりに配列の使用を検討する必要があります。それらはより単純であり、計算された変数名で一生懸命働く必要はありません:

set x 1
set device($x,port) 12345
puts [expr {$device($x,port) - 2000}]
于 2013-01-10T23:11:12.840 に答える