Проблема с массивом

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

Postby jen » Sun, 27 Aug 2006, 12:48

Не получается разбить строки.В файле test.txt записаны следующие строки
Маркетинг Иванова
Бухгалтерия Клочкова
Снабжение Фирсов

Пишу код
#( test_read_by_line
NoActive
\ Построчно (в цикле) считываем файл
\ test.txt в массив list-contents и
\ выводим каждую строчку на экран.
VARIABLE list-file
VARIABLE var1
VARIABLE var2
CREATE list-contents 258 ALLOT
Action:
S" test.txt" R/O OPEN-FILE-SHARED THROW list-file !
BEGIN list-contents 1+ 255 list-file @ READ-LINE THROW WHILE
list-contents C!
IF
list-contents PLACE
RE-MATCH: "%list-contents COUNT%" "/(\W{1,10}) (\W{1,10})/"
IF
%$1% EVAL-SUBST var1 !
%$1% EVAL-SUBST var2 !
THEN
MSG: "%var1%
MSG: "%var2%
THEN
REPEAT
DROP
list-file @ CLOSE-FILE DROP
)#
Выдается ошибка.
Пробовал так:
#( read_by_line
NoActive
\ Построчно (в цикле) считываем файл
\ test.txt в массив list-contents и
\ выводим каждую строчку на экран.
VARIABLE list-file
VARIABLE var1
VARIABLE var2
CREATE list-contents 258 ALLOT
Action:
S" test.txt" R/O OPEN-FILE-SHARED THROW list-file !
BEGIN list-contents 1+ 255 list-file @ READ-LINE THROW WHILE
list-contents C!
IF
S" /(\W{1,20}) (\W{1,20})/" RE-MATCH
IF
S" %$1%" EVAL-SUBST var1 !
S" %$2%" EVAL-SUBST var2 !
THEN
MSG: "%var1%
MSG: "%var2%
THEN
REPEAT
DROP
list-file @ CLOSE-FILE DROP
)#
Тоже выдается ошибка. Что делаю неправильно? Нигде не нашел что такое EVAL-SUBST. Пытаюсь делать из примеров, которые посоветовали. Слабо получается :(
jen
 
Posts: 10
Joined: Thu, 10 Aug 2006, 16:08

Postby SeMa » Mon, 28 Aug 2006, 14:09

jen
Ты пытаешься числовой переменной присвоить строковое значение. Для строковых переменных создаются массивы. Например:
CREATE var1_dep 15 ALLOT
CREATE var1_name 15 ALLOT
А в задаче:
Code: Select all
...
RE-MATCH: "%list-contents COUNT%" "/(\W{1,10}) (\W{1,10})/"
IF
S" %$1%" EVAL-SUBST var1_dep PLACE
S" %$2%" EVAL-SUBST var1_name PLACE
...


EVAL-SUBST
Справка - Дополнительная информация - "Неотложная помощь" по Форту - Пpавильно ли я понял, что при описании стpоки (внутpи кавычек) можно поставить паpу "%%" и внутpи оных писать последовательность Forth-слов?
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

Postby RV » Mon, 07 May 2007, 07:45

Подскажите плз.
Как сделать поиск в массиве? Т.е. сканируется папка, все имена файлов из этой папки добавляются в массив. Если такое имя уже есть в массиве - не добавляется. т.е. в массиве уникальные имена.
RV
 
Posts: 20
Joined: Wed, 22 Feb 2006, 05:37

Postby elos » Mon, 07 May 2007, 10:46

посмотреть как можно использовать
C:\SPF\devel\~ac\lib\win\ini.f плюс C:\SPF\devel\~af\lib\ini.f
подстроить под себя и
затем обернуть в это строку вызова nnbackup (благо им по сетке лазить можно)

можно , конечно, полностью зациклиться на nnCron (так и не собрался выяснить - в нем вроде не полностью слова SPF присутствуют...), но для себя решил так не делать при нехватке времени (обертывал, например, скрипт на GAWK в скрипт nnCron - мне так удобнее было парсить строки. Cron только отлавливал появление файла и запускал действия...)
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Postby AlikasS » Tue, 08 May 2007, 02:57

RV wrote:Подскажите плз.
Как сделать поиск в массиве? Т.е. сканируется папка, все имена файлов из этой папки добавляются в массив. Если такое имя уже есть в массиве - не добавляется. т.е. в массиве уникальные имена.
1.используй слово SEARCH ( c-addr1 u1 c-addr2 u2 -- c-addr3 u3 flag )
\ Произвести поиск в строке, заданной c-addr1 u1, строки, заданной c-addr2 u2.
\ Если флаг "истина", совпадение найдено по адресу c-addr3 с оставшимися u3
\ символами. Если флаг "ложь", совпадения не найдено, и c-addr3 есть c-addr1,
\ и u3 есть u1.
Например
Code: Select all
:#( работа_с_массивом
NoActive
USER-VALUE список_файлов
Action:
256 ALLOCATE THROW TO список_файлов
FOR-FILES: "C:\Program Files\nnCron\*.tab*"
IS-DIR? 0=
IF
   список_файлов COUNT FOUND-FILENAME SEARCH 0=
   IF
   2DROP
   FOUND-FILENAME список_файлов +PLACE
   S"  " список_файлов +PLACE \ добавление пробела между внесенными именами
   ELSE
   2DROP
   THEN
THEN
;FOR-FILES
\ HINT: "%список_файлов COUNT%" \ тест вывода
список_файлов FREE DROP
)#
но может не хватить памяти выделенной под массив,
т.к. не известно сколько файлов придется обработать
и у строк в данном случае ограничение на длину в 255 символов.
2.лучше использовать в этом случае работу со списками:
Code: Select all
#( работа_со_списком
NoActive
VARIABLE f-list \ в списке будут хранится адреса az строк, которые содержат найденные имена файлов
0 VALUE TTTT
: f-action NodeValue ASCIIZ> MsgBox
\ получение значение элемента списка - адреса az строки из списка, преобразование в au строку
\ вывод au строки - имени файла
;
: f-see
\ получение значения элемента списка - адреса az строки из списка, преобразование в au строку
\ и сравнение с найденным файлом
NodeValue ASCIIZ> FOUND-FILENAME COMPARE 0=
IF
TRUE TO TTTT
ELSE
FALSE TO TTTT
THEN
;
: f-free NodeValue FREE DROP
\ получение значения элемента списка - адреса az строки из списка,
\ высвобождение зарезервированной памяти по этому адресу
;
Action:
FOR-FILES: "C:\Program Files\nnCron\*.tab*"
IS-DIR? 0=
IF
   ['] f-see f-list DoList
   TTTT 0= IF
    \ если файла нет в списке, внесение адреса az строки с его именем в список
   FOUND-FILENAME S>ZALLOC f-list AddNode
   THEN
THEN
;FOR-FILES
 f-list @
 IF
\ список не пустой
    ['] f-action f-list DoList \ вывод занесенных значений
    ['] f-free f-list DoList \ очистка памяти отведенной под az строки
    f-list FreeList \ очистка списка
 THEN
)#
3.или вообще вместо массива использовать отдельный файл и в нем уже искать/записывать имена найденных файлов
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Проблема с массивом

Postby ascerdfg1 » Mon, 31 Dec 2012, 16:21

Подскажите плиз, как выводить по-ячеечно массив в цикле?
Code: Select all
#( ro
\ NoActive
SingleInstance
CREATE r-matrix 100 ALLOT
Action:
0 r-matrix 0 + C! \
1 r-matrix 1 + C! \ записать байт в первую ячейку массива (C! - записать байт по адресу)
0 r-matrix 2 + C!
3 r-matrix 3 + C!
0 r-matrix 4 + C!
5 r-matrix 5 + C!
0 r-matrix 6 + C!
7 r-matrix 7 + C!
0 r-matrix 8 + C!
\ r-matrix 3 + C@ \ получить байт 2-й ячейки
5 0 DO
MSG: "%r-matrix I + C@%"
LOOP
)#
nncron.exe v 1.93b10 Build 1141
tm.exe v 1.93b10 Build 569
Windows XP (5.1.2600) SP3
Комп без nnCron - груда металла!
User avatar
ascerdfg1
 
Posts: 541
Joined: Thu, 29 Nov 2007, 02:45
Location: г. Алексин

Re: Проблема с массивом

Postby ascerdfg1 » Mon, 31 Dec 2012, 17:34

Урря заработало!
Code: Select all
MSG: "%r-matrix spin @ + C@%"
Всех с НГ!
nncron.exe v 1.93b10 Build 1141
tm.exe v 1.93b10 Build 569
Windows XP (5.1.2600) SP3
Комп без nnCron - груда металла!
User avatar
ascerdfg1
 
Posts: 541
Joined: Thu, 29 Nov 2007, 02:45
Location: г. Алексин

Re: Проблема с массивом

Postby VoidVolker » Mon, 31 Dec 2012, 18:27

Или вот так:
Code: Select all
r-matrix 10 + r-matrix DO
  I C@ .
LOOP CR
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Previous

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 4 guests

cron