TCL找不到错误
我的TCL代码有一些问题。请帮我找到它。我已经花了8个小时了,谢谢TCL找不到错误,tcl,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
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
}
除非您的代码不正确,否则return语句将导致K1Axes和K2Axes在修改全局变量之前返回。return语句导致proc立即退出。执行无条件返回后,不会执行任何操作 编辑
我还认为您误解了tcl中的数组。像SETQA1 array这样的语句不会创建数组。尝试设置QA1以创建空数组。[我不知道我在想什么。]使用操作数组。您的脚本有几个问题。第一个在第一行:
set QA1 array()
这和你想象的不一样。它所做的是创建一个标量变量,而不是一个包含七个字符串数组的数组
稍后,您将尝试以数组的形式访问它:
set qq1 QA1($COUNTER2)
该语句应该抛出一个错误,说明QA1不是数组,它毕竟是字符串
要在tcl中创建数组,正确的语法是:
array set QA1 {}
有关Tcl中阵列的更多信息,请阅读Tcl手册中的array命令。请注意,如果您想使用其他语言所称的数组,您应该查看列表,因为tcl数组是其他语言所称的哈希或映射
第二,你似乎在函数的中间返回。返回后,将不执行return语句之后出现的所有其他代码。因此,从未设置QA1$COUNTER1。这是正确的代码。
请详细说明您遇到的问题的性质,以及到目前为止您尝试了什么?这个网站不是为了代码审查。这个问题似乎离题了,因为它太具体了。谢谢。我不知道。我改正了,但是。。。。我还是有点误会你怎么知道,@user1979075?请添加有关问题的错误或错误结果的详细信息。-错误消息:无法读取QA10:变量不是数组设置QA1将投诉无法读取QA1,因为变量不存在。您可能会尝试改为设置QA1以满足设置。但这不是一个空数组。它包含一个元素的值-是数组密钥可以是任何东西,甚至是空字符串和二进制值。你能告诉我如何定义一个向量,然后设置它的所有元素吗?如前所述,请阅读array命令手册,或者如果你只是来自另一种语言,请阅读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}]
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]
}