Arduino:Основы/Переменные: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
Строка 7: | Строка 7: | ||
Переменная – это '''«место»''', в котором хранится кусочек данных. У нее есть название, значение и тип. К примеру, строчка кода (называемая «объявлением»)... | Переменная – это '''«место»''', в котором хранится кусочек данных. У нее есть название, значение и тип. К примеру, строчка кода (называемая «объявлением»)... | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
int pin = 13; | int pin = 13; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 13: | Строка 13: | ||
...создает переменную под названием '''pin''' со значением '''13''' и типом [[Arduino:Справочник языка Arduino/Типы данных/int|int]]. Позже в своем скетче вы можете обратиться к этой переменной по названию и благодаря этому найти, а затем и использовать хранящееся в ней значение. К примеру, в этой строчке кода... | ...создает переменную под названием '''pin''' со значением '''13''' и типом [[Arduino:Справочник языка Arduino/Типы данных/int|int]]. Позже в своем скетче вы можете обратиться к этой переменной по названию и благодаря этому найти, а затем и использовать хранящееся в ней значение. К примеру, в этой строчке кода... | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
pinMode(pin, OUTPUT); | pinMode(pin, OUTPUT); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 19: | Строка 19: | ||
...значение переменной '''pin''' (т.е. '''«13»''') передается функции [[Arduino:Справочник языка Arduino/Функции/Цифровой ввод/вывод/pinMode()|pinMode()]]. Впрочем, в данном случае переменную использовать необязательно, можно просто вписать в качестве аргумента необходимое значение, как здесь... | ...значение переменной '''pin''' (т.е. '''«13»''') передается функции [[Arduino:Справочник языка Arduino/Функции/Цифровой ввод/вывод/pinMode()|pinMode()]]. Впрочем, в данном случае переменную использовать необязательно, можно просто вписать в качестве аргумента необходимое значение, как здесь... | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
pinMode(13, OUTPUT); | pinMode(13, OUTPUT); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 29: | Строка 29: | ||
Например... | Например... | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
pin = 12; | pin = 12; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 37: | Строка 37: | ||
Когда вы присваиваете одну переменную другой, вы делаете копию его значения и сохраняете эту копию в участок памяти, который привязан к другой переменной. Далее, если поменять одну переменную, то на вторую это никак не повлияет. К примеру, после... | Когда вы присваиваете одну переменную другой, вы делаете копию его значения и сохраняете эту копию в участок памяти, который привязан к другой переменной. Далее, если поменять одну переменную, то на вторую это никак не повлияет. К примеру, после... | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
int pin = 13; | int pin = 13; | ||
int pin2 = pin; | int pin2 = pin; | ||
Строка 47: | Строка 47: | ||
Теперь вы думаете, возможно, что означает фраза '''«область видимости переменных»''' (в оригинале – '''«scope»''') из сообщении об ошибке выше... Это фраза обозначает часть скетча, в которой можно использовать нашу переменную. Это определяется тем, где мы ее объявили. К примеру, если вы хотите использовать переменную в любом месте, ее нужно объявить в самой верхней части скетча. Такая переменная называется '''«глобальной»'''. Вот пример... | Теперь вы думаете, возможно, что означает фраза '''«область видимости переменных»''' (в оригинале – '''«scope»''') из сообщении об ошибке выше... Это фраза обозначает часть скетча, в которой можно использовать нашу переменную. Это определяется тем, где мы ее объявили. К примеру, если вы хотите использовать переменную в любом месте, ее нужно объявить в самой верхней части скетча. Такая переменная называется '''«глобальной»'''. Вот пример... | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
int pin = 13; | int pin = 13; | ||
Строка 63: | Строка 63: | ||
Как видите, переменная '''pin''' используется и в блоке [[Arduino:Справочник языка Arduino/setup()|setup()]], и в блоке [[Arduino:Справочник языка Arduino/loop()|loop()]]. Оба блока отсылают к одной и той же переменной, поэтому если поменять ее в одной функции, это изменит ее и в другой. Как здесь... | Как видите, переменная '''pin''' используется и в блоке [[Arduino:Справочник языка Arduino/setup()|setup()]], и в блоке [[Arduino:Справочник языка Arduino/loop()|loop()]]. Оба блока отсылают к одной и той же переменной, поэтому если поменять ее в одной функции, это изменит ее и в другой. Как здесь... | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
int pin = 13; | int pin = 13; | ||
void setup() | void setup() | ||
Строка 83: | Строка 83: | ||
Например.... | Например.... | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
void setup() | void setup() | ||
{ | { | ||
Строка 94: | Строка 94: | ||
В данном случае переменную '''pin''' можно использовать только в блоке [[Arduino:Справочник языка Arduino/setup()|setup()]]. Если вы попытаетесь сделать так... | В данном случае переменную '''pin''' можно использовать только в блоке [[Arduino:Справочник языка Arduino/setup()|setup()]]. Если вы попытаетесь сделать так... | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
void loop() | void loop() | ||
{ | { |
Версия от 18:17, 14 мая 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Переменные[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) типы присваиваются значениям, а не названиям переменных, и вы, к тому же, можете присвоить переменной значения любого типа. Это называется «динамической типизацией».