如何在循环中的if语句中使用此变量(范围)

时间:2011-10-10 04:30:58

标签: c scope arduino

我正在使用Arduino编程,我相信使用C作为基本语言。我有这个循环:

int i = 0;

void loop()
{
    //Set The output pin to the MIDI note number - 60.
    int pinNumber = noteNumber - 60;

    if (midiMessage == 144) {
        if (velocity == Triggered) {
            registerWrite(pinNumber, HIGH);
            i = pinNumber;
        }
    }

    if (midiMessage == 128) {
        if ((i % 8) == (pinNumber % 8)) {
            if (velocity == Stopped) {
                registerWrite(pinNumber, LOW);
            }
        }
    }
}

我知道上面的代码不正常,但我要做的是在满足第一个条件i的情况下分配if (velocity == Triggered)变量,然后才能使用它当满足midiMessage == 128条件时。

1 个答案:

答案 0 :(得分:4)

i是一个全局变量,意味着它在程序启动时初始化为0(显式),然后可以通过任何可以看到它的代码进行更改。

所以,如果您的问题是:

  

它会在loop()函数的不同调用之间保持其值吗?

(似乎是根据你在问题中留下的评论)然后答案是肯定的。

换句话说,当您输入loop() midiMessage等于144时,它会将i设置为pinNumbernoteNumber - 60)。

然后,当您下次loop() midiMessage等于128时,它将使用当前i(无论上次设置的是什么)。

当然,如果您在之前输入loop() midiMessage等于128 ,则在midiMessage等于144时调用它,{{1}的值将为零。


如果i的声明i函数内,那么每次调用该函数时都会重新初始化,但这不是这里的情况。

当然,良好的编程习惯会建议您将它放在函数中,如果这是您使用它的唯一地方(可能不是这种情况)。

这限制了它对该函数的“可见性”(a),因此其他代码不可能无意中使用它(这对于一个名为尤其的变量是一个问题loop() - 您可能想要一个更好的名称)。

要限制其可见性,同时仍然允许它在函数调用之间存在,您可以使用类似:

i

这仍然在程序启动时初始化一次(即使它在函数内部)并且在void loop (void) { static int persistentVar = 0; : : } 的不同调用之间保持其值。它还会阻止来自该函数外部的代码“看到”变量。


(a)请注意,此处使用的“可见性”不是ISO标准使用的术语。我将这个术语用于我的入门编码类,因为“可见性”比“范围”更容易理解。