В чем отличие при объявлении pin'а?
- Войдите на сайт для отправки комментариев
Чт, 07/05/2015 - 20:20
Всем привет.
Господа, разъясните новичку следующий вопрос:
Могу pin 5 объявить через #define:
#define LED_PIN 5 void setup() { pinMode(LED_PIN, HIGH); } void loop() { бла-бла-бла }
а могу через константу:
const int ledPin = 13; void setup() { pinMode(ledPin, HIGH); } void loop() { бла-бла-бла }
в чем принципиальное различие? И как правильно?
Вопрос философский, IMHO.
Код, генерируемый компилятором для данного примера кода одинаковый для обоих вариантов. Номер пина подставляется как константа в обоих случаях.
По-большому счету для C++ define использовать нежелательно, хотя и никто особо не запрещает.
Впрочем может кто-нибудь объяснит это более точно с точки зрения стандартов.
Лично я использую оба варианта.
Если по простому :)
#define LED_PIN 5
Везде где встречается в тексте LED_PIN, компилятор будет вставлять 5.
const
int
ledPin = 13;
Компилятор выделит память и запишет туда 13. Потом можно будет читать из этой ячейки.
Потом можно будет читать из этой ячейки.
А в каком случае это может пригодиться? Тоже по простому :)
Для экономии памяти.
Если по простому, то это в дальнейшем позволяет быстро заменить номер пина без поиска всех мест где он используется.
Экономии памяти здесь нет.
Это то понятно, и это относится к обеим формам записи.
В каком случае может пригодится чтение из ячейки памяти, в которую записана константа с номером пина?
мне лично пины больше через define нравится объявлять по нескольким причинам
1. в 1 варианте нельзя поменять значение led таким образом led=9, а во втором варианте легко
2. 2 вариант для объявления переменных, и можно случайно перепутать переменную с пином "константой". можно конечно через const объявить. но все же лучше отличать. так как через const также объявляются константы. а тут и то и другое константы. каша короче
Ассемблерный код для варианта #define
Аналогично для варианта const:
Найдите здесь чтение из ячейки памяти.
Поскольку Ваш вопрос я не понял, могу сказать, только то, что const int - это не переменная, а константа и разница в этом есть, константа или переменная. Константы могут располагаться в памяти (как решит компилятор/оптимизатор), но чаще оптимальней подставить их прямо в код, нежели читать откуда то.
А вот переменные, как правило (но не всегда), могут занимать место в памяти.
:)) Какой ассемблер? У меня и без него голова кипит.
Ну Вы в состоянии посмотреть, даже не понимая, что текст идентичен.
Могу сказать, что здесь нет чтения, две загрузки констант в регистры и вызов pinMode. Всё.
С дефайнами имхо код читабельнее: константы в раделе дефайн, а переменные в разделе инициализации.
Я вот тоже столкнулся с такой проблемой. Очень большая разница между использованием #define и const
Совершенно непонятно почему этот код не работает:
в таком виде он работает очень странно (даже если вручную вместо trigPin и echoPin по тексту вписать 11 и 12 соответственно), дистанцию или ноль показывает или неверно (завышенно раз в 10),
а вот если написать const int trigPin = 11; const int echoPin = 12; все работает четко, интересно, что при этом длина скомпилированного кода одинаковая, отличаются только несколько байтов
кто может пояснить почему?
У меня все скомпилировалось в 1.8.8
Была ошибка в коде. Сорри
#define trigPin 12
#define echoPin 11
//const int trigPin = 11;
//const int echoPin = 12;
перепутаны номера пинов.
А я подумал не компилируется))