Плагин lists.spf [15/08/2013 21:40]

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

Re: Плагин lists.spf [Обновление 25/09/2012 20:28]

Postby VoidVolker » Wed, 26 Sep 2012, 12:45

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

Re: Плагин lists.spf [Обновление 26/09/2012 13:41]

Postby SphinxST » Tue, 02 Jul 2013, 17:18

Спасибо.
Теперь для него подключать strings.spf вместо Autostrings.spf?
SphinxST
 
Posts: 18
Joined: Thu, 17 Nov 2011, 12:27

Re: Плагин lists.spf [Обновление 26/09/2012 13:41]

Postby SeMa » Tue, 02 Jul 2013, 17:41

SphinxST wrote:Спасибо.
Теперь для него подключать strings.spf вместо Autostrings.spf?

В описании плагина явно указано.
\ * Требуется подключенный плагин strings.spf для создания быстрых методов списка
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

Re: Плагин lists.spf [15/08/2013 21:40]

Postby VoidVolker » Thu, 15 Aug 2013, 21:41

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

Re: Плагин lists.spf [15/08/2013 21:40]

Postby mihast » Fri, 21 Aug 2015, 12:20

Помогите, наверное у меня где-то ошибочка, хотя мои тестовые примеры - работают, ставлю УдалитьЭлемент_Список в основную программу - вылетает ... :shock:

Список содержит Строку + Число:

Code: Select all
<%
  GLOBAL-LIST: СписокСтрок

  SCONSTANT TestList TestList.txt
  USER-VALUE StrBuf_2015

: ?St \ Для отладки
  TRASH( S"  Глубина стека = " S+ DEPTH N>S S+ 2DUP 1 TimeMsgBox
  CR TYPE CR .S CR )TRASH
;
: ПолучитьЭлемент_Список ( -- n a u )
  NODE@ LIST( NODE@ )LIST SWAP LIST( NODE@ )LIST
;
: УдалитьЭлемент_Список ( -- )
  NODE@ DUP LIST( NODE@ LIST-EXIT )LIST LIST-DEL LIST-DEL NDEL
;
: ДобавитьЭлемент_Список { n a u list \ -- }
  LIST DUP list LIST! LIST[ STRING-LIST DUP LIST[ a u ]LIST n ]LIST
  list ЗапускОкончаниеОбмена_81 =
  list ЗапускОкончаниеОбмена_82 = OR
  IF  \ ограничим размер буфера 250 элементами (минимум 2 часа)
    list LIST# 250 >
    IF
      list DUP LIST-- LIST( УдалитьЭлемент_Список LIST-EXIT )LIST
    THEN
  THEN
;
: ЗаполнитьСписокСтрок
  СписокСтрок LIST-FREE
  2368 " {20150820000007,C,{24237564ef170,8ee},75,69,2,6204,6,I,|q|q,0,{|qU|q},|q|q,1,7,6,75,69,2,6204,6,1,5,5,75,69,2,6204,6},"
  СписокСтрок ДобавитьЭлемент_Список
  2229 " {20150820000007,C,{24237564ef170,9e4},75,69,2,6204,3,I,|q|q,0,{|qU|q},|q|q,1,7,6,75,69,2,6204,6,1,5,5,75,69,2,6204,6},"
  СписокСтрок ДобавитьЭлемент_Список
  44411 " {20150820000007,U,{24237564ef170,992},75,69,2,6205,7,I,|q|q,59,{|qR|q,47:aaac50505450303011dc9d6e477613cd},|qФиР>С_С'С_ Р_Р_Р_Р_ (HX46) MB|q,1,5,5,75,69,2,6204,6,1,7,6,75,69,2,6204,6,1,5,5,75,69,2,6204,6},"
  СписокСтрок ДобавитьЭлемент_Список
  CR .S CR CR

  "" TestList FWRITE
  СписокСтрок(
    ПолучитьЭлемент_Список
    2DUP CRLF S+ TestList FAPPEND
    ROT DUP N>S CRLF S+ TestList FAPPEND -ROT
  )СписокСтрок
  CR .S CR CR

  СписокСтрок# 0
  DO
    СписокСтрок ДобавитьЭлемент_Список
  LOOP
  CR .S CR CR

  TestList EXIST?
  IF
    FALSE
    TestList READ-BY-LINE
      FOUND-LINE
      ROT
      IF
        S>NUM
        StrBuf_2015 SCOUNT
        СписокСтрок ДобавитьЭлемент_Список
        FALSE
      ELSE
        StrBuf_2015 SPLACE
        TRUE
      THEN
    ;READ-BY-LINE
    DROP
  THEN
