Обсуждение программ nnCron и nnCron LITE
by 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: Республика Молдова
by 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 )#
-

Morituruz
-
- Posts: 729
- Joined: Sun, 14 Oct 2007, 01:51
by victoryus » Fri, 20 Jun 2014, 00:24
Morituruz wrote:AND \ первый AND берёт 9 и -1, кладёт TRUE (-1)
Вот тут непонятно и все, хоть  почему при сравнении 2 разных типов число и boolean кладёт TRUE (-1) Мдааа, трудно после 1С на Форт переключатся 
-
victoryus
-
- Posts: 30
- Joined: Tue, 26 Mar 2013, 11:08
- Location: Республика Молдова
by Morituruz » Fri, 20 Jun 2014, 07:45
victoryus wrote:Morituruz wrote:AND \ первый AND берёт 9 и -1, кладёт TRUE (-1)
Вот тут непонятно и все, хоть  почему при сравнении 2 разных типов число и boolean кладёт TRUE (-1) Мдааа, трудно после 1С на Форт переключатся 
Потому что в форте типизации как бы и нет, и типов тоже почти нет (старшие товарищи возможно подскажут, как это безтиповое безобразие называется  ), поэтому и 9 число, и -1 тоже число. 9 не 0 и -1 тоже не 0, значит AND положит -1.
-

Morituruz
-
- Posts: 729
- Joined: Sun, 14 Oct 2007, 01:51
by AlikasS » Fri, 20 Jun 2014, 08:46
Слово AND выполняет логическую операцию И ( x1 x2 --> x3 ) Параметры x1 первое число x2 второе число Возвращемые значения x3 результат выполненной логической операции И
в nncron имеется изначально только один тип значений - 32-разрядные двоичные числа, которые рассматриваются в зависимости от ситуации как целые числа со знаком или как адреса и т. д. Точно так же подходят и к проблеме представления логических значений ИСТИНА и ЛОЖЬ: число 0, в двоичном представлении которого все разряды нули, представляет значение ЛОЖЬ, а любое другое 32-разрядное значение понимается как ИСТИНА. Вместе с тем стандартные слова, которые должны возвращать в качетве результата логическое значение, из всех возможных представлений значения ИСТИНА используют только одно: число -1 плагинами можно ввести работу с вещественными числами. и есть слова для работы с числами двойной длины, т. е. число, представление которого занимает 64 бита вместо 32.
-

AlikasS
-
- Posts: 1453
- Joined: Wed, 28 Jun 2006, 05:39
- Location: Khabarovsk
by victoryus » Fri, 20 Jun 2014, 18:12
Morituruz wrote:victoryus wrote:Morituruz wrote:AND \ первый AND берёт 9 и -1, кладёт TRUE (-1)
Вот тут непонятно и все, хоть  почему при сравнении 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: Республика Молдова
by VoidVolker » Fri, 20 Jun 2014, 21:00
victoryus wrote:Вот тут непонятно и все, хоть  почему при сравнении 2 разных типов число и boolean кладёт TRUE (-1)
В форте типизацией значений на стеке занимается сам программист во время написания программы: для программы на стеке только один вид значений - числа. А как их интерпретировать - решает сам программист. Он может прочитать из файла слово, положить первый символ этого слова на стек и сказать, что это числовое значение и обозначает оно номер ячейки в массиве, помножить его на размер ячейки массива (любое число), прибавить к нему адрес и извлечь нужное значение из массива.
-

VoidVolker
- Site Admin
-
- Posts: 2928
- Joined: Tue, 25 Apr 2006, 17:56
by victoryus » Sat, 21 Jun 2014, 10:59
VoidVolker wrote:обозначает оно номер ячейки в массиве, помножить его на размер ячейки массива (любое число), прибавить к нему адрес и извлечь нужное значение из массива.
Скажите пожалуйста а стек резиновый ? Сколько значений может в себе иметь и как его отчистить при необходимости ?
-
victoryus
-
- Posts: 30
- Joined: Tue, 26 Mar 2013, 11:08
- Location: Республика Молдова
by 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 ;
-

VoidVolker
- Site Admin
-
- Posts: 2928
- Joined: Tue, 25 Apr 2006, 17:56
by victoryus » Mon, 23 Jun 2014, 11:37
SP@ и SP!
Это переменные ?
-
victoryus
-
- Posts: 30
- Joined: Tue, 26 Mar 2013, 11:08
- Location: Республика Молдова
by VoidVolker » Mon, 23 Jun 2014, 22:22
Нет, это слова.
-

VoidVolker
- Site Admin
-
- Posts: 2928
- Joined: Tue, 25 Apr 2006, 17:56
by 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: 673
- Joined: Tue, 25 Apr 2006, 11:15
-
by victoryus » Mon, 23 Jun 2014, 23:52
Спасибо всем иду читать книжки !!! 
-
victoryus
-
- Posts: 30
- Joined: Tue, 26 Mar 2013, 11:08
- Location: Республика Молдова
Return to nnCron forum (Russian)
Who is online
Users browsing this forum: Google [Bot] and 4 guests
|
|