Вопрос IF THEN

Обсуждение программ nnCron и nnCron LITE

Вопрос IF THEN

Postby victoryus » Thu, 19 Jun 2014, 22:00

Доброе время суток , вопрос немного не про nncron но все же, про Форт. Пожалуйста помогите понять как работает IF THEN а именно проверка 2 .. n условий. В книжке Л. Броуди Начальный курс программирования на языке Форт не смог найти , только понятия AND но так и не докукал как оно работает.

Вот на какой задаче проверял

Code: Select all
#( ASTRALS
WatchHotKey: "@f"
SingleInstance
WINAPI: GetPixel gdi32.dll
: GET-PIXEL  ( x y -- RGB )
SWAP GetDesktopWindow DUP >R GetWindowDC DUP >R GetPixel R> R> ReleaseDC DROP ;

VARIABLE first_astro
VARIABLE second_astro
VARIABLE third_astro
VARIABLE fourth_astro
VARIABLE fifth_astro
VARIABLE full_astro_box
 
Action:

ShowNormal   NormalPriority
\ BlockTheInput
WIN-EXIST: "ShockwaveFlashFullScreen"

IF

0x8DA6A8 first_astro !
0x6C6C6B second_astro !
0x286C69 third_astro !
0x6C4366 fourth_astro !
0x686C0C fifth_astro !
0x13050C full_astro_box !

BEGIN \ Цикл будет выполнятся  пока цвет 5* не будет 0x686C0C

100 PAUSE 1118 404 GET-PIXEL
full_astro_box @ <>
IF
MOUSE-MOVE:  1055 540  100 PAUSE MOUSE-LBCLK \  Клик OneClickSell.
MOUSE-MOVE:  790 540  100 PAUSE MOUSE-LBCLK \  Клик OneClickSynthet.
MOUSE-MOVE:  570 483  100 PAUSE MOUSE-LBCLK \  Клик Confirm.
THEN

BEGIN \ Цикл будет выполнятся  пока цвет 4* будет 0x6C4366

100 PAUSE 1118 404 GET-PIXEL
full_astro_box @ <>
IF
MOUSE-MOVE:  1055 540  100 PAUSE MOUSE-LBCLK \  Клик OneClickSell.
MOUSE-MOVE:  790 540  100 PAUSE MOUSE-LBCLK \  Клик OneClickSynthet.
MOUSE-MOVE:  570 483  100 PAUSE MOUSE-LBCLK \  Клик Confirm.
THEN

BEGIN \ Цикл будет выполнятся  пока цвет 3* будет 0x286C69

100 PAUSE 1118 404 GET-PIXEL
full_astro_box @ <>
IF
MOUSE-MOVE:  1055 540  100 PAUSE MOUSE-LBCLK \  Клик OneClickSell.
MOUSE-MOVE:  790 540  100 PAUSE MOUSE-LBCLK \  Клик OneClickSynthet.
MOUSE-MOVE:  570 483  100 PAUSE MOUSE-LBCLK \  Клик Confirm.
THEN

BEGIN \ Цикл будет выполнятся  пока цвет 2* будет 0x6C6C6B

100 PAUSE 1118 404 GET-PIXEL
full_astro_box @ <>
IF
MOUSE-MOVE:  1055 540  100 PAUSE MOUSE-LBCLK \  Клик OneClickSell.
MOUSE-MOVE:  790 540  100 PAUSE MOUSE-LBCLK \  Клик OneClickSynthet.
MOUSE-MOVE:  570 483  100 PAUSE MOUSE-LBCLK \  Клик Confirm.
THEN

BEGIN \ Цикл будет выполнятся  пока цвет 1* будет 0x8DA6A8

100 PAUSE 1118 404 GET-PIXEL
full_astro_box @ <>
IF
MOUSE-MOVE:  1055 540  100 PAUSE MOUSE-LBCLK \  Клик OneClickSell.
MOUSE-MOVE:  790 540  100 PAUSE MOUSE-LBCLK \  Клик OneClickSynthet.
MOUSE-MOVE:  570 483  100 PAUSE MOUSE-LBCLK \  Клик Confirm.
THEN

   VK_CONTROL KEY-PRESSED? IF LEAVE THEN
   MOUSE-MOVE:  380 630 MOUSE-LBCLK \  Клик 1*.
   
   100 PAUSE 380 630 GET-PIXEL \ Получить цвет 1*
   
