0

まったく同じように見えるスクリプトを持っていますが、これではなく、そのスクリプトで機能します。もう数組の目が問題を見つけるのに役立つことを願っています.私はすでに1時間半を費やしています.

グローバル変数を編集するプロシージャがあります。これはより複雑ですが、簡単にするためにこれを使用します。

proc myCustomProc { var } {

global __myGlobal
set __myGlobal [ expr $__myGlobal + 1 ]
}

「メイン」プロシージャで変数をグローバルに定義しました。

proc FOO {} {
global __myGlobal
...
...
myCustomProc 5
puts $__myGlobal

次に、「__myGlobal」を読み取れません:そのような変数はありません

別のスクリプトで動作する別の変数名を持つ正確なコードがあるので、困惑しています。明らかに同一ではありません。問題が見つかりません。

編集: 両方の proc は同じ .tcl ファイルにあります

4

2 に答える 2

2

設定されていない変数から読み取ることはできません。これは、その変数がグローバルであるかどうかに関係なく当てはまります。したがって、コードでは:

set __myGlobal [ expr $__myGlobal + 1 ]

最初にグローバル変数から値を読み取り、次にその値に1を加算してから、結果をグローバル変数に書き戻します。(実際には、変数の内容を式のフラグメントとして解釈しています。これは、低速で安全ではないため、不要なものにすることにかなりのお金をかけます。式全体を中かっこで囲んでください。)

整数に1を追加する場合(およびTcl 8.5以降)は、incr代わりにコマンドを使用する必要があります。これは、存在しない値をゼロであるかのように解釈するためです。

incr __myGlobal

ただし、より複雑なことをしている場合(または8.4以前で作業している場合)は、代わりに次のinfo existsようなチェックを前に置く必要があります。

if {![info exists __myGlobal]} {
    set __myGlobal "the default value";    # Or whatever default you want
}

次のような、より複雑な式を使用することもできます。

set __myGlobal [expr {[info exists __myGlobal] ? $__myGlobal+1 : 1}]

しかし、私は通常、三項演算子を避けようとします。多くの場合、それほど読みやすくはありません。

于 2012-08-09T12:37:44.057 に答える
0

簡単な答えは、設定される前に expr コマンドで $__myGlobal を使用しているということです。

于 2012-08-09T12:53:00.727 に答える