Объявление переменной USER или VARIABLE

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

Объявление переменной USER или VARIABLE

Postby oleg2001 » Thu, 24 Jul 2014, 11:48

Крон (nncron193b3) запущен как приложение под Win8. В ниже приведенной задаче переменная my_sign_z после my_sign_z OFF
принимает значение 0. А в момент проверки my_sign_z @ NOT её значение: 809578616, а не 0 или -1, как должно быть. Если я меняю объявление этой переменной с USER на VARIABLE тогда работает правильно. С чем это связано? В других задачах крона эта переменная не используется.
Code: Select all
#( Проверка
Time: 5-30/4 20 * * * *
LoadProfile
SingleInstance
USER fb_z
USER-CREATE bline_z 256 ALLOT
USER-CREATE bname_z 120 ALLOT
USER my_sign_z
USER is_found
: task-body
my_sign_z OFF
\ загружаем файл или выходим
S" o:\NM\D%DD%%MM%%YY%.STA" EVAL-SUBST R/O OPEN-FILE-SHARED IF DROP EXIT THEN fb_z !
\ считываем содержимое файла построчно
BEGIN bline_z 250 fb_z @ READ-LINE THROW WHILE
 bline_z SWAP
 <TIB
 \ в каждой строке считываем первые 120 символов
 1 WORD COUNT 120 MIN bname_z PLACE
    RE-MATCH: "%bname_z COUNT%" "/(.{68})(.+)\ZZ/"
   IF
    my_sign_z ON
   THEN
 TIB>
REPEAT
\ конец цикла считывания файла
DROP
fb_z @ CLOSE-FILE DROP

my_sign_z @ NOT
IF
  7 1 DO
  10 0 DO 100 I 100 * BEEP LOOP
  LOOP
THEN
;
Action:
 \ выполняем новое слово, одновременно отлавливая ошибки
['] task-body CATCH ?DUP
IF
 S" Ошибка в задаче %CUR-TASK-NAME%: %0 esPICK%" CRON-LOG
THEN
)#
oleg2001
 
Posts: 18
Joined: Thu, 19 Jun 2014, 12:17

Re: Объявление переменной USER или VARIABLE

Postby VoidVolker » Thu, 24 Jul 2014, 13:03

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

Re: Объявление переменной USER или VARIABLE

Postby oleg2001 » Fri, 25 Jul 2014, 10:56

Вопрос в следующем: почему когда я использую объявление переменной при помощи USER, значение переменной искажается (без моего участия)?
oleg2001
 
Posts: 18
Joined: Thu, 19 Jun 2014, 12:17

Re: Объявление переменной USER или VARIABLE

Postby elos » Sat, 26 Jul 2014, 16:47

А в момент проверки my_sign_z @ NOT её значение: 809578616, а не 0 или -1, как должно быть.

Не пытаясь понять код, смутно чувствую, что затык в понимании соотношения некоего числа к TRUE/FALSE
Code: Select all
TRUE .
-1  Ok
FALSE .
0  Ok
 Ok
FALSE NOT .
-1  Ok
TRUE NOT .
0  Ok
809578616 NOT .
0  Ok

Считается, что всё, что не ноль - это TRUE

В одном контексте (когда мы в переменной храним именно логическое значение TRUE=-1, FALSE=0 ) - пойдёт my_sign_z @ NOT
В другом контексте (когда в переменной хранится некое число, которое будут использовать как некое логическое значение) - my_sign_z @ 0= NOT
Code: Select all
809578616 0= .
0  Ok
809578616 0= NOT .
-1  Ok
А изменение типа с USER на VARIABLE - тут надо на реализацию смотреть, как это может влиять на правильность работы...

Если у нас SingleInstance, то зачем использовать USER-переменные? Или я неправильно понимаю смысл объявления USER?
которые будут уникальными для каждого экземпляра задачи (сколько экземпляров задачи работает, столько и переменных).
elos
 
Posts: 667
Joined: Tue, 25 Apr 2006, 11:15

Re: Объявление переменной USER или VARIABLE

Postby VoidVolker » Sat, 26 Jul 2014, 18:39

