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