first_astro @ =
UNTIL
   
   VK_CONTROL KEY-PRESSED? IF LEAVE THEN
   MOUSE-MOVE:  525 630 MOUSE-LBCLK \  Клик 2*.
   
   100 PAUSE 380 630 GET-PIXEL \ Получить цвет 1*
   100 PAUSE 525 630 GET-PIXEL \ Получить цвет 2*
   
first_astro @ = AND second_astro @ <>
UNTIL
   
   VK_CONTROL KEY-PRESSED? IF LEAVE THEN
   MOUSE-MOVE:  670 630 MOUSE-LBCLK \  Клик 3*.
   
   100 PAUSE 380 630 GET-PIXEL \ Получить цвет 1*
   100 PAUSE 525 630 GET-PIXEL \ Получить цвет 2*
   100 PAUSE 670 630 GET-PIXEL \ Получить цвет 3*

first_astro @ = AND second_astro @ <> AND third_astro @ <>
UNTIL
   
   VK_CONTROL KEY-PRESSED? IF LEAVE THEN
   MOUSE-MOVE:  825 630 MOUSE-LBCLK \  Клик 4*.
   
   100 PAUSE 380 630 GET-PIXEL \ Получить цвет 1*
   100 PAUSE 525 630 GET-PIXEL \ Получить цвет 2*
   100 PAUSE 670 630 GET-PIXEL \ Получить цвет 3*
   100 PAUSE 825 630 GET-PIXEL \ Получить цвет 4*

first_astro @ = AND second_astro @ <> AND third_astro @ <> AND fourth_astro @ <>
UNTIL
   
   VK_CONTROL KEY-PRESSED? IF LEAVE THEN
   MOUSE-MOVE:  970 630 MOUSE-LBCLK \  Клик 5*.

   100 PAUSE 380 630 GET-PIXEL \ Получить цвет 1*
   100 PAUSE 525 630 GET-PIXEL \ Получить цвет 2*
   100 PAUSE 670 630 GET-PIXEL \ Получить цвет 3*
   100 PAUSE 825 630 GET-PIXEL \ Получить цвет 4*
   100 PAUSE 970 630 GET-PIXEL \ Получить цвет 5*

first_astro @ = AND second_astro @ <> AND third_astro @ <> AND fourth_astro @ <> AND  fifth_astro @ <>
UNTIL

THEN
)#


Заранее благодарен.
victoryus
 
Posts: 30
Joined: Tue, 26 Mar 2013, 11:08
Location: Республика Молдова

Re: Вопрос IF THEN

Postby Morituruz » Thu, 19 Jun 2014, 22:39

IF проверяет число наверху стека на соответствие нулю. Стек — это полочка, на которую можно положить цифры из переменных.
Например слово TRUE кладёт на стек -1, а слово FALSE кладёт 0.
Слово AND берёт два верхних числа на стеке, и проверят оба ли они не равны 0, то есть если положить на стек TRUE и FALSE, а потом выполнить слово AND, то оно возьмёт их со стека и положит в него FALSE.
Соответственно, если у вас на стеке несколько условий, например TRUE TRUE FALSE FALSE, то вам нужно 3 раза выполнить слово AND, если вам нужно проверить 4 обязательных условия.
Например:
Code: Select all
#( sad_but_true
NoActive
Action:
5 5 = \ на стек попадает TRUE
S" string" S" string" COMPARE 0= \  сравнение строк, на стек попадает TRUE
8 1 + \ на стек попадает 9
\ ИТОГО на стеке лежат 3 числа: -1 -1 9
AND \ первый AND берёт 9 и -1, кладёт TRUE (-1), на стеке теперь -1 и -1
AND \ второй AND их и кладёт -1
IF
  MSG: "True"
ELSE
 MSG: "False"
THEN
)#
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Вопрос IF THEN

Postby victoryus » Fri, 20 Jun 2014, 00:24

