-7

TCL コードに問題があります。見つけるのを手伝ってください。私はすでに 8 時間を費やしました。ありがとう

set QA1 array()
set QA2 array()
set QA3 array()
set COUNTER1 0
set COUNTER2 0

proc K1Axes { x y z } {
    global QA1
    global QA2
    global QA3
    global COUNTER1

    set fi [expr {2*4*atan(1.)*rand()}]
    set q1 [expr {0.707*cos($fi)}]
    set q2 [expr {0.707*sin($fi)}] 
    set q3 [expr {0.707}]  

    return [list $q1 $q2 $q3]

    set QA1($COUNTER1) [expr {-$q1}]
    set QA2($COUNTER1) [expr {-$q2}]
    set QA3($COUNTER1) [expr {$q3}]
    incr COUNTER1
}


proc K2Axes { x y z } {
    global QA1 
    global QA2
    global QA3
    global COUNTER2 

    set qq1  QA1($COUNTER2)
    set qq2  QA2($COUNTER2)
    set qq3  QA3($COUNTER2)

    return [list $qq1 $qq2 $qq3]

    incr COUNTER2
}
4

3 に答える 3

4

スクリプトにはいくつかの問題があります。その最初のものは最初の行にあります:

set QA1 array()

これはあなたが思っていることをしません。これが行うことは、7 文字の文字列 "array()" を含むスカラー変数 (配列ではない) を作成することです。

後で配列としてアクセスしようとします。

set qq1  QA1($COUNTER2)

このステートメントは、QA1 が配列ではないことを示すエラーをスローする必要があります (結局、文字列です)。

Tcl で配列を作成する正しい構文は次のとおりです。

array set QA1 {}

Tcl の配列の詳細については、「array」コマンドの Tcl マニュアルを参照してください。他の言語で「配列」と呼ばれるものを使用する場合は、代わりにリストを参照する必要があることに注意してください。なぜなら、tcl 配列は他の言語で「ハッシュ」または「マップ」と呼ばれるものだからです。

第二に、あなたは関数の途中で戻ってきたようです。返されると、return ステートメントの後に発生するすべてのコードは実行されません。したがってQA1($COUNTER1)、設定されることはありません。

于 2013-01-15T03:50:34.593 に答える
1

コードが正しくない限り、returnステートメントはグローバルを変更する前にK1Axesandを返します。K2Axesこのreturnステートメントにより、proc はただちに終了します。無条件returnが実行された後は何もありません。

編集
また、tcl の配列を誤解していると思います。のようなステートメントは配列を作成 set QA1 array() しません。空の配列を作成してみてください。set QA1() [そこで何を考えていたのかわかりません。]arrayコマンドを 使用して、配列を操作します。

于 2013-01-15T03:37:35.580 に答える
0

これは正しいコードです。

set COUNTER1 0
set COUNTER2 0

proc K1Axes { x y z } {
  global QA1 
  global QA2
  global QA3
  global COUNTER1
  set fi [expr {2*4*atan(1.)*rand()}]  
  set q1 [expr {0.707*cos($fi)}] 
  set q2 [expr {0.707*sin($fi)}] 
  set q3 [expr {0.707}]    
  set QA1($COUNTER1) [expr {-$q1}]
  set QA2($COUNTER1) [expr {-$q2}]
  set QA3($COUNTER1) [expr {$q3}]
  incr COUNTER1
  return [list $q1 $q2 $q3]
}

proc K2Axes { x y z } {
  global QA1 
  global QA2
  global QA3
  global COUNTER2 
  set qq1  $QA1($COUNTER2)
  set qq2  $QA2($COUNTER2)
  set qq3  $QA3($COUNTER2)
  incr COUNTER2
  return [list $qq1 $qq2 $qq3]
}
于 2013-01-15T15:32:20.470 に答える