elos wrote:Если у нас SingleInstance, то зачем использовать USER-переменные? Или я неправильно понимаю смысл объявления USER?

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

Re: Объявление переменной USER или VARIABLE

Postby oleg2001 » Mon, 28 Jul 2014, 09:41

USES использую т.к. у меня много похожих задач и для каждой из них изменять имя переменной неудобно.
elos! Вопрос (или непонимание) в следующем: в начале задачи переменной my_sign_z словом OFF присвоено значение 0. В самой задаче я не меняю значение этой переменной. Поэтому ожидаю, что my_sign_z @ NOT даст мне True и мой IF выполнится. Однако этого не происходит. Я проверяю значение переменной в этой точке программы и получаю: 809578616. Почему?
oleg2001
 
Posts: 18
Joined: Thu, 19 Jun 2014, 12:17

Re: Объявление переменной USER или VARIABLE

Postby VoidVolker » Mon, 28 Jul 2014, 14:57

oleg2001 wrote: Я проверяю значение переменной в этой точке программы и получаю: 809578616. Почему?

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

Re: Объявление переменной USER или VARIABLE

Postby oleg2001 » Mon, 28 Jul 2014, 15:21

Вот так:
Code: Select all
S" %my_sign_z @%" CRON-LOG


Если переменная my_sign_z описана как USER, то получаю:
Code: Select all
15:11:09 900 809578616

и после этого условие IF работает неправильно.

Если переменная описана как VARIABLE (НИЧЕГО больше не меняется), то получаем:
Code: Select all
15:14:13 3032 0

и условие IF правильно срабатывает.

ПОЧЕМУ? Как сделать правильно используя USER?
oleg2001
 
Posts: 18
Joined: Thu, 19 Jun 2014, 12:17

Re: Объявление переменной USER или VARIABLE

Postby VoidVolker » Mon, 28 Jul 2014, 21:57

Вообще, так вот делать неправильно:
Code: Select all
S" %my_sign_z @%" CRON-LOG

Правильнее вот так:
Code: Select all
my_sign_z @ N>S CRON-LOG
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Объявление переменной USER или VARIABLE

Postby oleg2001 » Tue, 29 Jul 2014, 12:07

Всё равно получаю:
12:06:29 3772 809644152
oleg2001
 
Posts: 18
Joined: Thu, 19 Jun 2014, 12:17

Re: Объявление переменной USER или VARIABLE

Postby VoidVolker » Tue, 29 Jul 2014, 22:39

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

Re: Объявление переменной USER или VARIABLE

Postby oleg2001 » Wed, 30 Jul 2014, 15:21

А как с мусором бороться?
oleg2001
 
Posts: 18
Joined: Thu, 19 Jun 2014, 12:17

Re: Объявление переменной USER или VARIABLE

Postby VoidVolker » Wed, 30 Jul 2014, 15:44

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

Re: Объявление переменной USER или VARIABLE

Postby oleg2001 » Thu, 31 Jul 2014, 09:12

Вот после этой строки:
bline_z 250 fb_z @ READ-LINE THROW WHILE
переменная my_sign_z принимает значение 811085944
oleg2001
 
Posts: 18
Joined: Thu, 19 Jun 2014, 12:17

Re: Объявление переменной USER или VARIABLE

Postby VoidVolker » Thu, 31 Jul 2014, 13:17

Смотрим исходник:
Code: Select all
USER-CREATE bline_z 256 ALLOT
USER-CREATE bname_z 120 ALLOT
USER my_sign_z

И приходим к выводу, что происходит обыкновенное переполнение буфера, куда записывается строка. Ибо для bline_z и bname_z память на самом деле не выделена - т.к. это блоки памяти в в юзер-области, а выделение идет глобальное. Для выделения памяти в юзер-области следует использовать слово USER-ALLOT.
Вот так будет правильнее:
Code: Select all
USER-CREATE bline_z 256 USER-ALLOT
USER-CREATE bname_z 120 USER-ALLOT
USER my_sign_z


Для построчной обработки файлов давно есть удобный плагин: read-by-line.spf
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Google [Bot] and 6 guests