Tcl/Tk непонятный сбой при работе скрипта

Автор Евгений, 20 января 2015, 18:14:51

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

Евгений

Доброго времени!

Случилась у меня непонятная проблема. Работает скрипт, шаг за шагом отрабатывает переменную за переменной. Переменные рассчитываются последовательно, код для расчёта один и тот же, только название переменной меняется. и вот на 5 или 6 переменной пишет мне ошибку

can't read "h1": no such variable
    while executing
"if {$h1  < $h2  && $h1  < $ve1 && $ve1 < $h2}  {lappend ve9 1} elseif {
    $h2  < $h1  && $h1  < $ve1 && $ve1 < 360.0} {lappend ve9 1} elseif {

Проверяю значение переменной h1 - оно есть, выводится, всё нормально.

И больше всего напрягает то обстоятельство. что сбой происходит на 8-ой или 9-ый расчёт. Код идентичный, алгоритм тот же, эта же переменная прекрасно учитывалась в предыдущих расчётах.

Даже вопрос возник - нет ли в Tcl/Tk ограничений на число строк скрипта? Прошу направить в верном направлении и поделиться соображениями.


#!/usr/bin/tclsh
package require Tk
wm title . "Расчёт гороскопа на заданное время и место"
pack [frame .frame1]

grid [label .frame1.ur9 -text "⛢"] [entry .ur9 -textvar ur9 -width 13]
grid [label .frame1.sa9 -text "♄"] [entry .sa9 -textvar sa9 -width 13]
grid [label .frame1.ju9 -text "♃"] [entry .ju9 -textvar ju9 -width 13]
grid [label .frame1.ma9 -text "♂"] [entry .ma9 -textvar ma9 -width 13]
grid [label .frame1.ve9 -text "♀"] [entry .ve9 -textvar ve9 -width 13]

pack [button .button1 -text "Считать" -command {
set jd  [exec swetest -b$date -ut$time -fJ -head -p0]
set jd1 [expr [exec swetest -b$date -ut$time -fJ -head -p0]-1.0/86400.0]
set jd2 [expr [exec swetest -b$date -ut$time -fJ -head -p0]+1.0/86400.0]

set ve1 [exec swetest -j$jd -p3 -head -fl | sed "s/\ //g"]
set ve2 [exec swetest -j$jd1 -p3 -head -fl | sed "s/\ //g"]
set ve3 [exec swetest -j$jd2 -p3 -head -fl | sed "s/\ //g"]
if {$ve3>$ve2} {set ve4 "♀"} else {set ve4 "♀R"}
         if {0.0< $ve1 && $ve1 <30.0} {set ve5 "♈"
} elseif  {30.0< $ve1 && $ve1 <60.0}  {set ve5 "♉"
} elseif  {60.0< $ve1 && $ve1 <90.0}  {set ve5 "♊"
} elseif  {90.0< $ve1 && $ve1 <120.0} {set ve5 "♋"
} elseif {120.0< $ve1 && $ve1 <150.0} {set ve5 "♌"
} elseif {150.0< $ve1 && $ve1 <180.0} {set ve5 "♍"
} elseif {180.0< $ve1 && $ve1 <210.0} {set ve5 "♎"
} elseif {210.0< $ve1 && $ve1 <240.0} {set ve5 "♏"
} elseif {240.0< $ve1 && $ve1 <270.0} {set ve5 "♐"
} elseif {270.0< $ve1 && $ve1 <300.0} {set ve5 "♑"
} elseif {300.0< $ve1 && $ve1 <330.0} {set ve5 "♒"
} elseif {330.0< $ve1 && $ve1 <360.0} {set ve5 "♓"}
         if {0.0< $ve1 && $ve1 <30.0} {set ve6 [expr $ve1-0]
} elseif  {30.0< $ve1 && $ve1 <60.0}  {set ve6 [expr $ve1-30]
} elseif  {60.0< $ve1 && $ve1 <90.0}  {set ve6 [expr $ve1-60]
} elseif  {90.0< $ve1 && $ve1 <120.0} {set ve6 [expr $ve1-90]
} elseif {120.0< $ve1 && $ve1 <150.0} {set ve6 [expr $ve1-120]
} elseif {150.0< $ve1 && $ve1 <180.0} {set ve6 [expr $ve1-150]
} elseif {180.0< $ve1 && $ve1 <210.0} {set ve6 [expr $ve1-180]
} elseif {210.0< $ve1 && $ve1 <240.0} {set ve6 [expr $ve1-210]
} elseif {240.0< $ve1 && $ve1 <270.0} {set ve6 [expr $ve1-240]
} elseif {270.0< $ve1 && $ve1 <300.0} {set ve6 [expr $ve1-270]
} elseif {300.0< $ve1 && $ve1 <330.0} {set ve6 [expr $ve1-300]
} elseif {330.0< $ve1 && $ve1 <360.0} {set ve6 [expr $ve1-330]}
set ve7 "[expr int($ve6)]°[expr int(($ve6-int($ve6))*60)]′[expr int((($ve6-int($ve6))*60 - int(($ve6-int($ve6))*60))*60)]\""
set ve8 "$ve4 $ve7 $ve5"

# ⛢ - элемент домов
# положение планеты в доме

if {$h1  < $h2  && $h1  < $ur1 && $ur1 < $h2}  {lappend ur9 1} elseif {
    $h2  < $h1  && $h1  < $ur1 && $ur1 < 360.0} {lappend ur9 1} elseif {
    $h2  < $h1  && $ur1 < $h2}                   {lappend ur9 1}
if {$h2  < $h3  && $h2  < $ur1 && $ur1 < $h3}  {lappend ur9 2} elseif {
    $h3  < $h2  && $h2  < $ur1 && $ur1 < 360.0} {lappend ur9 2} elseif {
    $h3  < $h2  && $ur1 < $h3}                   {lappend ur9 2}
if {$h3  < $h4  && $h3  < $ur1 && $ur1 < $h4}  {lappend ur9 3} elseif {
    $h4  < $h3  && $h3  < $ur1 && $ur1 < 360.0} {lappend ur9 3} elseif {
    $h4  < $h3  && $ur1 < $h4}                   {lappend ur9 3}
if {$h4  < $h5  && $h4  < $ur1 && $ur1 < $h5}  {lappend ur9 4} elseif {
    $h5  < $h4  && $h4  < $ur1 && $ur1 < 360.0} {lappend ur9 4} elseif {
    $h5  < $h4  && $ur1 < $h5}                   {lappend ur9 4}
if {$h5  < $h6  && $h5  < $ur1 && $ur1 < $h6}  {lappend ur9 5} elseif {
    $h6  < $h5  && $h5  < $ur1 && $ur1 < 360.0} {lappend ur9 5} elseif {
    $h6  < $h5  && $ur1 < $h6}                   {lappend ur9 5}
if {$h6  < $h7  && $h6  < $ur1 && $ur1 < $h7}  {lappend ur9 6} elseif {
    $h7  < $h6  && $h6  < $ur1 && $ur1 < 360.0} {lappend ur9 6} elseif {
    $h7  < $h6  && $ur1 < $h7}                   {lappend ur9 6}
if {$h7  < $h8  && $h7  < $ur1 && $ur1 < $h8}  {lappend ur9 7} elseif {
    $h8  < $h7  && $h7  < $ur1 && $ur1 < 360.0} {lappend ur9 7} elseif {
    $h8  < $h7  && $ur1 < $h8}                   {lappend ur9 7}
if {$h8  < $h9  && $h8  < $ur1 && $ur1 < $h9}  {lappend ur9 8} elseif {
    $h9  < $h8  && $h8  < $ur1 && $ur1 < 360.0} {lappend ur9 8} elseif {
    $h9  < $h8  && $ur1 < $h9}                   {lappend ur9 8}
if {$h9  < $h10 && $h9  < $ur1 && $ur1 < $h10} {lappend ur9 9} elseif {
    $h10 < $h9  && $h9  < $ur1 && $ur1 < 360.0} {lappend ur9 9} elseif {
    $h10 < $h9  && $ur1 < $h10}                  {lappend ur9 9}
if {$h10 < $h11 && $h10 < $ur1 && $ur1 < $h11} {lappend ur9 10} elseif {
    $h11 < $h10 && $h10 < $ur1 && $ur1 < 360.0} {lappend ur9 10} elseif {
    $h11 < $h10 && $ur1 < $h11}                  {lappend ur9 10}
if {$h11 < $h12 && $h11 < $ur1 && $ur1 < $h12} {lappend ur9 11} elseif {
    $h12 < $h11 && $h11 < $ur1 && $ur1 < 360.0} {lappend ur9 11} elseif {
    $h12 < $h11 && $ur1 < $h12}                  {lappend ur9 11}
if {$h12 < $h1  && $h12 < $ur1 && $ur1 < $h1}  {lappend ur9 12} elseif {
    $h1  < $h12 && $h12 < $ur1 && $ur1 < 360.0} {lappend ur9 12} elseif {
    $h1  < $h12 && $ur1 < $h1}                   {lappend ur9 12}

# ♄ - элемент домов
# положение планеты в доме

if {$h1  < $h2  && $h1  < $sa1 && $sa1 < $h2}  {lappend sa9 1} elseif {
    $h2  < $h1  && $h1  < $sa1 && $sa1 < 360.0} {lappend sa9 1} elseif {
    $h2  < $h1  && $sa1 < $h2}                   {lappend sa9 1}
if {$h2  < $h3  && $h2  < $sa1 && $sa1 < $h3}  {lappend sa9 2} elseif {
    $h3  < $h2  && $h2  < $sa1 && $sa1 < 360.0} {lappend sa9 2} elseif {
    $h3  < $h2  && $sa1 < $h3}                   {lappend sa9 2}
if {$h3  < $h4  && $h3  < $sa1 && $sa1 < $h4}  {lappend sa9 3} elseif {
    $h4  < $h3  && $h3  < $sa1 && $sa1 < 360.0} {lappend sa9 3} elseif {
    $h4  < $h3  && $sa1 < $h4}                   {lappend sa9 3}
if {$h4  < $h5  && $h4  < $sa1 && $sa1 < $h5}  {lappend sa9 4} elseif {
    $h5  < $h4  && $h4  < $sa1 && $sa1 < 360.0} {lappend sa9 4} elseif {
    $h5  < $h4  && $sa1 < $h5}                   {lappend sa9 4}
if {$h5  < $h6  && $h5  < $sa1 && $sa1 < $h6}  {lappend sa9 5} elseif {
    $h6  < $h5  && $h5  < $sa1 && $sa1 < 360.0} {lappend sa9 5} elseif {
    $h6  < $h5  && $sa1 < $h6}                   {lappend sa9 5}
if {$h6  < $h7  && $h6  < $sa1 && $sa1 < $h7}  {lappend sa9 6} elseif {
    $h7  < $h6  && $h6  < $sa1 && $sa1 < 360.0} {lappend sa9 6} elseif {
    $h7  < $h6  && $sa1 < $h7}                   {lappend sa9 6}
if {$h7  < $h8  && $h7  < $sa1 && $sa1 < $h8}  {lappend sa9 7} elseif {
    $h8  < $h7  && $h7  < $sa1 && $sa1 < 360.0} {lappend sa9 7} elseif {
    $h8  < $h7  && $sa1 < $h8}                   {lappend sa9 7}
if {$h8  < $h9  && $h8  < $sa1 && $sa1 < $h9}  {lappend sa9 8} elseif {
    $h9  < $h8  && $h8  < $sa1 && $sa1 < 360.0} {lappend sa9 8} elseif {
    $h9  < $h8  && $sa1 < $h9}                   {lappend sa9 8}
if {$h9  < $h10 && $h9  < $sa1 && $sa1 < $h10} {lappend sa9 9} elseif {
    $h10 < $h9  && $h9  < $sa1 && $sa1 < 360.0} {lappend sa9 9} elseif {
    $h10 < $h9  && $sa1 < $h10}                  {lappend sa9 9}
if {$h10 < $h11 && $h10 < $sa1 && $sa1 < $h11} {lappend sa9 10} elseif {
    $h11 < $h10 && $h10 < $sa1 && $sa1 < 360.0} {lappend sa9 10} elseif {
    $h11 < $h10 && $sa1 < $h11}                  {lappend sa9 10}
if {$h11 < $h12 && $h11 < $sa1 && $sa1 < $h12} {lappend sa9 11} elseif {
    $h12 < $h11 && $h11 < $sa1 && $sa1 < 360.0} {lappend sa9 11} elseif {
    $h12 < $h11 && $sa1 < $h12}                  {lappend sa9 11}
if {$h12 < $h1  && $h12 < $sa1 && $sa1 < $h1}  {lappend sa9 12} elseif {
    $h1  < $h12 && $h12 < $sa1 && $sa1 < 360.0} {lappend sa9 12} elseif {
    $h1  < $h12 && $sa1 < $h1}                   {lappend sa9 12}

# ♃ - элемент домов
# положение планеты в доме

if {$h1  < $h2  && $h1  < $ju1 && $ju1 < $h2}  {lappend ju9 1} elseif {
    $h2  < $h1  && $h1  < $ju1 && $ju1 < 360.0} {lappend ju9 1} elseif {
    $h2  < $h1  && $ju1 < $h2}                   {lappend ju9 1}
if {$h2  < $h3  && $h2  < $ju1 && $ju1 < $h3}  {lappend ju9 2} elseif {
    $h3  < $h2  && $h2  < $ju1 && $ju1 < 360.0} {lappend ju9 2} elseif {
    $h3  < $h2  && $ju1 < $h3}                   {lappend ju9 2}
if {$h3  < $h4  && $h3  < $ju1 && $ju1 < $h4}  {lappend ju9 3} elseif {
    $h4  < $h3  && $h3  < $ju1 && $ju1 < 360.0} {lappend ju9 3} elseif {
    $h4  < $h3  && $ju1 < $h4}                   {lappend ju9 3}
if {$h4  < $h5  && $h4  < $ju1 && $ju1 < $h5}  {lappend ju9 4} elseif {
    $h5  < $h4  && $h4  < $ju1 && $ju1 < 360.0} {lappend ju9 4} elseif {
    $h5  < $h4  && $ju1 < $h5}                   {lappend ju9 4}
if {$h5  < $h6  && $h5  < $ju1 && $ju1 < $h6}  {lappend ju9 5} elseif {
    $h6  < $h5  && $h5  < $ju1 && $ju1 < 360.0} {lappend ju9 5} elseif {
    $h6  < $h5  && $ju1 < $h6}                   {lappend ju9 5}
if {$h6  < $h7  && $h6  < $ju1 && $ju1 < $h7}  {lappend ju9 6} elseif {
    $h7  < $h6  && $h6  < $ju1 && $ju1 < 360.0} {lappend ju9 6} elseif {
    $h7  < $h6  && $ju1 < $h7}                   {lappend ju9 6}
if {$h7  < $h8  && $h7  < $ju1 && $ju1 < $h8}  {lappend ju9 7} elseif {
    $h8  < $h7  && $h7  < $ju1 && $ju1 < 360.0} {lappend ju9 7} elseif {
    $h8  < $h7  && $ju1 < $h8}                   {lappend ju9 7}
if {$h8  < $h9  && $h8  < $ju1 && $ju1 < $h9}  {lappend ju9 8} elseif {
    $h9  < $h8  && $h8  < $ju1 && $ju1 < 360.0} {lappend ju9 8} elseif {
    $h9  < $h8  && $ju1 < $h9}                   {lappend ju9 8}
if {$h9  < $h10 && $h9  < $ju1 && $ju1 < $h10} {lappend ju9 9} elseif {
    $h10 < $h9  && $h9  < $ju1 && $ju1 < 360.0} {lappend ju9 9} elseif {
    $h10 < $h9  && $ju1 < $h10}                  {lappend ju9 9}
if {$h10 < $h11 && $h10 < $ju1 && $ju1 < $h11} {lappend ju9 10} elseif {
    $h11 < $h10 && $h10 < $ju1 && $ju1 < 360.0} {lappend ju9 10} elseif {
    $h11 < $h10 && $ju1 < $h11}                  {lappend ju9 10}
if {$h11 < $h12 && $h11 < $ju1 && $ju1 < $h12} {lappend ju9 11} elseif {
    $h12 < $h11 && $h11 < $ju1 && $ju1 < 360.0} {lappend ju9 11} elseif {
    $h12 < $h11 && $ju1 < $h12}                  {lappend ju9 11}
if {$h12 < $h1  && $h12 < $ju1 && $ju1 < $h1}  {lappend ju9 12} elseif {
    $h1  < $h12 && $h12 < $ju1 && $ju1 < 360.0} {lappend ju9 12} elseif {
    $h1  < $h12 && $ju1 < $h1}                   {lappend ju9 12}

# ♂ - элемент домов
# положение планеты в доме

[b]if {$h1  < $h2  && $h1  < $ma1 && $ma1 < $h2}  {lappend ma9 1} elseif {
    $h2  < $h1  && $h1  < $ma1 && $ma1 < 360.0} {lappend ma9 1} elseif {
    $h2  < $h1  && $ma1 < $h2}                   {lappend ma9 1}[/b]
if {$h2  < $h3  && $h2  < $ma1 && $ma1 < $h3}  {lappend ma9 2} elseif {
    $h3  < $h2  && $h2  < $ma1 && $ma1 < 360.0} {lappend ma9 2} elseif {
    $h3  < $h2  && $ma1 < $h3}                   {lappend ma9 2}
if {$h3  < $h4  && $h3  < $ma1 && $ma1 < $h4}  {lappend ma9 3} elseif {
    $h4  < $h3  && $h3  < $ma1 && $ma1 < 360.0} {lappend ma9 3} elseif {
    $h4  < $h3  && $ma1 < $h4}                   {lappend ma9 3}
if {$h4  < $h5  && $h4  < $ma1 && $ma1 < $h5}  {lappend ma9 4} elseif {
    $h5  < $h4  && $h4  < $ma1 && $ma1 < 360.0} {lappend ma9 4} elseif {
    $h5  < $h4  && $ma1 < $h5}                   {lappend ma9 4}
if {$h5  < $h6  && $h5  < $ma1 && $ma1 < $h6}  {lappend ma9 5} elseif {
    $h6  < $h5  && $h5  < $ma1 && $ma1 < 360.0} {lappend ma9 5} elseif {
    $h6  < $h5  && $ma1 < $h6}                   {lappend ma9 5}
if {$h6  < $h7  && $h6  < $ma1 && $ma1 < $h7}  {lappend ma9 6} elseif {
    $h7  < $h6  && $h6  < $ma1 && $ma1 < 360.0} {lappend ma9 6} elseif {
    $h7  < $h6  && $ma1 < $h7}                   {lappend ma9 6}
if {$h7  < $h8  && $h7  < $ma1 && $ma1 < $h8}  {lappend ma9 7} elseif {
    $h8  < $h7  && $h7  < $ma1 && $ma1 < 360.0} {lappend ma9 7} elseif {
    $h8  < $h7  && $ma1 < $h8}                   {lappend ma9 7}
if {$h8  < $h9  && $h8  < $ma1 && $ma1 < $h9}  {lappend ma9 8} elseif {
    $h9  < $h8  && $h8  < $ma1 && $ma1 < 360.0} {lappend ma9 8} elseif {
    $h9  < $h8  && $ma1 < $h9}                   {lappend ma9 8}
if {$h9  < $h10 && $h9  < $ma1 && $ma1 < $h10} {lappend ma9 9} elseif {
    $h10 < $h9  && $h9  < $ma1 && $ma1 < 360.0} {lappend ma9 9} elseif {
    $h10 < $h9  && $ma1 < $h10}                  {lappend ma9 9}
if {$h10 < $h11 && $h10 < $ma1 && $ma1 < $h11} {lappend ma9 10} elseif {
    $h11 < $h10 && $h10 < $ma1 && $ma1 < 360.0} {lappend ma9 10} elseif {
    $h11 < $h10 && $ma1 < $h11}                  {lappend ma9 10}
if {$h11 < $h12 && $h11 < $ma1 && $ma1 < $h12} {lappend ma9 11} elseif {
    $h12 < $h11 && $h11 < $ma1 && $ma1 < 360.0} {lappend ma9 11} elseif {
    $h12 < $h11 && $ma1 < $h12}                  {lappend ma9 11}
if {$h12 < $h1  && $h12 < $ma1 && $ma1 < $h1}  {lappend ma9 12} elseif {
    $h1  < $h12 && $h12 < $ma1 && $ma1 < 360.0} {lappend ma9 12} elseif {
    $h1  < $h12 && $ma1 < $h1}                   {lappend ma9 12}

# ♀ - элемент домов
# положение планеты в доме
if {$h1  < $h2  && $h1  < $ve1 && $ve1 < $h2}  {lappend ve9 1} elseif {
    $h2  < $h1  && $h1  < $ve1 && $ve1 < 360.0} {lappend ve9 1} elseif {
    $h2  < $h1  && $ve1 < $h2}                   {lappend ve9 1}

pack [button .button9 -text "Выход из программы" -command {exit}]

vic5710

из текста вообще не видно где определяется h1

Евгений

Не влезает, вот кусок кода, определяющий h1:
set h1 [exec swetest -b$date -house$longitude,$latitude4,k -ut$time -head -p -fPl | grep  "house  1" | sed "s/house  1//g" | sed "s/\ //g"]

Не понятно, почему значение h1 сбрасывается - unset не было...

vic5710

#3
попробуйте вставить контрольные точки вывода значения переменной там где ее применяете
типа set h1 -> echo 'h1 :'$h1
вообще - "все есть файл" - постулат UNIX
сохранить переменные в файл и читать из файла - там точно не потеряется
в tcl не силен, а в bash примерно так:

TMP=$(mktemp)
echo 'h1:'$h1 >> $TMP #запись
grep 'h1:' $TMP | cut -d':' -f2 #чтение
заодно будет контроль переменной, у интерпретатора память короткая

Евгений

Благодарю за совет! Ребята с debian-russian выявили ошибку - код вышел за пределы кнопки и от этого проблемы Попробую всё причесать и проверить.

vic5710

#5
Цитата: Евгений от 24 января 2015, 09:41:12
Благодарю за совет! Ребята с debian-russian выявили ошибку - код вышел за пределы кнопки и от этого проблемы Попробую всё причесать и проверить.
применяйте процедуры.
было такое правило еще в DOS -  если функция не влазит в 25 строк, то ее и читать никто не будет


Сообщение объединено: 25 января 2015, 12:29:55

Цитата: Евгений от 20 января 2015, 18:14:51Случилась у меня непонятная проблема. Работает скрипт, шаг за шагом отрабатывает переменную за переменной. Переменные рассчитываются последовательно, код для расчёта один и тот же, только название переменной меняется. и вот на 5 или 6 переменной пишет мне ошибку
вот и сделайте функцию от этой переменной