Список: ошибка стека в литерале

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

Список: ошибка стека в литерале

Postby Morituruz » Thu, 26 Jun 2014, 09:28

Решил сделать нормальное слово для проигрывания случайного файла.
Столкнулся с проблемой появления каких-то левых значений на стеке после выполнения.
Путём многочасового разбирательства, опытным путём выяснил, что нужен DROP (выделен комментарием) в слове, которое компилируется как литерал. В чём причина?
Code: Select all
\ воспроизведение случайного файла в папке:
VARIABLE prf_list   \ список
VARIABLE prf_counter \ количество файлов в папке
VARIABLE prf_random   \ случайный номер
VARIABLE prf_counter2   \ счётчик
CREATE prf_path_buffer 256 ALLOT
: prf_action
prf_counter2 1+!
prf_counter2 @ prf_random @ =
IF
   NodeValue ASCIIZ> prf_path_buffer PLACE
\   prf_path_buffer COUNT TYPE CR
   PLAY-SOUND: "%prf_path_buffer COUNT%"
ELSE
   DROP  \ <-------------------------------------------------------------------- что оно сбрасывает?
THEN
;
: play_random_file { a u -- }
\ a u — путь к папке со слешем на конце
prf_list @ 0=
IF
   \ список пуст, собираем файлы в список:
   S" Scanning " a u S+ TYPE CR
   a u S" *.wav" S+ FOR-FILES
      IS-DIR? 0=
      IF
         FOUND-FULLPATH S>ZALLOC prf_list AddNode
         prf_counter 1+!
      THEN
   ;FOR-FILES
THEN
prf_counter @ RANDOM 1 + prf_random !
0 prf_counter2 !
['] prf_action prf_list DoList
;
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Список: ошибка стека в литерале

Postby AlikasS » Fri, 27 Jun 2014, 07:47

слово DoList берет адрес каждой ячейки списка и подсовывет его на выполнение твоему слову prf_action
а внутри prf_action этот адрес снимается со стека словом NodeValue, но у тебя при некоторых твоих условиях действие NodeValue не происходит
вот и копятся на стеке "неиспользованные" адреса ячеек.

как вариант
Code: Select all
: prf_action { \  temp -- }
NodeValue  TO temp
prf_counter2 1+! prf_counter2 @ prf_random @ =
IF
   temp ASCIIZ> prf_path_buffer PLACE
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Список: ошибка стека в литерале

Postby AlikasS » Fri, 27 Jun 2014, 08:57

обрати внимание на слово PICK-RANDOM-FILE: из плагина files_pick.spf
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Список: ошибка стека в литерале

Postby Morituruz » Fri, 27 Jun 2014, 09:05

AlikasS wrote:слово DoList берет адрес каждой ячейки списка и подсовывет его на выполнение твоему слову prf_action

Спасибо, теперь всё ясно.

AlikasS wrote:обрати внимание на слово PICK-RANDOM-FILE: из плагина

Смысл моих заморочек со списками — не сканировать при каждом вызове директорию.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 4 guests