Возможная ошибка в патче Pd - PullRequest
0 голосов
/ 18 октября 2018

Я сделал очень простой патч, с помощью которого при срабатывании взрыва должен запускаться уникальный номер в диапазоне 0-2, другими словами, никакие числа не повторяются.

В путичто я настроил это, это должно работать в теории.Даже мой наставник по программированию сказал, что теоретически это должно работать, и он, как правило, очень умный человек.Неофициально он известен как академик.

Еще несколько деталей:

Это происходит как в мурлыкающих данных, так и в чистых данных, с точно такой же настройкой.

Внешние библиотеки не используются.Просто обычные объекты Vanilla.

Поскольку, похоже, нет способа прикрепить сам фактический файл, вместо этого я опубликую изображение кода:

Meow

1 Ответ

0 голосов
/ 22 октября 2018

Проблема связана с обработкой в ​​глубину (используемой Pd) и связанной с этим разверткой стека, поскольку это может привести к установке второго входа [select] на старое значение (которого вы не ожидали).

Пример

Примечание: select:in0 означает крайний левый вход [select], ... Числа, генерируемые [random], выделены жирным шрифтом (1) и номера, выводимые патчем, выделены жирным курсивом (например, 3)

Представьте, что [select] инициализирован 0и объект [random 3] выводит список 2 0 0 2 0 2 ... (подсказка: [seed 96().

Ожидаемый результат будет 2 0 2 0 2 ..., однако на самом деле вывод 2 0 2 2 2 ...

Вот что происходит, если вы последовательно отправляете [bang( в генератор случайных чисел:

  1. random генерирует 2
    • 2 отправляется на sel:in0, который сравнивает его с 0 (без совпадения)
      • и отправляет его из sel:out1 (выход брака),отображение числа 2
    • , после чего число отправляется на sel:in1, устанавливая его внутреннее состояние на 2.
  2. random генерирует 0
    • 0 отправляется на sel:in0, который сравнивает его с 2 (нет совпадений)
      • и отправляет его из sel:out1, отображая после этого номер 0
    • после этогономер отправляется на sel:1, устанавливая его внутреннее состояние на 0.
  3. random генерирует 0
    • 0 отправляется на sel:in0, который сравнивает его с 0 (совпадение!)
      • и отправляет вызов через sel:out0 (выход совпадения)
        • , инициируя новый вызовна random, который теперь генерирует 2
        • 2 отправляется на sel:in0, который сравнивает его с 0 (без совпадения)
          • и отправляет его из sel:out1, показывая номер 2
        • , после чего номер отправляется на sel:1, установив его внутреннее состояние на 2.
    • , после этого число 0 (все еще ожидающее вe trigger:out0) отправляется на sel:1, устанавливая его внутреннее состояние на 0 !!!
  4. random создает 0
    • 0 отправляется на sel:in0, который сравнивает его с 0 (соответствует!)
      • и отправляет вызов через sel:out0
        • , инициируя новый вызовна random, который теперь генерирует 2
        • 2 отправляется на sel:in0, который сравнивает его с 0
          • и отправляет егоиз sel:out1, отображая номер 2
        • , после чего номер отправляется на sel:1, устанавливая его внутреннийукажите 2.
    • , после чего число 0 (все еще ожидающее в trigger:out0) отправляется на sel:1, устанавливая его как внутреннее0 !!!

Как видите, в конце # 3 внутреннее состояние [select] равно 0, хотя последнийчисло, сгенерированное [random], было 2 (поскольку крайний левый выход [trigger] будет отправлять только на 0 после он отправил 2 из-за разворачивания стека).

Решение

Решение простое: убедитесь, что состояние [select] содержитпоследнее отображаемое значение, а не последнее, сгенерированное в стеке.избегайте обратной связи при изменении внутреннего состояния.

Например (используя локальную отправку / получение для более хорошего ASCII-искусства)

[r $0-again]
|
[bang(
|
[random 3]
|
|      [r $0-last]
|      |
[select]
|      |
|      [t f f]
|      |     |
|      |     [s $0-last]
|      |
|      [print]
|
[s $0-again]
...