Morituruz wrote:AND \ первый AND берёт 9 и -1, кладёт TRUE (-1)


Вот тут непонятно и все, хоть :Hangman: почему при сравнении 2 разных типов число и boolean кладёт TRUE (-1)

Мдааа, трудно после 1С на Форт переключатся :(
victoryus
 
Posts: 30
Joined: Tue, 26 Mar 2013, 11:08
Location: Республика Молдова

Re: Вопрос IF THEN

Postby Morituruz » Fri, 20 Jun 2014, 07:45

victoryus wrote:
Morituruz wrote:AND \ первый AND берёт 9 и -1, кладёт TRUE (-1)


Вот тут непонятно и все, хоть :Hangman: почему при сравнении 2 разных типов число и boolean кладёт TRUE (-1)

Мдааа, трудно после 1С на Форт переключатся :(

Потому что в форте типизации как бы и нет, и типов тоже почти нет (старшие товарищи возможно подскажут, как это безтиповое безобразие называется :)), поэтому и 9 число, и -1 тоже число. 9 не 0 и -1 тоже не 0, значит AND положит -1.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Вопрос IF THEN

Postby AlikasS » Fri, 20 Jun 2014, 08:46

Слово AND выполняет логическую операцию И
( x1 x2 --> x3 )
Параметры
x1 первое число
x2 второе число
Возвращемые значения
x3 результат выполненной логической операции И

в nncron имеется изначально только один тип значений - 32-разрядные двоичные числа, которые рассматриваются в зависимости от ситуации как целые числа со знаком или как адреса и т. д. Точно так же подходят и к проблеме представления логических значений ИСТИНА и ЛОЖЬ: число 0, в двоичном представлении которого все разряды нули, представляет значение ЛОЖЬ, а любое другое 32-разрядное значение понимается как ИСТИНА. Вместе с тем стандартные слова, которые должны возвращать в качетве результата логическое значение, из всех возможных представлений значения ИСТИНА используют только одно: число -1

плагинами можно ввести работу с вещественными числами.
и есть слова для работы с числами двойной длины, т. е. число, представление которого занимает 64 бита вместо 32.
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Вопрос IF THEN

Postby victoryus » Fri, 20 Jun 2014, 18:12

Morituruz wrote:
victoryus wrote:
Morituruz wrote:AND \ первый AND берёт 9 и -1, кладёт TRUE (-1)


Вот тут непонятно и все, хоть :Hangman: почему при сравнении 2 разных типов число и boolean кладёт TRUE (-1)

Мдааа, трудно после 1С на Форт переключатся :(

Потому что в форте типизации как бы и нет, и типов тоже почти нет (старшие товарищи возможно подскажут, как это безтиповое безобразие называется :)), поэтому и 9 число, и -1 тоже число. 9 не 0 и -1 тоже не 0, значит AND положит -1.


AlikasS wrote:
Слово AND выполняет логическую операцию И
( x1 x2 --> x3 )
Параметры
x1 первое число
x2 второе число
Возвращемые значения
x3 результат выполненной логической операции И

в nncron имеется изначально только один тип значений - 32-разрядные двоичные числа, которые рассматриваются в зависимости от ситуации как целые числа со знаком или как адреса и т. д. Точно так же подходят и к проблеме представления логических значений ИСТИНА и ЛОЖЬ: число 0, в двоичном представлении которого все разряды нули, представляет значение ЛОЖЬ, а любое другое 32-разрядное значение понимается как ИСТИНА. Вместе с тем стандартные слова, которые должны возвращать в качетве результата логическое значение, из всех возможных представлений значения ИСТИНА используют только одно: число -1

плагинами можно ввести работу с вещественными числами.
и есть слова для работы с числами двойной длины, т. е. число, представление которого занимает 64 бита вместо 32.


Спасибо огромное , теперь более менее все понятно.
victoryus
 
Posts: 30
Joined: Tue, 26 Mar 2013, 11:08
Location: Республика Молдова

Re: Вопрос IF THEN

Postby VoidVolker » Fri, 20 Jun 2014, 21:00

victoryus wrote:Вот тут непонятно и все, хоть :Hangman: почему при сравнении 2 разных типов число и boolean кладёт TRUE (-1)

В форте типизацией значений на стеке занимается сам программист во время написания программы: для программы на стеке только один вид значений - числа. А как их интерпретировать - решает сам программист. Он может прочитать из файла слово, положить первый символ этого слова на стек и сказать, что это числовое значение и обозначает оно номер ячейки в массиве, помножить его на размер ячейки массива (любое число), прибавить к нему адрес и извлечь нужное значение из массива.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Вопрос IF THEN

Postby victoryus » Sat, 21 Jun 2014, 10:59

VoidVolker wrote:обозначает оно номер ячейки в массиве, помножить его на размер ячейки массива (любое число), прибавить к нему адрес и извлечь нужное значение из массива.


Скажите пожалуйста а стек резиновый ?
Сколько значений может в себе иметь и как его отчистить при необходимости ?
victoryus
 
Posts: 30
Joined: Tue, 26 Mar 2013, 11:08
Location: Республика Молдова

Re: Вопрос IF THEN

Postby VoidVolker » Sun, 22 Jun 2014, 08:39

Нет, стек не резиновый - в ннкроне он размером 1000 ячеек. Для удаления с вершины стека числа или двух служат слова DROP и 2DROP. Еще можно получить текущий адрес стека словом SP@ затем можно "намусорить" на стеке и записать обратно адрес стека словом SP! и получить исходную глубину стека. Глубину стека можно узнать словом DEPTH. Т.о., если нужно полностью очистить стек, то можно сделать вот так:
Code: Select all
: CLEAR-STACK   \ ( x*n -- )
    DEPTH IF DEPTH 0 DO DROP LOOP THEN
;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Вопрос IF THEN

Postby victoryus » Mon, 23 Jun 2014, 11:37

SP@ и SP!

Это переменные ?
victoryus
 
Posts: 30
Joined: Tue, 26 Mar 2013, 11:08
Location: Республика Молдова

Re: Вопрос IF THEN

Postby VoidVolker » Mon, 23 Jun 2014, 22:22

Нет, это слова.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Вопрос IF THEN

Postby elos » Mon, 23 Jun 2014, 22:42

victoryus wrote:SP@ и SP!

Это переменные ?


..\SPF\src\spf_forthproc.f
Code: Select all
\ ================================================================
\ Указатели стеков

CODE SP! ( A -> )
     LEA EBP,  4 [EAX]
     MOV EAX, -4 [EBP]
     RET
END-CODE

CODE RP! ( A -> )
     POP EBX
     MOV ESP, EAX
     MOV EAX, [EBP]
     LEA EBP, 4 [EBP]
     JMP EBX
END-CODE

CODE SP@ ( -> A )
     LEA EBP, -4 [EBP]
     MOV [EBP], EAX
     MOV EAX, EBP
     RET
END-CODE

CODE RP@ ( -- RP )
     LEA EBP, -4 [EBP]
     MOV [EBP], EAX
     LEA EAX, 4 [ESP]
     RET
END-CODE

\ ================================================================

Форт-литература. Читаем "Язык Форт и его реализации" и "ЯЗЫК ПРОГРАММИРОВАНИЯ ФОРТ" М. КЕЛЛИ Н.СПАЙС. Учитываем, что книги по нынешним временам древние (в смысле стандарта forth-79) и SPF малость отличается/ Но на это есть чтение папки с исходниками и поиск в ней (..\SPF\src\). Да! Ещё консоль SPF с тестированием ручками - очень способствует при чтении примеров...

Не забываем книги Броуди!

Мне, например, на все мои вопросы (когда я вроде бы уже отчаялся искать) отвечали "RTFM". Очень способствует обучению и тут же почему-то всё находится...
elos
 
Posts: 665
Joined: Tue, 25 Apr 2006, 11:15

Re: Вопрос IF THEN

Postby victoryus » Mon, 23 Jun 2014, 23:52

Спасибо всем иду читать книжки !!! :idea:
victoryus
 
Posts: 30
Joined: Tue, 26 Mar 2013, 11:08
Location: Республика Молдова


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 3 guests