Tcl 无效的命令名"&引用;错误

Tcl 无效的命令名"&引用;错误,tcl,Tcl,我用了一段时间来提取向量的tcl脚本突然停止工作,我不确定为什么。此外,这个错误似乎也没有意义 我正在运行的代码是: for {set resd 501} {$resd < 502} {incr resd 1} { set basefile1 "CCvector$resd" set workdir [pwd] set nf [molinfo top get numframes] set fil [open $basefile1.dat w] for {set frame 0} {$f

我用了一段时间来提取向量的tcl脚本突然停止工作,我不确定为什么。此外,这个错误似乎也没有意义

我正在运行的代码是:

for {set resd 501} {$resd < 502} {incr resd 1} {
set basefile1 "CCvector$resd"

set workdir [pwd]
set nf [molinfo top get numframes]

set fil [open $basefile1.dat w]

for {set frame 0} {$frame < $nf} {incr frame 1} {
    animate goto $frame
    display update ui
    set c1 [atomselect top "name C1 and resid $resd and resname G130"]
    set c3 [atomselect top "name C3 and resid $resd and resname G130"]
    set c1c [$c1 get {x y z} ]
    set c3c [$c3 get {x y z} ]
    set c1c3x [expr [$c3 get x]-[$c1 get x]]
    set c1c3y [expr [$c3 get y]-[$c1 get y]]
    set c1c3z [expr [$c3 get z]-[$c1 get z]]
    set st [expr $frame]
    puts $fil [list $st $c1c3x $c1c3y $c1c3z ]
    $c3 delete
    $c1 delete 
}
close $fil
用于{set resd 501}{$resd<502}{incr resd 1}{
将basefile1设置为“CCvector$resd”
设置workdir[pwd]
设置nf[molinfo top获取numframes]
set fil[打开$basefile1.dat w]
对于{set frame 0}{$frame<$nf}{incr frame 1}{
动画转到$frame
显示更新用户界面
设置c1[atomselect top“名称c1和剩余$resd和resname G130”]
设置c3[atomselect top“名称c3和剩余$resd和resname G130”]
集合c1c[$c1获取{x y z}]
set c3c[$c3 get{x y z}]
设置c1c3x[expr[$c3获取x]-[$c1获取x]]
设置c1c3y[expr[$c3获取y]-[$c1获取y]]
设置c1c3z[expr[$c3获取z]-[$c1获取z]]
设置st[expr$frame]
放入$fil[列表$st$c1c3x$c1c3y$c1c3z]
$c3删除
$c1删除
}
收盘价$fil
我收到的原始错误是“在@处缺少操作数”,但我将部分代码替换为:

for {set frame 0} {$frame < $nf} {incr frame 1} {
    animate goto $frame
    display update ui
    set c1 [atomselect top "name C1 and resid $resd and resname G130"]
    set c3 [atomselect top "name C3 and resid $resd and resname G130"]
    set c1x [$c1 get x]
    set c3x [$c3 get x]
    set c1c3x [expr [$c3x - $c1x]]
    set c1y [$c1 get y]
    set c3y [$c3 get y]
    set c1c3y [expr [$c3y - $c1y]]
    set c1z [$c1 get z]
    set c3z [$c3 get z]
    set c1c3z [expr [$c3z - $c1z]]
    set st [expr $frame]
    puts $fil [list $st $c1c3x $c1c3y $c1c3z ]
    $c3 delete
    $c1 delete 
}
close $fil
用于{set frame 0}{$frame<$nf}{incr frame 1}{
动画转到$frame
显示更新用户界面
设置c1[atomselect top“名称c1和剩余$resd和resname G130”]
设置c3[atomselect top“名称c3和剩余$resd和resname G130”]
设置c1x[$c1获取x]
设置c3x[$c3获取x]
设置c1c3x[expr[$c3x-$c1x]]
设置c1y[$c1获取y]
设置c3y[$c3获取y]
设置c1c3y[expr[$c3y-$c1y]]
设置c1z[$c1获取z]
设置c3z[$c3获取z]
设置c1c3z[expr[$c3z-$c1z]]
设置st[expr$frame]
放入$fil[列表$st$c1c3x$c1c3y$c1c3z]
$c3删除
$c1删除
}
收盘价$fil
我现在收到一个“无效命令名”错误。我哪里出错了

附加信息:我正在使用VMD运行此命令,以从加载的gromacs轨迹中提取坐标。

在:

set c1c3z [expr [$c3z - $c1z]]
您试图以
-
$c1z
的内容作为参数运行
$c3z
命令(并将其返回值作为参数传递给
expr

为了与先前版本的代码等效,它将是:

set c1c3z [expr $c3z - $c1z]
但是,由于
$c3z
似乎是空的(所以不是数字),您可能会遇到更多问题

在这里,
$c3z
$c1z
很可能是空的,这意味着
expr
计算
“-”
表达式,您将看到:

$ tclsh <<< 'expr " - "'
missing operand at _@_
in expression " - _@_"
相反,文本
$c3z-$c1z
将被传递到
expr
,并且
expr
将能够在尝试评估时向您提供更有用的错误消息:

$ tclsh <<< 'set a ""; expr {$a - $a}'
can't use empty string as operand of "-"
$tclsh在:

您试图以
-
$c1z
的内容作为参数运行
$c3z
命令(并将其返回值作为参数传递给
expr

为了与先前版本的代码等效,它将是:

set c1c3z [expr $c3z - $c1z]
但是,由于
$c3z
似乎是空的(所以不是数字),您可能会遇到更多问题

在这里,
$c3z
$c1z
很可能是空的,这意味着
expr
计算
“-”
表达式,您将看到:

$ tclsh <<< 'expr " - "'
missing operand at _@_
in expression " - _@_"
相反,文本
$c3z-$c1z
将被传递到
expr
,并且
expr
将能够在尝试评估时向您提供更有用的错误消息:

$ tclsh <<< 'set a ""; expr {$a - $a}'
can't use empty string as operand of "-"

$tclsh更好的方法是
设置c1c3z[expr{$c3z-$c1z}]
这样可以避免各种麻烦并实现更高的编译速度。更好的方法是
设置c1c3z[expr{$c3z-$c1z}]
这样可以避免各种麻烦并实现更高的编译速度。