顺序二进制TCL

时间:2014-01-22 20:19:49

标签: binary tcl

请建议改进​​我的计划。该程序提供4位二进制增量o / p 我正在寻找在没有不必要的代码的地方进行优化。

请建议改进​​我的计划。该程序提供4位二进制增量o / p 我正在寻找优化这个有不必要代码的地方。 请建议改进​​我的计划。该程序提供4位二进制增量o / p 我正在寻找在没有不必要的代码的地方进行优化。

        #!/bin/sh
            # This 
                puts "+++++++++++++++++\n"
            set ipaddr "0.0.0.0"
            set limit 4
            set splitip [split $ipaddr "."]
                puts "Split ip address = $splitip"

            # MAIN ROUTINE
                    set ilength [llength $splitip]
                    puts "Length of string is $ilength"

                    set first [lindex $splitip 0]
                    set  sec [lindex $splitip 1]
                    set third [lindex $splitip 2]
                    set four [lindex $splitip 3]
                        for { set limit 1} { $limit >0} {} {

                            for { set first $first } { $first <= $limit} {} {

                                    for { set sec $sec } { $sec <= $limit} {} {

                                            for { set third $third } { $third <= $limit} {} {

                                                for { set four $four } { $four <= $limit} {} {
                                                    puts " f:$first $sec $third $four"
                                                    incr four
                                                }
                                        set four 0
                                        incr third;                                                     #puts " t:$four $third $sec $first\n"


                                            }
                                        set third 0
                                    incr sec

                                    }
                                                                #puts " f:$four $third $sec $first"
                                        set sec 0
                                incr first

                            }
                        incr limit -1
                        }

            # End Main


                puts "\n++++++End Program+++++++++++"

1 个答案:

答案 0 :(得分:1)

你的程序基本归结为此,这是否符合你的意图?

for { set first 0 } { $first <= 1} {incr first} {
    for { set sec 0 } { $sec <= 1} {incr sec} {
        for { set third 0 } { $third <= 1} {incr third} {
            for { set four 0 } { $four <= 1} {incr four} {
                puts " f:$first $sec $third $four"
            }
        }
    }
}

因为如果是这样,主要的建议就是删除除此之外的所有内容。

另外:[llength $splitip]不会给你字符串长度$splitip,但列表长度。那些是不同的。

您正在使用非常迂回的方式为first等人分配值。相反,使用

lassign $splitip first sec third four

在Tcl 8.5中添加了lassign。如果您使用的是较旧版本的Tcl,请改为使用foreach分配:

foreach {first sec third four} $splitip break

构造

for { set limit 1} { $limit >0} {incr limit -1} { ... }

只是意味着“执行......恰好一次”:它不会以任何方式影响程序的执行。即使你删除它(将代码保留在 body 参数中),其中的代码仍然只执行一次。

为清楚起见,incr x调用应该在for的第三个参数内,而不是在第四个 body 参数内。

最后要注意的是,如果你打算打印出一系列二进制数字,那么这样做会容易得多:

for {set i 0} {$i < 16} {incr i} { puts [format %04b $i] }