Arduino:Основы/Переменные

Материал из Онлайн справочника
Версия от 22:13, 10 февраля 2017; Myagkij (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Переменные[1]

Переменная – это «место», в котором хранится кусочек данных. У нее есть название, значение и тип. К примеру, строчка кода (называемая «объявлением»)...

int pin = 13;

...создает переменную под названием pin со значением 13 и типом int. Позже в своем скетче вы можете обратиться к этой переменной по названию и благодаря этому найти, а затем и использовать хранящееся в ней значение. К примеру, в этой строчке кода...

pinMode(pin, OUTPUT);

...значение переменной pin (т.е. «13») передается функции pinMode(). Впрочем, в данном случае переменную использовать необязательно, можно просто вписать в качестве аргумента необходимое значение, как здесь...

pinMode(13, OUTPUT);

В данном случае преимущество переменой в том, что вам нужно указать номер контакта лишь единожды, в самом начале скетча, а затем использовать вместо него переменную – столько раз, сколько потребуется. То есть если позднее вы решите поменять «12» на «13», вам не нужно будет искать в скетче каждую строчку, где вы написали «13». Вы просто перемещаетесь в начало скетча и меняете значение всего один раз. Кроме того, название переменной можно сделать максимально наглядным – как в скетче, где для управления RGB-светодиодом используются переменные redPin, greenPin и bluePin.

У переменных есть и другие преимущества. Самое важное – возможность менять значение переменной при помощи операции присваивания (она выполняется при помощи знака «=»).

Например...

pin = 12;

...изменит значение переменной на «12». Обратите внимание, что мы не указали тип переменной, потому что операцией присваивания он не меняется. То есть название переменной навсегда привязывается к определенному типу, а меняется лишь значение. Также имейте в виду, что перед присвоением значения переменную нужно сначала объявить. Если вы добавите в свой скетч строчку кода выше, но не добавите в него объявление переменной, то получите сообщение вроде «error: pin was not declared in this scope», что значит «ошибка: переменная pin не была объявлена в данной области видимости переменных».

Когда вы присваиваете одну переменную другой, вы делаете копию его значения и сохраняете эту копию в участок памяти, который привязан к другой переменной. Далее, если поменять одну переменную, то на вторую это никак не повлияет. К примеру, после...

int pin = 13;
int pin2 = pin;
pin = 12;

... значение «12» будет только у переменной pin, а у pin2 по-прежнему останется «13».

Теперь вы думаете, возможно, что означает фраза «область видимости переменных» (в оригинале – «scope») из сообщении об ошибке выше... Это фраза обозначает часть скетча, в которой можно использовать нашу переменную. Это определяется тем, где мы ее объявили. К примеру, если вы хотите использовать переменную в любом месте, ее нужно объявить в самой верхней части скетча. Такая переменная называется «глобальной». Вот пример...

int pin = 13;

void setup()
{
  pinMode(pin, OUTPUT);
}

void loop()
{
  digitalWrite(pin, HIGH);
}

Как видите, переменная pin используется и в блоке setup(), и в блоке loop(). Оба блока отсылают к одной и той же переменной, поэтому если поменять ее в одной функции, это изменит ее и в другой. Как здесь...

int pin = 13;
void setup()
{
  pin = 12;
  pinMode(pin, OUTPUT);
}

void loop()
{
  digitalWrite(pin, HIGH);
}

Здесь функции digitalWrite() в блоке loop() передается значение «12», поскольку это значение было присвоено переменной pin выше, в блоке setup().

Если вам нужно использовать переменную только в одном блоке, вы можете объявить ее именно в нем, и в этом случае область видимости этой функции будет ограничена лишь этим блоком.

Например....

void setup()
{
  int pin = 13;
  pinMode(pin, OUTPUT);
  digitalWrite(pin, HIGH);
}

В данном случае переменную pin можно использовать только в блоке setup(). Если вы попытаетесь сделать так...

void loop()
{
  digitalWrite(pin, LOW); // ошибка: переменная pin находится вне области видимости
}

...то получите то же сообщение, что и раньше – «error: pin was not declared in this scope». То есть, пускай вы и объявили переменную pin, но пытаетесь использовать ее вне области видимости.

Сейчас вы, вероятно, задаетесь вопросом: почему бы просто не сделать все переменные глобальными? В конце концов, если я не знаю, где мне может пригодиться переменная, почему я должен ограничивать место, где она может пригодиться? Ответ прост – так проще понять суть проблемы, если что-то пойдет не так. Если это глобальная переменная, ее значение может измениться в любом месте скетча, и это значит, что вам нужно хорошо знать весь скетч для того, чтобы понять, в чем проблема. К примеру, если переменная хранит какое-то странное значение, будет намного проще понять, почему оно получилось таким странным, если это значение будет храниться в переменной, живущей в таком вот «гетто», т.е. в ограниченной области видимости.

Примечание: В некоторых языках (вроде Python) типы присваиваются значениям, а не названиям переменных, и вы, к тому же, можете присвоить переменной значения любого типа. Это называется «динамической типизацией».

См.также

Внешние ссылки