Данные в формате FILETIME и файловые переменные

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

Данные в формате FILETIME и файловые переменные

Postby Raistlin » Mon, 22 Nov 2004, 17:42

Задача:
Code: Select all
#( Test_FileTime
   NoActive
   fVAR LastWeekUpdateTime
   Action:
      FILE-WTIME: "C:\Program Files\DrWeb\drw43215.vdb" <# #S #> TO LastWeekUpdateTime
      FT-CUR S" C:\Program Files\DrWeb\drw43215.vdb" FILE-WTIME FT- FT>DAY . CR
      FT-CUR LastWeekUpdateTime S>NUM S>D FT- FT>DAY . CR
)#

При выполнении получаю в консоли:
Code: Select all
0
147518

При этом timestamp подопытного файла 21.11.2004/19:01:12, а текущее время 22.11.2004/17:37:00.
Что же происходит с числами двойной длины при их преобразовании в числа одиночной длины? И как можно корректно сохранить время в формате FILETIME в файловой переменной?
Windows XP SP3 Corp. + MUI, nnCron 1.93.1125.14, nnBackup 3.02b3 Build 147

Magically yours
Raistlin
User avatar
Raistlin
 
Posts: 159
Joined: Wed, 03 Nov 2004, 12:42

Postby Tez » Tue, 23 Nov 2004, 00:34

S>NUM преобразует в 32-ух разрядное число. 2 147 483 648 максимальное значение 32-ух разрядного числа.
Так что, как через строку хранить такое число я не знаю.

Могу сказать как я храню большие числа: через реестр. Идея by Valery Kondakoff.
Code: Select all
\ d - двойное число
\ a u - путь
\ Если путь бла-бла-бла, то слово в конце добавит 1 и 2 (бла-бла-бла1), т.е. сохраняет оно по двум путям с отличием в последнем символе (1 или 2), соответтвенно оба пути должны быть.
: 2VAR-TO-REG-DWORD { d a u -- }
  a u S" 1" S+ d1 REG-DWORD
  a u S" 2" S+ d2 REG-DWORD
;

\ a u - путь (см. примечание у предыдущего слова)
\ d - двойное число
\ Если путь бла-бла-бла, то слово в конце добавит 1 и 2 (бла-бла-бла1), т.е. сохраняет оно по двум путям с отличием в последнем символе (1 или 2), соответтвенно оба пути должны быть.
USER-CREATE (2VAR-FROM-REG-DWORD) 2 CELLS USER-ALLOT
: 2VAR-FROM-REG-DWORD  { a u -- d }
  (2VAR-FROM-REG-DWORD)       a u S" 2" S+ GET-REG
  (2VAR-FROM-REG-DWORD) CELL+ a u S" 1" S+ GET-REG
  (2VAR-FROM-REG-DWORD) 2@
;
Tez
 
Posts: 205
Joined: Mon, 23 Aug 2004, 09:17
Location: Moscow

Postby Raistlin » Tue, 23 Nov 2004, 13:25

Tez wrote:S>NUM преобразует в 32-ух разрядное число. 2 147 483 648 максимальное значение 32-ух разрядного числа. Могу сказать как я храню большие числа: через реестр.

Гм. Из Справки: DWORD (двойное слово) - одиночное 32-битное значение, восемь шестнадцатеричных цифр. Получается, снова упираемся в 32 разряда. Или я что-то не так понимаю? Плюс к тому: максимальное значение 32-разрядного числа, думаю, 2^32 - 1 = 4294967295.

Tez wrote:
Code: Select all
\ d - двойное число
\ a u - путь
\ Если путь бла-бла-бла, то слово в конце добавит 1 и 2 (бла-бла-бла1), т.е. сохраняет оно по двум путям с отличием в последнем символе (1 или 2), соответтвенно оба пути должны быть.
: 2VAR-TO-REG-DWORD { d a u -- }
  a u S" 1" S+ d1 REG-DWORD
  a u S" 2" S+ d2 REG-DWORD
;

Здесь уже не хватает знаний для понимания :(. Что значит "a u - путь"? Можно на примере — внесение записей в реестр и их считывание? И где можно почитать про USER-CREATE, CELLS, USER-ALLOT и прочие интересные операторы? :wink:
Ха! По-моему, нашёл простой до идиотичности способ хранения в файловых-таки переменных:
Code: Select all
#( Test_FileTime
   NoActive
   fVAR LastWeekUpdateTime1
   fVAR LastWeekUpdateTime2
   Action:
      CONSOLE
      FILE-WTIME: "C:\Program Files\DrWeb\drw43215.vdb"
      N>S TO LastWeekUpdateTime1
      N>S TO LastWeekUpdateTime2
      FT-CUR S" C:\Program Files\DrWeb\drw43215.vdb" FILE-WTIME FT- FT>DAY . CR
      FT-CUR LastWeekUpdateTime2 S>NUM LastWeekUpdateTime1 S>NUM FT- FT>DAY . CR
)#

Выдаёт два раза "1". Решено?
Windows XP SP3 Corp. + MUI, nnCron 1.93.1125.14, nnBackup 3.02b3 Build 147

Magically yours
Raistlin
User avatar
Raistlin
 
Posts: 159
Joined: Wed, 03 Nov 2004, 12:42

Postby Tez » Tue, 23 Nov 2004, 17:07

Гм. Из Справки: DWORD (двойное слово) - одиночное 32-битное значение, восемь шестнадцатеричных цифр. Получается, снова упираемся в 32 разряда. Или я что-то не так понимаю? Плюс к тому: максимальное значение 32-разрядного числа, думаю, 2^32 - 1 = 4294967295.

