Какова цель '&' при передаче bool в качестве параметра функции?

Если я использую эту функцию без & перед change_x (в параметре функции), change_x никогда не изменится на false и продолжит печатать навсегда. Зачем мне нужен &?

void some_function(bool &change_x, int pin_x) {
 if (change_x == true) {
 delay(time_delay);
 if (digitalRead(pocket_pin_1) == HIGH) {
  Serial.print("State 1");
  }  

 else {
  Serial.println("state 2");
 }
 change_x = false;
 }
}

, 👍0


2 ответа


1

Как всегда в C++, аргумент по умолчанию передается по значению (как и в старом добром C). Используя '&' вы можете передать его по ссылке. Таким образом, вы копируете не значение переменной в метод, а исходную переменную с возможностью ее изменения внутри функции, и она будет отражать изменения вне функции.

Возможно, вы можете вставить больше кода, чтобы мы увидели, как переменная передается в функцию. Например, вызов some_function(true, 3) бесполезен.

Но в любом случае это не вопрос, специфичный для Arduino, а вопрос stackoverflow.

,

2

Если у вас есть логическое значение b, вы обычно присваиваете ему значение true или false. Если вы передаете в функцию логическое значение (или целое число, символ и большинство других простых типов), создается копия. Поэтому, если вы измените его в функции, то при возврате функции копия будет уничтожена, а исходное значение сохранится.

Однако вам не нужна копия, поэтому вам нужна ссылка (указатель) на это логическое значение. Вот где & это для. Таким образом, bool &change — это не логическое значение, а ссылка на логическое значение. Всякий раз, когда вы меняете эту ссылку, исходное значение логического значения изменяется, чего вы и хотите.

Обратите внимание: это функция C++, она не существует в C (вместо этого вы используете указатели: bool* изменить).

,