【问题标题】:Regarding the Global vs. Local Variables Examples from Daniel Shiffman's "Learning Processing"关于 Daniel Shiffman 的“学习处理”中的全局​​变量与局部变量示例
【发布时间】:2020-02-29 01:01:49
【问题描述】:

处理的原生示例中包含以下两个来自 Daniel Shiffman 的“学习处理”的示例:

示例 #1


void setup() {
  size(200,200);
}

void draw() {
  int count = 0;
  count = count + 1;
  background(count);
}

示例 #2


int count = 0;

void setup() {
  size(200,200);
}

void draw() {
  count = count + 1;
  background(count);
}

我为第一个示例提出的问题可能已经被问过;我最好的猜测是局部变量在这种情况下不起作用,因为draw() 是一个循环,因此即使存在声明count = count + 1 来枚举int count,在draw() 循环中声明int count = 0 意味着该值不断重置为零。这是正确的吗?

对于第二个例子,问题不一定是关于变量,而是关于程序运行的方式:在第一个循环之后,从黑色到白色,为什么程序然后继续循环从黑色到蓝色?在其他应用程序中如何避免或解决此问题?

【问题讨论】:

    标签: variables colors processing


    【解决方案1】:

    在第一个示例中,变量在drew 范围内声明。每次调用draw时,都会创建变量count并将其初始化为0。

    在第二个示例中,使用了全局变量 count。该变量在应用程序启动时初始化一次,并不断递增。

    如果 [background()] 的参数可以是 [0, 255] 范围内的整数值。在这种情况下,参数被解释为灰度,其中 0 为黑色,255 为白色。
    如果积分值大于 255,则被解释为由 3 个 8 位颜色分量 (0xRRGGBB) 组成的 RGB 值。 0xff0000 为红色,0x00ff00 为绿色,0x0000ff 为蓝色。

    要使颜色变为蓝色的空白,您必须确保该值小于 255。例如:

    void draw() {
        count = count + 1;
        if (count > 255) {
            count = 0;
        }
        background(count);
    }
    

    【讨论】:

    • 为了确保我理解正确,您所说的是像background(256); 这样的语句被解释为RGB 值。如果是这种情况,比 255 高 1 的整数值如何将计数转换为蓝色,特别是 background(0, 0, [0, 255]);?如果该值从灰度溢出到 RGB,因为红色是 background() 中的第一个参数,为什么循环不会变为红色而不是蓝色?
    • @NicholasHoyt 你是对的。什么都没有改变。 255 是 0x000ff,256 是 0x000100。所以 256 实际上是 RGB(0,1,0),几乎是黑色,只是有点绿色。 511 是 0x0001ff,即 RGB(0,1,255)。请注意,移位是隐含的,它只是一个整数。低 8 位为蓝色,第 9 至 16 位为绿色,第 17 至 24 位为红色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多