我想在TCL中实现以下C代码:
Float power_pitch = 8
float offset = 7.5
float threshold = 100
for(i=power_pitch+offset ; i<= threshold ; i += power_pitch)
我想在TCL中实现上面的forloop。我在TCL中尝试了以下代码:
set power_pitch 8
set offset 7.5
set threshold 100
for { set i [expr $power_pitch + $offset] } { $i <= $threshold } { incr i $power_pitch}
但是当我执行上面的代码时,我收到以下错误:
预期的整数,但得到了&#34; 15.5&#34; 在执行incr i $ power_pitch
时
你能帮我在TCL上实现上面的forloop吗?
答案 0 :(得分:4)
incr
命令仅适用于整数。否则,请使用:
set i [expr {$i + $power_pitch}]
for
命令本身不介意。 (注意浮点舍入问题;它们不是特定于Tcl的,但是可以用任何不是2的幂的整数倍的任何东西命中......)
答案 1 :(得分:3)
Donal已经提供了问题的答案,我只是想对for
命令的两点进行观察。
for
几乎是自由形式的for
的典型用法,但它绝不是唯一的选择 for
命令具有概要
开始 测试 下一步 正文
其中开始, next 和 body 是命令字符串(即适合作为eval
的参数;它们可以是空的,包含单个命令,或者是完整的脚本)和 test 是一个布尔表达式字符串(即适合作为expr
和的参数来评估或者可以被强制转换为布尔值。)
通常, start 用于设置 test 和 body ,而 next 应该带来状态逐渐接近 test 返回错误值,但这只是一个约定,而不是一个要求。以下是完全有效(但相当臭)的调用:
for {set n 0 ; puts -nonewline X} {[incr n] < 5} {puts -nonewline X} {
puts -nonewline [string repeat - $n]
}
for {set f [open foo.txt] ; set n 0} {$n >= 0} {puts $line} {
set n [chan gets $f line]
}
给for
命令字符串和布尔表达式的任意组合,它将运行。它可能永远执行它的身体,甚至不执行一次,但它会运行。不要将自己限制在20世纪50年代的for {set i 0} {$i < 10} {incr i} {...}
调用中。
即使你只是想用它来计算循环,仍然有很多选项,例如:
for {set i 0} {$i < $limit} {incr i} {...} ;# simple increment
for {set i 0} {$i < $limit} {incr i $n} {...} ;# stepping increment/decrement
for {set i 0} {$i < $limit} {incr i $i} {...} ;# doubling increment
for {set i 0} {$i < $limit} {set i [expr {...}]} {...} ;# arbitrary change
释放你的思想,其余的将随之而来。