Как изменить правила применения define препроцессора ?
- Войдите на сайт для отправки комментариев
Втр, 19/10/2021 - 13:37
По умолчанию #define не долно начинаться на цифру, а также, как оказалось ругается, если первой стоит русская буква.
Можно как-то изменить правила ?
Собственно хочется заставить работать вот это:
#define А \x80 // А - русская
Arduino: 1.8.16 (Windows 7), Плата:"Arduino Due (Programming Port)"
defines.h:112:9: error: macro names must be identifiers
exit status 1
macro names must be identifiers
Можно как-то изменить правила ?
нет
Дурацкий вопрос можно? Нахуа?
Дурацкий вопрос можно? Нахуа?
ну как нахуа? что бы писать МАМА. а не набивать это кодами :)
Правда это решается проще - выбором правильной кодировки в ИДЕ
Ясно. Извиняюсь, протупил! Я еще просто не дорос до задач такого уровня :)
Собственно хочется заставить работать вот это:
То есть, если бы даже ТС сумел заставить пропроцессор зарегистрировать макрос из русской буквы "А" - в слове "МАМА" эта подстановка все равно бы не сработала
Вы имеете в виду, что нельзя было бы написать слово ?
Можно, я пробовал.
Выводит 01 - 23
Правда это решается проще - выбором правильной кодировки в ИДЕ
А как это сделать ?
кстати, кроме проблемы с русскими буквами, тут есть другая - правила макроподстановки написаны так, что заменяют только отдельные идентификаторы, не затрагивая те случаи, когда макрос является частью другого слова.
Вы правы. Макрос не работает, если подстановка это часть чего-то :(
Вы правы. Макрос не работает, если подстановка это часть чего-то :(
если подумать, это не ":(", а вовсе даже ":)"
Иначе задали бы вы макрос
а он бы вам в digitalRead() букву поменял :)
Такое было возможно в старых версиях GCC. Потом исчезло из-за ошибки. Ошибка исправлена в GCC версии 10
Так что либо ждите пока разработчики IDE поставят 10-ку, либо ставьте её сами.
Кстати, присоединяюсь к вопросу из #2
Изменение кодировки IDE даст нам возможность выводить русский текст в Serial, но не на LCD :(
Такое было возможно в старых версиях GCC
вы имеете в виду "русские" символы?
Изменение кодировки IDE даст нам возможность выводить русский текст в Serial, но не на LCD :(
почему? Какая разница?
а он бы вам в digitalRead() букву поменял :)
Ну я собирался менять только русские буквы, о они в С++ не используются :)
Изменение кодировки IDE даст нам возможность выводить русский текст в Serial, но не на LCD :(
почему? Какая разница?
Потому что LCD пофиг, какая там кодировка у IDE. Он выводит символы из своих шрифтов.
Такое было возможно в старых версиях GCC
вы имеете в виду "русские" символы?
Не только русские. Использование UTF-8 в идентификаторах.
Потому что LCD пофиг, какая там кодировка у IDE. Он выводит символы из своих шрифтов.
У LCD нет никаких шрифтов. Он выводит то, что Вы ему подсунете программно.
Такое было возможно в старых версиях GCC
вы имеете в виду "русские" символы?
Не только русские. Использование UTF-8 в идентификаторах.
Ну поскольку идентификатор должен быть целым, а не частью строки, то это не актуально :(
Потому что LCD пофиг, какая там кодировка у IDE. Он выводит символы из своих шрифтов.
У LCD нет никаких шрифтов. Он выводит то, что Вы ему подсунете программно.
Я имел ввиду те шрифты, которые мы ему подсовываем программно :)
Потому что LCD пофиг, какая там кодировка у IDE. Он выводит символы из своих шрифтов.
напишите свою функцию recode(). которая будет принимать слово "МАМА" в UTF. а на выходе выдавать строчку из шестнадцатиричных кодов.
И потом вызывайте вот так:
Не, лучше я библиотеку UTFT перепишу. Собственно ДОперепишу, ибо она уже и так сильно переписана.
напишите свою функцию recode().
Вот, не любите Вы ООП :-(
Да, ООП это сила, но и ресурсы жрет хорошо :(
ресурсы жрет хорошо :(
Чойта?
Да, ООП это сила, но и ресурсы жрет хорошо :(
Ну приехали теперь.
Потому что когда пишешь свой класс, то стараешься его сделать универсальным, "на все случаи жизни".
В результате в классе куча case, if ... else и т.п., которые в 70% случаев не используются.
Изначальный файл UTFT.cpp весит 27,8 кб
Урезанная (и несколько расширенная) библиотека с теми же (и еще ++) функциями но для ОДНОГО определенного контроллера (SSD1963) и ОДНОГО экрана весит 19,5 кб. И можно еще почистить.
Написание классов более удобно для программиста, чем дает какой-либо эффект (при условии, что у Вас создается ОДИН объект класса).
В частности дисплей в 99% случаев один :)
Потому что когда пишешь свой класс, то стараешься его сделать универсальным, "на все случаи жизни".
В результате в классе куча case, if ... else и т.п., которые в 70% случаев не используются.
поэтому надо писать не через if case, а через условную компиляцию и шаблоны
Урезанная (и несколько расширенная) библиотека с теми же (и еще ++) функциями но для ОДНОГО определенного контроллера (SSD1963) и ОДНОГО экрана весит 19,5 кб. И можно еще почистить.
с каких это пор размер ИСХОДНИКА стал указывать на размер обьектного кода? Вы в курсе про оптимизацию? Компилятор сам выкинет неиспользуемые функции
Потому что когда пишешь свой класс, то стараешься его сделать универсальным, "на все случаи жизни".
В результате в классе куча case, if ... else и т.п., которые в 70% случаев не используются.
Если руки из %опы, не нужно винить ООП. Если даже компилятор (а он очень умный) не может сделать твой код компактным, стоит задуматься о вечном..
Да, ООП это сила, но и ресурсы жрет хорошо :(
Если готовить не умеешь, то даже рис сварить сложно. Либо деревянный будет, либо размазня. Вот и с ООП тоже самое. Чаще всего размер кода вообще никак не изменяется, а еще чаще - оптимизатор сделает лучше человека-погромиста. ;))
Есть в позднем ООП всякие инструменты, порождающие большой код, но это не касается МК.
Компилятор сам выкинет неиспользуемые функции
Дааа..
Ну и как компилятор отсюда:
что-то выкинет ? :)
А у меня ОДНА модель дисплея. Мне не нужны массивы dtx,dty,dtm. Мне не нужны переменные display_transfer_mode и display_model и связанные с ними if...else. Мне не нужны остальные if...else в зависимости от ориентации дисплея.
Если все это убрать, то:
Если все это писать на директивах препроцессора, то там сам черт голову сломает :)
Я не против ООП, всю жизнь пишу на Delphi.
Но оно не всегда благо :)
Что из этого относится к ООП?
И Delphi - не язык программирования.
Если все это убрать, то:
это вы идете по гнилому пути Гайвера. Он тоже очень любит системные библиотеки переписывать, создавая "мини_" версии, выкидывая оттуда то, что по его мнению, лишнее. А потом юзеры не могут понять, почему у одного библиотека работает, а у другого, казалось бы в том же скетче - нет.
Юзер, если хочет, может использовать и системную библиотеку, но она будет медленнее работать.
Я пишу для своих проектов и к тому-же всегда можно четко указать, для какого дисплея с каким контроллером эта библиотека :)
Кстати юзеры чаще ищут библиотеку, которая будет четко работать с конкретно ИХ дисплеем, а то, что она поддерживает еще два десятка других их мало волнует. А потом вопросы "А почему в библиотеке есть функция регулировки яркости, а у меня она не работает ?"
Да потому что она работает только на НЕКОТОРЫХ контроллерах, а библиотека для ВСЕХ.
Класс UTFT разве не ООП ?
Ну хорошо, на Объектно-Ориентированном Паскале :)
Что из этого относится к ООП?
И Delphi - не язык программирования.
Ответил выше :)
Ответил выше :)
Отлично! Напишите аналогичный функционал для всего зоопарка устройств на процедурном С без использования ООП и приведите для сравнения размер скомпилированного кода. Заранее спасибо
Или еще проще, напиши маленький класс "hello world" и сравни с обычным Serial.println("Hello world")
А зачем мне это ? :) И это вообще не нужно. Вот сейчас я буду переписывать библиотеку soft_uart, потому что там SoftSerial создается не как класс, а мне нужен именно объект SoftSerial для дальнейшего использования.
Если Вы перепишите ту-же UTFT, в отдельности для разных контроллеров и дисплеев в разном сочетании, то суммарный размер кода будет в тысячу раз больше. Речь не о том.
Или Вы считаете, что иметь в программе не нужный код это высший класс программирования ?
Эта функция вызывается, значит компилятор ее включит в общий код, только вот в ней НЕТ моего контроллера.
Такое было возможно в старых версиях GCC. Потом исчезло из-за ошибки. Ошибка исправлена в GCC версии 10
Так что либо ждите пока разработчики IDE поставят 10-ку, либо ставьте её сами.
Наблюдал подобное в дружественном семействе.) Типа:
#define FCPU 8MHZ
#define MHZ *1000000
Эта функция вызывается, значит компилятор ее включит в общий код, только вот в ней НЕТ моего контроллера.
это снова к вопросу о правильном программировании. Если display_model описана как константа и не равна ни одному из вариантов case - оптимизатор выкинет из кода все между двумя операторами sbi
о пользе использования const
ресурсы жрет хорошо :(
Это если готовить не уметь.
Изначальный файл UTFT.cpp весит 27,8 кб
Урезанная (и несколько расширенная) библиотека с теми же (и еще ++) функциями но для ОДНОГО определенного контроллера (SSD1963) и ОДНОГО экрана весит 19,5 кб. И можно еще почистить.
Вот-вот, тот самый случай.
Класс UTFT разве не ООП ?
Нет!
Само по себе пихание слова class куда ни попадя - ни грамма не ООП. ООП - это архитектура программы, а не язык и не ключевые слова. В парадигме ООП можно писать и там, где никаких классов отродясь не было (хоть на ассемблере).
Я к тому, что процедурное программирование не имеет при прочих равных преимущества перед ООП по размеру кода. В большинстве случаев существенно проигрывает.
Нет!
Само по себе пихание слова class куда ни попадя - ни грамма не ООП. ООП - это архитектура программы, а не язык и не ключевые слова. В парадигме ООП можно писать и там, где никаких классов отродясь не было (хоть на ассемблере).
Расшифруйте мне словосочетание ООП :)
И как можно писать на ООП если нет объектов ?
Вы можете создать объект без класса ? Приведите пример.
это снова к вопросу о правильном программировании. Если display_model описана как константа и не равна ни одному из вариантов case - оптимизатор выкинет из кода все между двумя операторами sbi
о пользе использования const
Да, но она то описана как переменная.
Те-же пины дисплея, они что меняются во время работы программы ? Зачем их делать переменными ?
#define RS ..
#define WR ..
и никаких переменных.
#define RS ..
#define WR ..
и никаких переменных.
за #define в библиотеках лично я бы руки отрубал. Жалко тебе 1-4 байта на переменную? Нет, пусть потом пользователи при отладке потрахаются
Те-же пины дисплея, они что меняются во время работы программы ? Зачем их делать переменными ?
вот именно, они должны быть константами, с классификатором const
использование #define давно уже не рекомендовано в стандарте, у дефайнов очень много минусов
Расшифруйте мне словосочетание ООП :)
В словарь загляните.
И как можно писать на ООП если нет объектов ?
Никак.
Вы можете создать объект без класса ?
Кончено, могу.
Приведите пример.
Возьмите любую сколько-нибудь нетривиальную программу на первых версиях ECMAScript. Классов нет в природе, а объектов и наследуемых (в т.ч. и множественно), и полиморфных, и каких угодно ...
Почитайте вот это. Я там со многим не согласен и поспорил бы, но суть подхода - это как раз то, что я пытаюсь Вам сказать.