0

ブール値を引数として取り、ブール値の値を使用してから変更する関数チェックがあります。私は常にこの関数に次のようなグローバル変数を渡します。

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

6 に答える 6

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
于 2013-09-19T19:56:12.110 に答える
1

ポインターを渡す必要がありますが、次のように、すべての使用箇所を逆参照ポインターに変更する必要があります。

boolean check(int key, boolean *prev_key_high, char c){

    ...
    if (*prev_key_high)
    ...
    *prev_key_high = true;
    ...
于 2013-09-19T19:48:58.503 に答える
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;
  }



}
于 2013-09-19T19:49:20.923 に答える
0

まず、C でスコープがどのように機能するか、および変数が関数にどのように渡されるかを学ぶ必要があります。たとえば、「変数」という名前のグローバル変数と、「変数」という名前の変数を持つ関数がある場合は、そのローカル コピーで作業します。

これを念頭に置いて、これを考えてみてください。関数に引数を渡すと、実際には変数のコピーがローカル スコープで作成されます。だからあなたの機能で:

check(4, some_global_boolean, 'a');

関数を定義したとき、各引数に名前を付けましたよね?そのため、関数を呼び出し、関数シグネチャに従って各引数を (定義された型の) 変数にインスタンス化します。ちょっとこれ:引数1 =値1、引数2 =値2、...、引数=値n

では、これを関数に取り込んでみましょう: 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;
        }
    }
}
于 2013-09-19T20:20:10.403 に答える
0

グローバルを引数として関数に渡す必要はありません!. むしろ直接アクセスしてください。global を引数として渡すと、関数スコープ内にとどまるグローバル変数のローカル コピーが作成されます。

于 2013-09-19T20:21:17.560 に答える
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');
于 2013-09-19T19:54:45.137 に答える