S>NUM преобразует и отрицательные числа. Т.к. знак нигде не хранится специально – используют само число для представления как положительных чисел так и отрицательных. Число делят пополам и одна половина числа – отрицательные числа, другая положительные. Можешь с шестнадцатеричным представлением поэкспериментировать в консоли – там тоже самое (HEX переключает в шестнадцатеричную системы, а DECIMAL в десятичную). Поподробнее см.: Лео Бpоуди "Hачальный куpс пpогpаммиpования на языке Фоpт” http://www.nncron.ru/download/sf.chm > Глава 7 ЧИСЛО ТИПОВ ЧИСЕЛ > Часть 1 ДЛЯ НАЧИНАЮЩИХ > ЧЕМ ОТЛИЧАЮТСЯ ЧИСЛА СО ЗНАКОМ И БЕЗ ЗНАКА.


Здесь уже не хватает знаний для понимания . Что значит "a u - путь"? Можно на примере — внесение записей в реестр и их считывание?

Code: Select all
\ записать
FT-CUR S" HKEY_LOCAL_MACHINE\SOFTWARE\Tez\nnCron\connection\last_session_time" 2VAR-TO-REG-DWORD

\ прочитать
S" HKEY_LOCAL_MACHINE\SOFTWARE\Tez\nnCron\connection\last_session_time" 2VAR-FROM-REG-DWORD D.
В реестре существует две переменные:
HKEY_LOCAL_MACHINE\SOFTWARE\Tez\nnCron\connection\last_session_time1
HKEY_LOCAL_MACHINE\SOFTWARE\Tez\nnCron\connection\last_session_time2

Из dpans94_ru.txt (где брал не помню, где искать – знаю: http://www.forth.org.ru)
Стековая нотация

Входные и выходные параметры стековых определений описаны, с использованием
следующей нотации:

( stack-id before -- after )

Где stack-id определяет, какой стек описывается, before представляет типы
данных параметров стека перед выполнением определения и after представляет их
после выполнения. Символы, используемые в before и after показаны в таблице
Я добавлю, что если stack-id нет – значит имеется в виду стек данных.
Еще, у Лео Бpоуди "Hачальный куpс пpогpаммиpования на языке Фоpт” > Глава 1. ОСНОВЫ ФОРТА > СТЕКОВАЯ НОТАЦИЯ.

Вот обозначения:
Code: Select all
 u    8-ми разрядное число (одинарное) или число без знака
n    16-ти разрядное число (одинарное)
d   32-ух разрядное число (двойное число)
с   значение символа в коде ASCII
а   адрес
?   логическое значение (флаг)

И из dpans94_ru.txt

    Символ             Тип данных                    Размер на стеке
    -------------------------------------------------------------------------
    flag               флаг                          1 ячейка
    true               флаг истина                   1 ячейка
    false              флаг ложь                     1 ячейка
    char               символ                        1 ячейка
    n                  число со знаком               1 ячейка
    +n                 не отрицательное число        1 ячейка
    u                  без знаковое число            1 ячейка
    n|u (1)            число                         1 ячейка
    x                  любая ячейка                  1 ячейка
    xt                 идентификатор исполнения      1 ячейка
    addr               адрес                         1 ячейка
    a-addr             выровненный адрес             1 ячейка
    c-addr             символьно-выровненный адрес   1 ячейка
    d                  число со знаком две-ячейки    2 ячейки
    +d                 не отрицат. число две-ячейки  2 ячейки
    ud                 беззнаковое число две-ячейки  2 ячейки
    d|ud (2)           число две-ячейки              2 ячейки
    xd                 любая пара ячеек              2 ячейки
    colon-sys          компиляция определения        определяемое реализацией
    do-sys             do-loop структуры             определяемое реализацией
    case-sys           CASE структуры                определяемое реализацией
    of-sys             OF структуры                  определяемое реализацией
    orig               источник потока-управления    определяемое реализацией
    dest               назначение потока-управления  определяемое реализацией
    loop-sys           loop-control параметры        определяемое реализацией
    nest-sys           вызовы определения            определяемое реализацией
    i*x, j*x, k*x (3)  любой тип данных              0 или более ячеек
    -------------------------------------------------------------------------

(1) Может быть число со знаком или без знака в зависимости от контекста.
(2) Может быть две-ячейки число со знаком или две-ячейки число без знака в
    зависимости от контекста.
(3) Может быть неопределенное число входов стека неопределенного типа. Для
    примеров использования, см. 6.1.1370 EXECUTE, 6.1.2050 QUIT.
Большую часть я тоже не понимаю :prayer:).


И где можно почитать про USER-CREATE, CELLS, USER-ALLOT и прочие интересные операторы?

У Броуди и в хелпе крона.


Выдаёт два раза "1". Решено?

Решено!
Tez
 
Posts: 205
Joined: Mon, 23 Aug 2004, 09:17
Location: Moscow

Re: Данные в формате FILETIME и файловые переменные

Postby Nicholas_Nemtsev » Wed, 24 Nov 2004, 09:30

Raistlin wrote:Задача:
Code: Select all
FILE-WTIME: "C:\Program Files\DrWeb\drw43215.vdb" <# #S #> TO LastWeekUpdateTime
FT-CUR S" C:\Program Files\DrWeb\drw43215.vdb"  FILE-WTIME FT- FT>DAY . CR
      FT-CUR LastWeekUpdateTime S>NUM S>D FT- FT>DAY . CR


Для преобразования чисел двойной длины в строку и братно в кроне есть слова DOUBLE>S и S>DOUBLE.
Кроме того, в кроне есть слова FT>DD.MM.YYYY/hh:mm:ss и SDD.MM.YYYY/hh:mm:ss>FT для того, чтобы редставлять FILETIME в удобочитаемом виде. Правда, с потерей точности.
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests

cron