Перейти к содержанию
    

как писать на С в 2016 году

А где тут интересные моменты? Всегда считал данный ресурс местом сбора закомплексованных веб-дезигнеров разного пошиба,почему-то мнящих себя элитным сообществом(и разумеется таковым не являющимся), но весьма желающим быть генератором трендов в области языков/методологий программирования - почти что кузницей истин. Получается это у них подчеркнуто мерзко- в этом смысле по убогости с такими постами могут конкурировать разве что DIY проекты и печатные платы с гиктаймса. Особенно веселят персонажи предрекающие скорую гибель языкам группы C и тыкающие везде своими поделиями имеющими в названии слово java- ну а что с низ взять, с элитных веб-дезигнеров? :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Быдлохабра сейчас еще хуже стала, потому что интересные вещи, которые там когда-то можно было найти (как рисинку в ведре с дерьмом), перекочевали на какой-то "гиктаймс". А БХ теперь — тупо сборище поганой безмозглой вантузячьей школоты.

По делу: С — он и в Африке С. И писать на нем точно так же, как 30 лет назад. Ничего не изменилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

прочитал интересную статью. решил поделиться.

https://habrahabr.ru/company/inoventica/blog/275685/

 

Это компьютерный С-и , а встраиваемый С-и он совсем другой.

Для него больше половины что там написано либо не действительно, либо все делается наоборот.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну лично для меня много интересных моментов которые я знал и раньше но тут о них заявляют категорическим образом.

Мы НЕ делаем так:
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};

мелочь а приятно. буду править сорцы. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Jenya7, не надо на этот бред внимания обращать, потому как даже фишки C99 не везде реализованы. Скажем, в том же sdcc объявлять переменные обязательно в самом начале функции.

Да и вообще, как правильно заметили выше, в embedded очень многое отличается от "компутерного" С.

И да, учитывая то, во что скатилась быдлохабра, категорически не рекомендую в этот рассадник вообще заходить. А то скатитесь до "одноклассников"…

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Быдлохабра сейчас еще хуже стала, потому что интересные вещи, которые там когда-то можно было найти (как рисинку в ведре с дерьмом), перекочевали на какой-то "гиктаймс". А БХ теперь — тупо сборище поганой безмозглой вантузячьей школоты.

По делу: С — он и в Африке С. И писать на нем точно так же, как 30 лет назад. Ничего не изменилось.

 

и

 

Это компьютерный С-и , а встраиваемый С-и он совсем другой.

Для него больше половины что там написано либо не действительно, либо все делается наоборот.

 

Всецело поддерживаю- тамошний контингент всерьез считает что мир ограничен веб дизайном и клепанием игрушек на мобильные платформы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мелочь а приятно. буду править сорцы. :)

Бред полный. В первом примере бессмысленное говно в обеих случаях. Во втором инициализация через memset() и инициализация при объявлении локальной структуры ОТЛИЧАЮТСЯ.

Для достижения одинакового результата должно быть

struct thing localThing = {0,0};

"Советчики" :(

Да, и объявление структуры без типа, как в "примере" это как и водка без пива - деньги на ветер :).

Да, статью по ссылке не читал и не буду - хватило "примеров".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот если совсем коротко - в 2016 году надо писать на C++.

 

А в остальном - есть отдельные спорные моменты, но в целом со статьей можно согласиться. И да, практически все это применимо и в плюсах. Где там AlexandrY нашел "больше половины делается наоборот" я не знаю. Было бы интересно узнать, что же я делаю наоборот.

 

Для достижения одинакового результата должно быть

struct thing localThing = {0,0};

Забавно. В чем разница? Насколько помню, стандарт гарантирует инициализацию нулем неуказанных явно членов структуры. То есть достаточно было написать struct thing localThing = {};, а уж {0,0} - это совсем "масло масляное масляное" ;)

 

 