;

: ВывестиСписок ( list -- )
  LIST(
    ПолучитьЭлемент_Список CR TYPE CR . CR
\    ПолучитьЭлемент_Список CR .S CR \ MSG: " 1 "
  )LIST
;
%>

#( ТестСписка
NoActive
SingleInstance

Action:
  4000 ALLOCATE THROW TO StrBuf_2015

  " START" ?St
  СписокСтрок LIST-FREE
  DEPTH >R

  ЗаполнитьСписокСтрок
\  PAUSE: 5000

  " ЗаполнитьСписокСтрок СписокСтрок# = " СписокСтрок# N>S S+ ?St CR
  СписокСтрок ВывестиСписок

  СписокСтрок--
  CR .S CR CR
  СписокСтрок(
    ПолучитьЭлемент_Список
    CR 2DUP TYPE CR ROT DUP . -ROT CR
  )СписокСтрок
  CR .S CR CR

  " ПолучитьЭлемент_Список СписокСтрок# = " СписокСтрок# N>S S+ ?St CR

  СписокСтрок# 0
  DO
    CR 2DUP TYPE CR ROT DUP . -ROT CR
    СписокСтрок ДобавитьЭлемент_Список
  LOOP
  CR .S CR CR

  СписокСтрок ВывестиСписок

  CR СписокСтрок# . CR

  CR ." --------------" CR

  " FALSE СписокСтрок# = " СписокСтрок# N>S S+ ?St

  FALSE
  СписокСтрок(
    IF
      УдалитьЭлемент_Список
      LIST-EXIT
    ELSE
      TRUE
    THEN
  )СписокСтрок

  " KONEC" ?St CR
\
  СписокСтрок# . CR
\
  СписокСтрок ВывестиСписок

  DEPTH R> - ?DUP
  IF
    0 DO
      DROP
    LOOP
  THEN
  CR .S CR
)#
mihast
 
Posts: 51
Joined: Tue, 23 Aug 2005, 21:14

Re: Плагин lists.spf [15/08/2013 21:40]

Postby VoidVolker » Fri, 21 Aug 2015, 13:24

Code: Select all
LIST( NODE@ )LIST

Это цикл. И он выложит на стек все содержимое списка.
Получение элемента списка по индексу:
Code: Select all
LIST: Список
Список[ 0 1 2 3 4 5 ]Список
3 Список#@ . CR
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf [15/08/2013 21:40]

Postby mihast » Fri, 21 Aug 2015, 14:04

То есть в моем случае корректнее будет так ?
Code: Select all
: ДобавитьЭлемент_Список { n a u list \ -- }
  LIST DUP list LIST! LIST[ STRING-LIST DUP LIST[ a u ]LIST n ]LIST
;
: УдалитьЭлемент_Список ( -- )
  NODE@ DUP 0 SWAP LIST#@ LIST-DEL LIST-DEL NDEL
;


И это позволит полностью освободить всю память занятую узлом списка ? Т.к. у меня это стоит в бесконечном цикле и вызывается несколько десятков миллионов раз в сутки, не хочется перезагрузок из-за утечек памяти...
mihast
 
Posts: 51
Joined: Tue, 23 Aug 2005, 21:14

