TCL找不到错误

时间:2013-01-15 03:23:15

标签: tcl

我的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
}

3 个答案:

答案 0 :(得分:4)

您的脚本存在一些问题。第一行是第一行:

set QA1 array()

这不符合你的想法。它的作用是创建一个包含七个字符串“array()”的标量变量(不是数组)。

稍后您尝试以数组形式访问它:

set qq1  QA1($COUNTER2)

这句话应该抛出一个错误,说QA1不是一个数组(毕竟它是一个字符串)。

要在tcl中创建数组,正确的语法是:

array set QA1 {}

有关tcl中数组的更多信息,请阅读“array”命令的Tcl手册。请注意,如果您想使用其他语言称为“数组”的内容,您应该查看列表,因为tcl数组是其他语言所谓的“哈希”或“地图”。

其次,你似乎在函数中间返回。返回后,将不会执行return语句之后发生的所有其他代码。因此永远不会设置QA1($COUNTER1)

答案 1 :(得分:1)

除非您的代码不正确,否则return语句将导致K1AxesK2Axes返回,然后才能修改全局变量。 return语句导致proc立即退出。无条件return执行后没有任何内容。

修改
我也认为你误解了tcl中的数组。 set QA1 array() 之类的语句不会创建数组。 尝试set QA1()创建一个空数组。 [我不知道我在想什么。] 使用array command来操作数组。

答案 2 :(得分: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]
}