我有一个函数检查,它将布尔值作为参数,使用布尔值然后更改它。我总是将这个函数传递给一个全局变量,如:
check(4, some_global_boolean, 'a');
我希望在调用“check”后保持对变量的更改。现在,改变不会超出这个函数调用。我该怎么做呢?
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;
}
}
答案 0 :(得分:2)
此外,如果您的变量位于全局范围内,您可以将其从参数列表中删除并直接访问它,这样它就不会出现在本地范围内。例如:
int globalInt;
void incGlobal() {
globalInt++;
}
int main() {
globalInt = 0;
printf("%d\n", globalInt);
incGlobal();
printf("%d\n", globalInt);
incGlobal();
printf("%d\n", globalInt);
incGlobal();
}
打印
0
1
2
答案 1 :(得分:1)
您应该传递指针,但是您必须将所有用法更改为解除引用的指针,如下所示:
boolean check(int key, boolean *prev_key_high, char c){
...
if (*prev_key_high)
...
*prev_key_high = true;
...
答案 2 :(得分:0)
谢谢西蒙。 这是新代码:
check(key_a, &prev_key_a_high, 'a');
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;
}
}
答案 3 :(得分: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;
}
}
当你调用这个函数时:
check(4, &some_global_boolean, 'a');
答案 4 :(得分:0)
首先,您需要了解范围如何在C中工作,以及如何将变量传递给函数。 本地范围>例如,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;
}
}
}
答案 5 :(得分:0)
你不需要将全局传递给你作为参数!而是直接访问它。 将global作为参数传递会创建全局变量的本地副本,该副本保留在函数范围内。