Re: Плагин lists.spf [15/08/2013 21:40]

Postby VoidVolker » Fri, 21 Aug 2015, 15:33

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

Re: Плагин lists.spf [15/08/2013 21:40]

Postby mihast » Fri, 21 Aug 2015, 16:09

Я обрабатываю большие логи сложной структуры. Для передачи информации между потоками использую Глобальные списки. Каждая запись в списке - два поля: текстовая строка (до 5000) и целое число. ДобавитьЭлемент_Список кладет в список пару ( n a u list -- ). Обрабатываю список с "головы", обработанные значения - удаляю УдалитьЭлемент_Список

ДобавитьЭлемент_Список - работает "автономно" без привязки к LIST( )LIST [ это поток 1]
УдалитьЭлемент_Список - работает внутри цикла LIST( )LIST [ это поток 2]

Code: Select all
BEGIN
  LIST(
    ... обработка
    УдалитьЭлемент_Список
  )LIST
  30 PAUSE
AGAIN
mihast
 
Posts: 51
Joined: Tue, 23 Aug 2005, 21:14

Re: Плагин lists.spf [15/08/2013 21:40]

Postby VoidVolker » Fri, 21 Aug 2015, 17:42

Для записи значения в список предназначено слово LIST!. Оно работает и для числовых списков и для строковых списков.
mihast wrote:работает "автономно" без привязки к LIST( )LIST [ это поток 1]

А чем не нравится этот цикл? Он не зависит от потока и на время итерации использует отдельный буфер и допускает вложенность, в отличии от пошагового итератора (LIST>)
Для упрощения работы со сложными структурами имеет смысл делать отдельный набор слов. Что-то типа такого:
Code: Select all
LIST: Список_Строк

0
CELL -- -itemNum
CELL -- -itemStr
CELL+ CONSTANT /item  \ Еще одна ячейка для нуля в конце

: nau>item   { n a u \ item -- item } \ ( n a u -- item )
    u /item + GLOBAL-ALLOCATE THROW TO item
    n item -itemNum !
    a u item -itemStr SPLACE
    item
;

: itemDel   \ ( item -- )
    GLOBAL-FREE THROW NDEL
;

: Список!   \ ( n a u -- item )
    nau>item Список_Строк!
;

: itemNum@   \ ( item -- num )
    -itemNum @
;

: itemStr@   \ ( item -- a u )
    -itemStr SCOUNT
;

: Список_Строк_FREE
    Список_Строк(
        NODE@ itemDel
    )Список_Строк
;

: Заполнить1
    Список_Строк LIST-FREE
    Список_Строк[
        2368 " {20150820000007,C,{24237564ef170,8ee},75,69,2,6204,6,I,|q|q,0,{|qU|q},|q|q,1,7,6,75,69,2,6204,6,1,5,5,75,69,2,6204,6}," nau>item
        2229 " {20150820000007,C,{24237564ef170,9e4},75,69,2,6204,3,I,|q|q,0,{|qU|q},|q|q,1,7,6,75,69,2,6204,6,1,5,5,75,69,2,6204,6}," nau>item
        44411 " {20150820000007,U,{24237564ef170,992},75,69,2,6205,7,I,|q|q,59,{|qR|q,47:aaac50505450303011dc9d6e477613cd},|qФиР>С_С'С_ Р_Р_Р_Р_ (HX46) MB|q,1,5,5,75,69,2,6204,6,1,7,6,75,69,2,6204,6,1,5,5,75,69,2,6204,6}," nau>item
    ]Список_Строк
;

