|
|
  |
как писать на С в 2016 году |
|
|
|
Jan 25 2016, 15:42
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
ну лично для меня много интересных моментов которые я знал и раньше но тут о них заявляют категорическим образом. Код Мы НЕ делаем так: void test(uint8_t input) { uint32_t b; if (input > 3) { return; } b = input; }
Вместо этого пишем следующим образом: void test(uint8_t input) { if (input > 3) { return; } uint32_t b = input; } или Код Классическая ошибка: struct thing { uint64_t index; uint32_t counter; }; struct thing localThing; void initThing(void) { memset(&localThing, 0, sizeof(localThing)); }
Корректно: struct thing { uint64_t index; uint32_t counter; }; struct thing localThing = {0}; мелочь а приятно. буду править сорцы.
|
|
|
|
|
Jan 25 2016, 15:53
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Jenya7, не надо на этот бред внимания обращать, потому как даже фишки C99 не везде реализованы. Скажем, в том же sdcc объявлять переменные обязательно в самом начале функции. Да и вообще, как правильно заметили выше, в embedded очень многое отличается от "компутерного" С. И да, учитывая то, во что скатилась быдлохабра, категорически не рекомендую в этот рассадник вообще заходить. А то скатитесь до "одноклассников"…
|
|
|
|
|
Jan 25 2016, 15:54
|

ядовитый комментатор
     
Группа: Свой
Сообщений: 2 765
Регистрация: 25-06-11
Пользователь №: 65 887

|
Цитата Быдлохабра сейчас еще хуже стала, потому что интересные вещи, которые там когда-то можно было найти (как рисинку в ведре с дерьмом), перекочевали на какой-то "гиктаймс". А БХ теперь — тупо сборище поганой безмозглой вантузячьей школоты. По делу: С — он и в Африке С. И писать на нем точно так же, как 30 лет назад. Ничего не изменилось. и Цитата Это компьютерный С-и , а встраиваемый С-и он совсем другой. Для него больше половины что там написано либо не действительно, либо все делается наоборот. Всецело поддерживаю- тамошний контингент всерьез считает что мир ограничен веб дизайном и клепанием игрушек на мобильные платформы.
|
|
|
|
|
Jan 25 2016, 15:55
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Jenya7 @ Jan 25 2016, 17:42)  мелочь а приятно. буду править сорцы.  Бред полный. В первом примере бессмысленное говно в обеих случаях. Во втором инициализация через memset() и инициализация при объявлении локальной структуры ОТЛИЧАЮТСЯ. Для достижения одинакового результата должно быть struct thing localThing = {0,0}; "Советчики"  Да, и объявление структуры без типа, как в "примере" это как и водка без пива - деньги на ветер  . Да, статью по ссылке не читал и не буду - хватило "примеров".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 25 2016, 16:17
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Вот если совсем коротко - в 2016 году надо писать на C++. А в остальном - есть отдельные спорные моменты, но в целом со статьей можно согласиться. И да, практически все это применимо и в плюсах. Где там AlexandrY нашел "больше половины делается наоборот" я не знаю. Было бы интересно узнать, что же я делаю наоборот. Цитата(zltigo @ Jan 25 2016, 17:55)  Для достижения одинакового результата должно быть struct thing localThing = {0,0}; Забавно. В чем разница? Насколько помню, стандарт гарантирует инициализацию нулем неуказанных явно членов структуры. То есть достаточно было написать struct thing localThing = {};, а уж {0,0} - это совсем "масло масляное масляное"  Цитата(Эдди @ Jan 25 2016, 17:53)  Скажем, в том же sdcc объявлять переменные обязательно в самом начале функции. Забавно. Призывать не использовать возможности, появившиеся в языке 16 лет назад, потому что какой-то sdcc их до сих пор не умеет. Гораздо правильнее в этом случае завязывать с пиками и выкидывать этот sdcc.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 25 2016, 16:18
|

Профессионал
    
Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718

|
Цитата прочитал интересную статью. решил поделиться. если хочется свеженького, то просто читайте новые возможности. к примеру отличия C99 и C11. Там уже много интересного и с правильными примерами. С правильными потому, что Цитата void initThing(void) { memset(&localThing, 0, sizeof(localThing)); } подразумевать, что это именно инициализация - неправильно. Это очистка. Для этого "программиста" - это может и "Классическая ошибка". Цитата uint32_t b = input; объявление в месте использования. это было в C++. Названо модненько lazy-чёто-там. Вся эта моднота бесит... Это просто объявление в месте использования, как "for(uint32_t i..." Решил быть не таким категоричным как zltigo и пошёл по ссылке. Первые абзацы Цитата Обычно вам подходит -O2, но иногда нужен -O3.Протестируйте оба варианта досвидос, хабр из моднявки превратился в помойку. собсно это обычный эволюционный путь.
|
|
|
|
|
Jan 25 2016, 16:22
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(zltigo @ Jan 25 2016, 18:17)  Локально, как в этом примере, создаваемых переменных и структур тоже??? А какая им разница? Если указано ={} то будут проинициализированны все элементы. Нулем. Даже неуказанные. Поэтому {0} уже избыточно, а {0, 0} - тем более. Я так себе понимаю. Или я не прав, и разница между ={0} и = {0, 0} все же есть? Тогда расскажите, какая. Хотя... видимо был не прав. В случае {} компилятор ругается на неинициализированное поле. А вот в случае {0} ругани нет и обнуляются все поля. Так в чем же отличие {0} от {0, 0}, "критики"?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 25 2016, 17:01
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Сергей Борщ @ Jan 25 2016, 18:22)  А какая им разница? Если указано ={} то будут проинициализированны все элементы. Нулем. Даже неуказанные. Для начала IAR находящийся под руками такое не скушал. GCC съел; QUOTE Поэтому {0} уже избыточно, а {0, 0} - тем более. Я так себе понимаю. Или я не прав, и разница между ={0} и = {0, 0} все же есть? Тогда расскажите, какая. По логике вещей, для локальной стуктуры, котрая в отличие от статической глобальной не инициализируется, инициализируются только те члены, которые указали. Остальные, как и положено - мусор. Попытался написать суперпрограммку для тестирования инициализации. Не удалось  . Если что-то простое, то инициализации просто нет НИ В КАКОМ ВАРИАНТЕ, но можно заставить подсовывать компилятор 0, как некое возвращаемое значение из структуры, но можно заставить и мусор! Причем очень просто - объявляем неинициализируя стуктуру. При попытке возвратить какой-либо элемент - получаем законную ругань. Теперь присваиваем ( через =, в не при обьявлении) любому элементу какое-либо значение, возвращаем ДРУГОЙ и получаем дивный эффект - функция превращается в один возврат. То есть возвращаемое значение абсолютно произвольно, что собственно и написали  В общем дело темное, быстро не проверишь  . На подкорку записал, может в выходные займусь изобретеним тестовой программки. P.S. Изобрел таки  В общем ситуация такова. При инициализации хоть одного элемента стуктуры компилятор ТУПО вызывает тот-же memset() на всяю структуру. При попытке проинициализировать хоть один элемент НЕ нулем, получается memcpy() всей стуктуры из ROM. Но "неициализированные" элементы при этом таки да - нули. В общем вывод - если когда-то захочется проинициализировать только отдельные элементы локальной стуктуры, то нефиг пользоваться "автоматической" инициализацией - тупая она  - жрет и ресурсы ROM и время.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|