永久改变参数值

时间:2013-09-19 19:40:51

标签: 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_key_high = false;
      Serial.println(c);
      return true;
}
  }

  else {
    prev_key_high = true;
    return false;
  }
}

6 个答案:

答案 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作为参数传递会创建全局变量的本地副本,该副本保留在函数范围内。