まず、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;
}
}
}