Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3709639#p3709639"]У меня складывается ощущение, что многие просто не понимают, что такое полиморфизм.[/uquote]
У меня не просто ощущение, я на все 100% уверен, что некоторые не понимают даже что такое синтаксический сахар :)
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Reflector, тоже поделюсь ссылкой на статью в Вики.
Даже процитирую определение оттуда:
Под «синтаксическим сахаром» понимается любой имеющийся в языке программирования синтаксический элемент, механизм, способ описания, который дублирует другой, имеющийся в языке элемент или механизм, но является более удобным в использовании, или более краток, или выглядит естественнее, или более привычен (похож на аналогичные элементы других языков), или просто лучше воспринимается при чтении программы человеком. Принципиально то, что синтаксический сахар, теоретически, всегда можно удалить из языка без потери его возможностей — всё, что можно написать с применением синтаксического сахара, может быть написано на этом же языке и без него. Таким образом, синтаксический сахар предназначен лишь для того, чтобы сделать более удобным для программиста написание программы.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18790
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

в таком случае, всё, кроме оператора if и goto, является синтаксическим сахаром, ибо любой алгоритм реализуется в этом базисе операторов (не считая операторов элементарной арифметики и присваивания).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

ARV, а Вы не знали? В той же статье, на которую я давал ссылку, даже пример есть:
Например, в языке C и его потомках имеются операторы увеличения и уменьшения (++, --, +=, -= и т. п.). Введение этих операторов в язык было вызвано необходимостью поддержки ручной оптимизации программ, так как код с их использованием мог транслироваться в более эффективные машинные команды («++a» транслировалось в одну команду INC, а аналогичное выражение «a=a+1» — в целую группу команд). Развитие технологии оптимизации кода сделало подобную ручную оптимизацию бессмысленной; сейчас компиляторы порождают одинаковый код для «длинного» и «короткого» варианта операции. В результате сокращённые операторы превратились в синтаксический сахар, хотя изначально им не были.
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18790
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

ARV, но тогда почему плюсанули сообщение Reflector? Ведь он, получается, бросил камень, в том числе, и в Ваш огород?
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18790
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Мне правда глаз не колет :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7383
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Подскажите как красиво сделать такую вещь. Есть тип направление:

Код: Выделить всё

typedef enum {
    north = 0,
    east = 1, 
    south =2,
    west =3}
И вот нужно вычислить его изменение приповороте направо или на лево.
Если в цифрах то направо (x +1) & 0x03, налево, соответственно, (x-1) &0x03. Но компилятор ругается на смешивание типов. Как это сделать красиво?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18790
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

x++ или x-- ?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="uldemir",url="/forum/viewtopic.php?p=3711136#p3711136"]Как это сделать красиво?[/uquote]Надо делать не красиво, а правильно. Явное приведение типов делать надо. Ты же не просто ради дефайна констант enum применил, правда?

[uquote="ARV",url="/forum/viewtopic.php?p=3711137#p3711137"]x++ или x-- ?[/uquote]Кхм, не будет так работать. Зато красиво то как :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

uldemir, а вам обязательно enum? Просто объявите направление движения типом int (скажем, int8_t), задефайните основные направления, а после каждой процедуры изменения делайте проверку вроде

Код: Выделить всё

int rotate(int olddir, int angle){
  olddir += angle;
  olddir %= 4;
  if(olddir < 0) olddir += 4;
  return olddir;
}
Вот и все!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3711208#p3711208"]задефайните основные направления,[/uquote]Ну он это и сделал enum-ом.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3711253#p3711253"][uquote="Eddy_Em",url="/forum/viewtopic.php?p=3711208#p3711208"]задефайните основные направления,[/uquote]Ну он это и сделал enum-ом.[/uquote]
Ну так UB же! В общем случае нельзя enum'ом, если значение за пределы enum'а может выходить — мало ли какой компилятор попадется... Надежней дефайнами.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Надёжней enum class.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Кресты надежней С? Не надо смешить мои тапочки!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Eddy_Em, так красивей:

Код: Выделить всё

#define DIRECTION_NORD 0
#define DIRECTION_EAST 1
#define DIRECTION_SOUTH 2
#define DIRECTION_WEST 3

typedef struct directions_st {
  uint8_t direction:2;
} directions_t;

directions_t rotate(directions_t dir, int8_t  angle){
  dir.direction+=angle;
  return dir;
}
или даже без функции

Код: Выделить всё

#define DIRECTION_NORD 0
#define DIRECTION_EAST 1
#define DIRECTION_SOUTH 2
#define DIRECTION_WEST 3

#define DIRECTION_STEP_LEFT(d) d.direction--
#define DIRECTION_STEP_RIGHT(d) d.direction++

typedef struct directions_st {
  uint8_t direction:2;
} directions_t;
Последний раз редактировалось ПростоНуб Ср окт 02, 2019 11:40:21, всего редактировалось 1 раз.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3711320#p3711320"]Кресты надежней С? Не надо смешить мои тапочки![/uquote]Да ты хоть почитай что это, а потом лужи газируй.

Зачем тут слово typedef? Красивое?
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

ПростоНуб, в данном случае - да. Красивое решение. Разве что неудобно, что переменной постоянно нужно еще и поле .direction дописывать... Зато проверка на выход за пределы диапазона автоматом...
VladislavS, сам знаешь, зачем нужен typedef! Не выпендривайся!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3711320#p3711320"]Кресты надежней С? Не надо смешить мои тапочки![/uquote]
На С можно написать:

Код: Выделить всё

typedef enum { north, east, south, west } Dir;

Dir dir = 555;
dir /= 111;
И это замечательно работает, на gcc c "-Wall -Wextra" даже предупреждения не выдает. Странно, что тебе это кажется нормой учитывая, что тут якобы есть UB :)
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Eddy_Em, для 4 значений (степень двойки) работать будет, для произвольного числа уже нет. Да и битовые поля это не совсем стандарт. Но вообще, да, выглядит красивее, чем деление с остатком.

Reflector, -Werror:

Код: Выделить всё

arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb   -DUSE_FULL_LL_DRIVER -DSTM32F103xB -D_STM32F1 -D_ILI9341 -D_DISP_SPI -D_DISP_320x240 -D_TDA7439 -D_TDA731X -D_PT232X -D_TDA7418 -D_RDA580X -D_SI470X -D_TEA5767 -Idisplay -Iusb -Idrivers/STM32F1xx_HAL_Driver/Inc -Idrivers/STM32_USB_Device_Library/Core/Inc -Idrivers/CMSIS/Device/ST/STM32F1xx/Include -Idrivers/CMSIS/Include -Isystem -Os -fshort-enums -ffunction-sections -fdata-sections -ffreestanding -Wall -Werror -g -gdwarf-2 -MMD -MP -MT build/main.o -MF build/./main.d -DUSE_FULL_LL_DRIVER -DSTM32F103xB -D_STM32F1 -D_ILI9341 -D_DISP_SPI -D_DISP_320x240 -D_TDA7439 -D_TDA731X -D_PT232X -D_TDA7418 -D_RDA580X -D_SI470X -D_TEA5767 -o build/main.o main.c
main.c: In function 'main':
main.c:112:15: error: unsigned conversion from 'int' to 'Dir' {aka 'enum <anonymous>'} changes value from '555' to '43' [-Werror=overflow]
     Dir dir = 555;
               ^~~
cc1: all warnings being treated as errors
P.S. c -Wextra без -Werror компилирует, но с предупреждениями.
Последний раз редактировалось WiseLord Ср окт 02, 2019 11:52:10, всего редактировалось 1 раз.
Контактная информация:
Ответить

Вернуться в «Разные вопросы по МК»