对于TCL

时间:2015-05-13 14:09:39

标签: tcl

我想在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吗?

2 个答案:

答案 0 :(得分:4)

incr命令仅适用于整数。否则,请使用:

set i [expr {$i + $power_pitch}]

for命令本身不介意。 (注意浮点舍入问题;它们不是特定于Tcl的,但是可以用任何不是2的幂的整数倍的任何东西命中......)

答案 1 :(得分:3)

Donal已经提供了问题的答案,我只是想对for命令的两点进行观察。

  1. for几乎是自由形式的
  2. 虽然整数计数循环是for的典型用法,但它绝不是唯一的选择
  3. 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
    

    释放你的思想,其余的将随之而来。

    文档:chanexprforincropenputsset,{{3 }}