首先,您需要了解作用域在 C 中是如何工作的,以及变量是如何传递给函数的。Local Scope > Global Scope,例如,如果您有一个名为“variable”的全局变量,以及一个带有一个也名为“variable”的变量的函数,那么您将使用它的本地副本。
现在,考虑到这一点,想想这一点,当您将参数传递给函数时,您实际上是在本地范围内制作了变量的副本。所以在你的功能中:
check(4, some_global_boolean, 'a');
当你定义函数时,你给每个参数一个名字,对吗?所以当你调用一个函数时,你会根据函数签名将每个参数实例化为一个变量(定义类型)。有点这样:argument1 = value1,argument2 = value 2,...,argumenn = valuen
现在,让我们把它带到你的函数中: boolean check(int key, boolean prev_key_high, char c) => key = 4, prev_key_high = some_global_boolean, c = 'a'
这些变量中的每一个都有一个局部范围,并且它具有与您在调用中使用的参数/变量/值相同的值,但该变量在内存中的位置完全不同。
现在,有不同的方法来处理这个问题,我个人不鼓励人们使用全局变量:
1.在你的主函数中实例化一个变量(你想要的静态或动态),并使用指向该特定变量的指针:
int main(int argc, char const *argv[])
{
boolean some_global_boolean = true; //or false or w/e or initialize it as you wish
check(4, &some_global_boolean, 'a');
return 0;
}
boolean check(int key, boolean * prev_key_high, char c){
if (key == LOW) {
if ( *prev_key_high){
*prev_key_high = false;
Serial.println(c);
return true;
}
}
else {
*prev_key_high = true;
return false;
}
}
2.如果你坚持使用全局变量,直接使用,或者结合之前的注释使用。我鼓励您学习指针并使用它们。
boolean check(int key, char c){
if (key == LOW) {
if ( some_global_boolean){
some_global_boolean = false;
Serial.println(c);
return true;
}
}
else{
some_global_boolean = true;
return false;
}
}
}