Ошибка стека

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

Ошибка стека

Postby victoryus84 » Thu, 26 May 2016, 13:00

Добрый день подскажите пожалуйста после выхода из цикла вываливается Ошибка Стека вот в этой задачке, но задачка отрабатывает чётко:

Code: Select all
#( HC_Arena
WatchHotKey: "@a"
SingleInstance
WINAPI: GetPixel gdi32.dll
: GET-PIXEL  ( x y -- RGB )
  SWAP GetDesktopWindow DUP >R GetWindowDC DUP >R GetPixel R> R> ReleaseDC DROP ;
Action:
100 0 DO
MOUSE-MOVE: 500 770
MOUSE-LBCLK
500 PAUSE

752 390 GET-PIXEL
N>H S>ZALLOC ASCIIZ> 
S" FCFCFC" COMPARE 0=

910 360 GET-PIXEL
N>H S>ZALLOC ASCIIZ> 
S" F6F8FA" COMPARE 0=
AND

931 370 GET-PIXEL
N>H S>ZALLOC ASCIIZ> 
S" F4F6F8" COMPARE 0=

956 379 GET-PIXEL
N>H S>ZALLOC ASCIIZ> 
S" EFF1F4" COMPARE 0=
AND
IF LEAVE
ELSE
THEN
LOOP
)#
victoryus84
 
Posts: 4
Joined: Thu, 19 May 2016, 11:58

Re: Ощибка стека

Postby VoidVolker » Thu, 26 May 2016, 13:11

Потому что на стеке действительно остается мусор - один лишний флаг:
Code: Select all
100 0 DO
    MOUSE-MOVE: 500 770
    MOUSE-LBCLK
    500 PAUSE

    752 390 GET-PIXEL
    N>H S>ZALLOC ASCIIZ>
    S" FCFCFC" COMPARE 0=   \ ?

    910 360 GET-PIXEL
    N>H S>ZALLOC ASCIIZ> 
    S" F6F8FA" COMPARE 0=   \ ? ?
    AND                     \ ?

    931 370 GET-PIXEL
    N>H S>ZALLOC ASCIIZ> 
    S" F4F6F8" COMPARE 0=   \ ? ?

    956 379 GET-PIXEL
    N>H S>ZALLOC ASCIIZ> 
    S" EFF1F4" COMPARE 0=   \ ? ? ?
    AND                     \ ? ?
    IF                      \ ?
        LEAVE               \ ?
    THEN                    \ ?
LOOP                        \ ?

А если выкинуть мусор, бессмысленные операции и добавить обработку лишнего флага, то получится так:
Code: Select all
100 0 DO
    MOUSE-MOVE: 500 770
    MOUSE-LBCLK
    500 PAUSE

    752 390 GET-PIXEL
    0xFCFCFC =

    910 360 GET-PIXEL
    0xF6F8FA =              \ ? ?
    AND                     \ ?

    931 370 GET-PIXEL
    0xF4F6F8 =              \ ? ?

    956 379 GET-PIXEL
    0xEFF1F4 =              \ ? ? ?
    AND                     \ ? ?
    AND                     \ ?
    IF
        LEAVE
    THEN
LOOP
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Ошибка стека

Postby victoryus84 » Thu, 26 May 2016, 13:19

Спасибо , понял, но есть встречный вопрос, вот вы перед IF поставили два раза AND , а можно вообще убрать , и оставить только один раз, перед IF вот так :
Code: Select all
100 0 DO
    MOUSE-MOVE: 500 770
    MOUSE-LBCLK
    500 PAUSE

    752 390 GET-PIXEL
    0xFCFCFC =

    910 360 GET-PIXEL
    0xF6F8FA =              \ ? ?
    \ AND - Убрать                     \ ?

    931 370 GET-PIXEL
    0xF4F6F8 =              \ ? ?

    956 379 GET-PIXEL
    0xEFF1F4 =              \ ? ? ?
    \ AND - Убрать                    \ ? ?
    AND                     \ ?
    IF
        LEAVE
    THEN
LOOP
victoryus84
 
Posts: 4
Joined: Thu, 19 May 2016, 11:58

Re: Ошибка стека

Postby victoryus84 » Thu, 26 May 2016, 13:33

спрашиваю, потому что немного не понимаю как работает AND. =(
Вот в моем примере у меня 4 проверки, я хочу выходить из цикла только если все будут Истина. В коде с поправками получается что мы проверяем первые 2 проверки потом остальные 2 и только потом результат 1 и 2 , ну наверное так правильно. Спасибо огромное за помощь !!!
victoryus84
 
Posts: 4
Joined: Thu, 19 May 2016, 11:58

Re: Ошибка стека

Postby VoidVolker » Thu, 26 May 2016, 14:34

AND - берет два числа со стека и делает для побитовую операцию AND и оставляет на вершине стека результат. Порядок проверок значения не имеет - результат будет неизменный.
Вот так будет чуть более читабельно:
Code: Select all
100 0 DO
    MOUSE-MOVE: 500 770
    MOUSE-LBCLK
    500 PAUSE

    752 390 GET-PIXEL
    0xFCFCFC =              \ ?

    910 360 GET-PIXEL
    0xF6F8FA =              \ ? ?
    AND                     \ ?

    931 370 GET-PIXEL
    0xF4F6F8 =              \ ? ?
    AND                     \ ?

    956 379 GET-PIXEL
    0xEFF1F4 =              \ ? ?
    AND                     \ ?

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

Re: Ошибка стека

Postby victoryus84 » Thu, 26 May 2016, 16:52

Спасибо огромное , вот теперь всё понятно.
victoryus84
 
Posts: 4
Joined: Thu, 19 May 2016, 11:58


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 1 guest