-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()

这并不像你认为的那样。它所做的是创建一个包含七个字符串“array()”的标量变量(不是数组)。

稍后您尝试将其作为数组访问:

set qq1  QA1($COUNTER2)

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

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

array set QA1 {}

请阅读“array”命令的 Tcl 手册以获取有关 tcl 中数组的更多信息。请注意,如果您想使用其他语言所称的“数组”,则应改为查看列表,因为 tcl 数组是其他语言所称的“散列”或“映射”。

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

于 2013-01-15T03:50:34.593 回答
1

除非您的代码不正确,否则该return语句将在修改全局变量之前导致K1AxesK2Axes返回。该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 回答