我的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
}
答案 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
语句将导致K1Axes
和K2Axes
返回,然后才能修改全局变量。 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]
}