永久改变参数值

我有一个函数检查,它接受一个布尔值作为参数,使用布尔值,然后更改它。 我总是将这个函数传递给一个全局变量,如:

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; } } 

您应该传递指针,但是您必须将所有用法更改为解除引用的指针,如下所示:

 boolean check(int key, boolean *prev_key_high, char c){ ... if (*prev_key_high) ... *prev_key_high = true; ... 

此外,如果您的变量在全局范围内,您可以将其从参数列表中删除并直接访问它,这样它就不会出现在本地范围内。 例如:

 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 

谢谢西蒙。 这是新代码:

  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; } } 

全局布尔值的更改不会持久存在,因为它是按值传递的。 当参数通过值传递给函数时,该函数会创建变量的本地副本并对本地副本进行更改。 一旦程序超出函数范围,该局部变量就会耗尽内存。 使用指针应该可以解决问题。 试试以下..

 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'); 

首先,您需要了解范围如何在C中工作,以及如何将变量传递给函数。 本地范围>全局范围,例如,如果您有一个名为“variable”的全局变量,以及一个名为“variable”的变量的函数,您将处理它的本地副本。

现在,考虑到这一点,想一想,当你将一个参数传递给一个函数时,你实际上是用本地范围制作一个变量的副本。 所以在你的function中:

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.在main函数中实例化一个变量(静态或动态,如你所愿),并使用指向该特定变量的指针:

  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; } } } 

你不需要将全局传递给你作为参数! 而是直接访问它。 将global作为参数传递会创建全局变量的本地副本,该副本保留在函数范围内。