Скажем, в том же sdcc объявлять переменные обязательно в самом начале функции.
Забавно. Призывать не использовать возможности, появившиеся в языке 16 лет назад, потому что какой-то sdcc их до сих пор не умеет. Гораздо правильнее в этом случае завязывать с пиками и выкидывать этот sdcc.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Забавно. В чем разница? Насколько помню, стандарт гарантирует инициализацию нулем неуказанных явно членов структуры.

Локально, как в этом примере, создаваемых переменных и структур тоже???

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

прочитал интересную статью. решил поделиться.

если хочется свеженького, то просто читайте новые возможности. к примеру отличия C99 и C11. Там уже много интересного и с правильными примерами.

С правильными потому, что

void initThing(void) {

memset(&localThing, 0, sizeof(localThing));

}

подразумевать, что это именно инициализация - неправильно. Это очистка. Для этого "программиста" - это может и "Классическая ошибка".

 

uint32_t b = input;

объявление в месте использования. это было в C++. Названо модненько lazy-чёто-там. Вся эта моднота бесит... Это просто объявление в месте использования, как "for(uint32_t i..."

 

Решил быть не таким категоричным как zltigo и пошёл по ссылке. Первые абзацы

Обычно вам подходит -O2, но иногда нужен -O3.Протестируйте оба варианта

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Локально, как в этом примере, создаваемых переменных и структур тоже???
А какая им разница? Если указано ={} то будут проинициализированны все элементы. Нулем. Даже неуказанные. Поэтому {0} уже избыточно, а {0, 0} - тем более. Я так себе понимаю. Или я не прав, и разница между ={0} и = {0, 0} все же есть? Тогда расскажите, какая.

 

Хотя... видимо был не прав. В случае {} компилятор ругается на неинициализированное поле. А вот в случае {0} ругани нет и обнуляются все поля. Так в чем же отличие {0} от {0, 0}, "критики"? :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какая им разница? Если указано ={} то будут проинициализированны все элементы. Нулем. Даже неуказанные.

Для начала IAR находящийся под руками такое не скушал. GCC съел;

Поэтому {0} уже избыточно, а {0, 0} - тем более. Я так себе понимаю. Или я не прав, и разница между ={0} и = {0, 0} все же есть? Тогда расскажите, какая.

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

Попытался написать суперпрограммку для тестирования инициализации. Не удалось :). Если что-то простое, то инициализации просто нет НИ В КАКОМ ВАРИАНТЕ, но можно заставить подсовывать компилятор 0, как некое возвращаемое значение из структуры, но можно заставить и мусор! Причем очень просто - объявляем неинициализируя стуктуру. При попытке возвратить какой-либо элемент - получаем законную ругань. Теперь присваиваем ( через =, в не при обьявлении) любому элементу какое-либо значение, возвращаем ДРУГОЙ и получаем дивный эффект - функция превращается в один возврат. То есть возвращаемое значение абсолютно произвольно, что собственно и написали :)

В общем дело темное, быстро не проверишь :(. На подкорку записал, может в выходные займусь изобретеним тестовой программки.

 

P.S.

Изобрел таки :)

В общем ситуация такова. При инициализации хоть одного элемента стуктуры компилятор ТУПО вызывает тот-же memset() на всяю структуру. При попытке проинициализировать хоть один элемент НЕ нулем, получается memcpy() всей стуктуры из ROM. Но "неициализированные" элементы при этом таки да - нули.

В общем вывод - если когда-то захочется проинициализировать только отдельные элементы локальной стуктуры, то нефиг пользоваться "автоматической" инициализацией - тупая она :( - жрет и ресурсы ROM и время.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пожалуйста, не надо такого.

особенно в разделе для начинающих.

не надо портить тех, кому суждено стать эмбеддерами, - подобной шелухой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не надо портить тех, кому суждено стать эмбеддерами, - подобной шелухой.

Вы не путаете эмбеддеров с Web программистами???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...