PureData使用循环写入数组时首个循环从索引1开始的原因是什么?
Pure Data循环写入数组索引异常问题
我正在Pure Data中使用循环向数组写入随机数。但我发现循环一存在异常:Pure Data未从索引0开始写入,而是从索引1开始,循环结束后才将值写入索引0,不符合预期。我在循环二中额外使用[f]和[bang]得到了可行的解决方案,此时Pure Data符合预期从索引0开始写入。两种方案下控制台打印的数据顺序完全一致(数字为随机生成,仅顺序相同),只有数组对应的可视化图表显示有差异。
请问有人知道第一种方案出错、第二种方案正常运行的原因吗?我个人猜测这与[tabwrite]左右入口的数据流逻辑有关。
循环一



循环二



原因解答
这个现象的核心确实和[tabwrite]的入口逻辑以及Pure Data的消息执行规则直接相关:
- Pure Data所有对象的右入口均为冷入口:冷入口仅会暂存传入的数值,不会触发对象执行操作;只有左入口(热入口)收到数值或bang时,才会调用对象当前存储的所有参数完成对应操作。
- 循环一错误原因:消息链中,计数器输出的索引值先传入
[tabwrite]的右冷入口暂存,同一消息链后续会立即执行计数器自增操作,等随机数生成后传入[tabwrite]左热入口触发写入时,[tabwrite]内暂存的索引已经被自增后的值覆盖,因此第一个随机数就写入了索引1的位置,直到整个循环结束后,最后一次操作才会把剩余的索引0补上。 - 循环二正确原因:新增的
[f]对象会先锁存当前循环对应的索引值,再通过独立的bang触发[tabwrite]写入,写入时调用的索引就是当前锁存的正确值,不会被后续的计数器自增操作干扰,因此可以按预期从索引0开始顺序写入。
控制台输出的数值顺序一致是因为打印的是随机数的生成顺序,和写入数组的索引无关,所以两种方案的打印结果没有差异,只有数组内的数值位置有区别。
内容的提问来源于stack exchange,提问作者Thiago Luiz
相关产品推荐
相关产品推荐

