C 永久更改参数值
我有一个函数检查,它将布尔值作为参数,使用布尔值,然后更改它。我总是给这个函数传递一个全局变量,比如:C 永久更改参数值,c,arduino,C,Arduino,我有一个函数检查,它将布尔值作为参数,使用布尔值,然后更改它。我总是给这个函数传递一个全局变量,比如: 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_k
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;
...
您应该传递指针,但必须将所有用法更改为取消引用的指针,如下所示:
boolean check(int key, boolean *prev_key_high, char c){
...
if (*prev_key_high)
...
*prev_key_high = true;
...
谢谢你,西蒙。
以下是新代码:
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;
}
}
谢谢你,西蒙。
以下是新代码:
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');
全局布尔值中的更改不会持续,因为它是按值传递的。当参数按值传递给函数时,函数将创建变量的本地副本并对本地副本进行更改。一旦程序超出函数的作用域,该局部变量将退出内存。 使用指针应该可以解决这个问题。试试下面的方法
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');
此外,如果变量在全局范围内,您可以将其从参数列表中删除并直接访问,这样它就不会出现在局部范围内。例如:
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
此外,如果变量在全局范围内,您可以将其从参数列表中删除并直接访问,这样它就不会出现在局部范围内。例如:
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
首先,您需要了解C中作用域是如何工作的,以及变量是如何传递给函数的。 局部作用域>全局作用域,例如,如果您有一个名为“variable”的全局变量和一个名为“variable”的函数,那么您将处理它的局部副本 现在,记住这一点,想想这个,当你把一个参数传递给一个函数时,你实际上是用局部作用域复制了一个变量。因此,在您的功能中: 检查(4,一些全局布尔值,'a') 定义函数时,为每个参数指定了一个名称,对吗?因此,当您调用一个函数,并根据函数签名将每个参数实例化为一个变量(定义的类型)。有点像这样: argument1=value1,argument2=value2,…,argumenn=valuen 现在,让我们把这个带到您的函数: 布尔检查(整数键,布尔上下键高,字符c)=>key=4,上下键高=一些全局布尔,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;
}
}
}
首先,您需要了解C中作用域是如何工作的,以及变量是如何传递给函数的。 局部作用域>全局作用域,例如,如果您有一个名为“variable”的全局变量和一个名为“variable”的函数,那么您将处理它的局部副本 现在,记住这一点,想想这个,当你把一个参数传递给一个函数时,你实际上是用局部作用域复制了一个变量。因此,在您的功能中: 检查(4,一些全局布尔值,'a') 定义函数时,为每个参数指定了一个名称,对吗?因此,当您调用一个函数,并根据函数签名将每个参数实例化为一个变量(定义的类型)。有点像这样: argument1=value1,argument2=value2,…,argumenn=valuen 现在,让我们把这个带到您的函数: 布尔检查(整数键,布尔上下键高,字符c)=>key=4,上下键高=一些全局布尔,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;
}
}
}
您不需要将全局函数作为参数传递给您!。而是直接访问它。
将全局变量作为参数传递会创建全局变量的本地副本,该副本位于函数范围内。您不需要将全局变量作为参数传递给函数!。而是直接访问它。
将全局作为参数传递将创建全局变量的本地副本,该副本位于函数范围内。如果将参数作为指针引用传递,则将在方法调用后对其进行修改。如果将参数作为指针引用传递,则将在方法调用后对其进行修改。您已经正确地理解了它。顺便说一句,如果它是一个全局变量,为什么必须传递并执行更改?;-)我不确定我是否理解你的问题,但我通过了它,因为我调用多布尔值检查(key_a,&prev_key_a_high,'a');检查(键b和上一键b高,'b');检查(图例c和p