Pd补丁中可能存在错误

时间:2018-10-18 12:44:00

标签: puredata

我做了一个非常简单的补丁,当触发爆炸时,它旨在触发0-2之间的唯一数字,换句话说,不会重复数字。

按照我设置的方式,它是理论上的工作。甚至我的编程指导者都说,从理论上讲,它应该起作用,而且他通常是一个非常聪明的人。他被非正式地称为学院的幕僚。

更多细节:

在完全相同的设置下,purr数据和纯数据中都会发生这种情况。

没有使用外部库。只是普通的香草对象。

由于似乎没有办法附加实际文件本身,因此我将张贴代码的图像:

Meow

1 个答案:

答案 0 :(得分:4)

问题在于深度优先处理(由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(仍在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]