: Заполнить2
    Список_Строк LIST-FREE
    2368 " {20150820000007,C,{24237564ef170,8ee},75,69,2,6204,6,I,|q|q,0,{|qU|q},|q|q,1,7,6,75,69,2,6204,6,1,5,5,75,69,2,6204,6}," Список!
    2229 " {20150820000007,C,{24237564ef170,9e4},75,69,2,6204,3,I,|q|q,0,{|qU|q},|q|q,1,7,6,75,69,2,6204,6,1,5,5,75,69,2,6204,6}," Список!
    44411 " {20150820000007,U,{24237564ef170,992},75,69,2,6205,7,I,|q|q,59,{|qR|q,47:aaac50505450303011dc9d6e477613cd},|qФиР>С_С'С_ Р_Р_Р_Р_ (HX46) MB|q,1,5,5,75,69,2,6204,6,1,7,6,75,69,2,6204,6,1,5,5,75,69,2,6204,6}," Список!
;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf [15/08/2013 21:40]

Postby mihast » Fri, 21 Aug 2015, 19:00

Да, спасибо ! Это именно то, что нужно. Только, кажется, здесь addr - лишнее:

Code: Select all
a u addr -itemStr SPLACE
mihast
 
Posts: 51
Joined: Tue, 23 Aug 2005, 21:14

Re: Плагин lists.spf [15/08/2013 21:40]

Postby VoidVolker » Fri, 21 Aug 2015, 19:12

Нет, не лишнее. addr - это адрес элемента (item, только что выделенный участок памяти). А слово -itemStr прибавляет к адресу на стеке смещение в структуре. По факту - прибавляет 4. Т.о. в элементе в первой ячейке хранится число, во второй ячейке длина строки, а начиная с третьей ячейки начинается содержимое строки.
Собственно, правильнее было бы назвать не addr, а item. Исправил. И кстати, на счет локальных переменных: их нельзя использовать внутри итераторов типа LIST( )LIST и всех FOR-*:, т.к. для локальных переменных используется стек возвратов.

Code: Select all
0                      \ 0 \ Стартовый размер структуры
CELL -- -itemNum       \ 4 \ Первый элемент структуры, размером в ячейку (может быть любой размер)
CELL -- -itemStr       \ 8 \ Второй элемент структуры
CELL+                  \ 12 \ Дальше располагаются символы строки и размер структуры не определен и он может быть любым - поэтому сразу прибавляем ячейку для нуля
CONSTANT /item         \ Это минимальный размер структуры


Слово -- берет со стека два числа - текущий размер структуры и размер поля и создает слово, которое при исполнении прибавит текущий размер структуры к числу на вершине стека; затем оно возвращает на стек размер структуры, увеличенный на размер поля.
Code: Select all
: --
  CREATE OVER , + DOES> @ +
;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf [15/08/2013 21:40]

Postby mihast » Fri, 21 Aug 2015, 20:12

Сейчас LIST# для 3 элементов показывает 9... В Заполнить1

Про локальные переменные. Это только здесь, или в любых итераторах LIST( )LIST ?

Локальные - это те, которые в { \ локальная1 локальная2 -- } ?
mihast
 
Posts: 51
Joined: Tue, 23 Aug 2005, 21:14

Re: Плагин lists.spf [15/08/2013 21:40]

Postby VoidVolker » Sat, 22 Aug 2015, 08:37

mihast wrote:Сейчас LIST# для 3 элементов показывает 9... В Заполнить1

А, точно, конвертировать-то забыл ) Исправил.
mihast wrote:Это только здесь, или в любых итераторах LIST( )LIST ?

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

Re: Плагин lists.spf [15/08/2013 21:40]

Postby AleXH » Mon, 14 Sep 2015, 11:31

Может правильнее было бы перенести в extwords.spf?
Code: Select all
  \ * Числа двойной длины
  : D> 2SWAP D< ;   \ Вот тоже интересный момент: D< есть в кроне, а D> - нет.

При попытке подключения extwords.spf nnCron ругается на extwords.spf:73
Code: Select all
\ # Математические операции
    : D>0  \ ( ud -- ? )
        0 0 D>
    ;
AleXH
 
Posts: 44
Joined: Sun, 31 Mar 2013, 10:23

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 1 guest