2014-01-22 3 views
0

Просьба предложить улучшения в моей программе. Эта программа дает 4-битный двоичный инкремент o/p Я ищу оптимизацию этого, где есть ненужный код.последовательный двоичный код TCL

Просьба предложить улучшения в моей программе. Эта программа дает 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+++++++++++" 
+0

Если вы действительно обрабатывать IP-адресов, возможно, взглянуть на пакет tcllib ip тоже. (http://tcllib.sourceforge.net/doc/tcllib_ip.html) – schlenk

+0

Спасибо schlenk за эту ссылку. – user3211264

ответ

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 

lassign был добавлен в Tcl 8.5. Если вы используете старую версию Tcl, использовать задание по foreach вместо:

foreach {first sec third four} $splitip break 

Конструкт

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

просто означает «выполнить ... ровно один раз»: это не влияет на выполнение программы каким-либо образом. Даже если вы удалите его (сохраняя код внутри аргумента ), код, который был внутри него, будет выполняться ровно один раз.

Для ясности, incr x вызовы должны быть внутри третьего аргумента for, а не внутри четвертого, тела, аргумент.

В заключительной ноте, если ваша цель состоит, чтобы распечатать последовательность двоичных чисел, это намного проще сделать это таким образом:

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

Да! Полагаю, что так. Просто нужен сброс до 0 после каждого цикла (??), но вы правы. – user3211264

+0

Вам не нужно обнулять значение 0, что уже происходит. –

+0

Ничего себе! спасибо за ваши предложения! это сделает мое программирование намного лучше. – user3211264

Смежные вопросы