40

Как прокачаться в Си

Давольно давно прогаю микроконтроллеры на Си, и проблем не испытываю. При этом используется не так много команд, чтоб подрыгать ногами и просчитать тайминги высшей математики и прочего не надо. Решил попробовать решать задачки на CodeWars и понял, что в Си я не волоку ну вообще никак. Лекции Хирьянова смотрел, SimpleCode, Степики всякие бесплатные прорешал, всё это не то. Отсюда, собственно, вопрос-как прокачаться в Си, хотя бы до уровня начальных (самых простых) задач CodeWars? Есть ли какие-нибудь курсы, которые могут дать представление о применении Си, а не просто рассказать о типах переменных, циклах, ветвлениях и немножко указателях?

Лига программистов

2.1K постов11.9K подписчика

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

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

4
Автор поста оценил этот комментарий

Воодушевление! Качать Си Великий Кормчий хорошо! Партия народ счастлив всегда!! Книга читать Си писать разумный мысль и Красная Книга великий Мао заодно сразу знать больше Си и компартия народ любить! Нефритовый стержень тверд и весел!

раскрыть ветку (1)
7
Автор поста оценил этот комментарий
Иллюстрация к комментарию
4
DELETED
Автор поста оценил этот комментарий

BeginEnd на ютубе

раскрыть ветку (1)
3
Автор поста оценил этот комментарий
Странно, качественные уроки, но ни разу на этого автора не натыкался
1
Автор поста оценил этот комментарий

Начни с основ. Учебник Кернигана и Ричи "Язык программирования Си". Он же "K&R".

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

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

показать ответы
0
Автор поста оценил этот комментарий

Без цели все представляется бесполезным, об этом уже сказали. А будет проект, то 1) если он на микроконтроллере, то язык сам по себе имеет второстепенное значение 2) если для компьютера или мобилы, то С не оптимален.


Теперь рассматриваем проблему с другой стороны. Я так понимаю, Вы не молоды. Я тоже :) И я осознал, что, если бы не работа, я бы не занимался этим всем. Я бы работал в саду, ходил бы в лес, катался на велосипеде и электросамокате. И С был бы " абсолютно бесполезной штукой". Я завидую Вам ;)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Я бы тоже работал в саду и ходил бы в лес. Зимой только в лесу скучно очень, а сада нет и не предвидится. Надо чем-то занимать голову.
показать ответы
6
Автор поста оценил этот комментарий

А вообще, Си - как язык, очень простой, но чтобы на нем писать качественный код, нужно хорошо прокачаться. Именно потому, что у программиста много свободы и если делать коряво - получится совсем коряво. Как делать не коряво - надо смотреть в чужом хорошем коде. Я, например, очень многие хорошие практики подсмотрел в исходниках линуксового ядра. Там все хорошие практики пошли от очень квалифицированных людей.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

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

показать ответы
1
Автор поста оценил этот комментарий

циклом от нулевого и до (количество элементов массива)

До количества - 1. По индексу, равному кол-ву элементов, записан символ \0 (null terminated string).


Не знаю какую вы задачу решаете, но описание действий по смене регистра вроде правильное, не знаю почему считаете что ничего не понимаете


Ок мб почитайте Подбельского-Фомина "Программирование на C".

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

да по сути нет задач, чисто хобби. Так как не могу придумать пет-проект, решил качаться на кодеварсе. С алгоритмами как таковыми проблем вроде нет, начинал прогать тридцать лет назад на Спектруме, писал даже какие-то игры примитивные на бейсике со вставками для графики на асме. Зашёл на кодеварс и понял, что ничего не понял. Скорее всего, надо брать готовые решения этих задач, они там есть, читать их и вникать, что там происходит, но это какое-то решение "с конца", думаю,ч то есть какое-то последовательное, систематизированное решение для данного вопроса, научиться решать по сути прикладные задачи.

1
Автор поста оценил этот комментарий

Тогда устройся на работу)

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Не берут, суки)))
показать ответы
0
Автор поста оценил этот комментарий

А как насчёт книги Стивена Прата?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

Предпросмотр
YouTube12:31
показать ответы
1
Автор поста оценил этот комментарий

У меня был пет проект на STM32 - управление адресной лентой rgb ws2812. Делал цветомузыку с разложением спектра при помощи Фурье преобразования. Писал на чистом Си на регистрах cmsis, потом обернул в небольшую С++ либу.

Так вот, не могу представить как AVR справится с такой задачей. Я для генерации ШИМ на таймере делал 72мгц, плюс вычисления с плавающей точкой на встроенном ДСП для БПФ. Все в реалтайме на данных с АЦП, которая кстати была запущена через контроллер прямого доступа к памяти, чтобы на прерывания время не тратить. Не помню, кстати, есть ли в авр ПДП.


Ещё, забыл добавить, на один пиксель надо 24 байта ОЗУ. На 256 диодов - примерно 6кБайт

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

У Гайвера есть проект на 2812, гирлянда на площадь остекления балкона, так там не только куча световых эффектов, а даже игры есть. И всё это влазит в Ардуино на АВР, но в платы на STM конечно эффектов влазит больше. Если перейти с ардуино-суржика на регистры или на Си, наверняка влезет ещё больше.

DMA в "классических" AVR нет.

показать ответы
1
Автор поста оценил этот комментарий
Ну я решил развиваться как программист в первую очередь. То есть микроконтроллеры была не сама цель, а просто приложение. В итоге я сейчас совершенно другим занимаюсь, по сути веб разработчик
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

ну да. Микроконтроллеры это в первую очередь про железо, а не про программирование.

1
Автор поста оценил этот комментарий
Совет то хороший вам дали. Я тоже с мироконтроллеров начинал. С stm32. Только на с++. Помню купил плату какую то тестовую stm discovery вроде с экраном, ну и попробовал арканоид сделать там с менюшкой и прочим. Игру я так и не дописал, но помню что пришлось для графики фреймворк сделать, для менюшки библиотеку написать и тд. И в тоге пришел к тому, что зря тратил время на микроконтроллеры. Слишком много времени было потрачено на то, что с программированием как таковым и не связано
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

а я не понял, что можно сделать на STM и нельзя сделать на AVR, потому помигал диодиком на bluepill и бросил её в дальний угол. Для задач рядового самодельщика AVR более чем достаточно. А куда вы двигались, что учились на МК и это оказалось ненужным?

показать ответы
1
Автор поста оценил этот комментарий

Ну значит, просто пока потребности не возникло.

Обычно такие вещи хорошо заходят, когда читаешь - и периодически мысль выскакивает: "вот как, оказывается, там-то и там-то можно было все просто сделать!"


Структуры данных нужны, когда проект растет. Чтобы единообразное поведение было для кучки сущностей. Например, хороший проект для осознания - охранный прибор, со входами датчиков, выходами сирен и табло, кучкой запутанной логики. Там очень быстро получается осознать, что все на самом деле просто (разного вида входы ведут себя очень похоже, разные выходы тоже, и нужно все это одновременно обрабатывать), но вот так тупо влоб не получается, надо все правильно организовывать. И вот это правильное организовывание - и есть тот навык, который из обучения должен получиться.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Был один проект, можно назвать его пет-проектом. https://www.drive2.ru/b/621356287040435931/  Внешне вроде тривиальная задача, но потащила за собой много интересного, в основном, проблемы схемного характера, помехи по питанию и прочие косяки. А чтобы изучать конкретно Си, не могу придумать ничего подходящего, в поисках прикладных задач пришёл на кодеварс.

показать ответы
1
Автор поста оценил этот комментарий

Вирт - уж очень фундаментален. Начните с чего-то простого и поверхностного, я тут нашему джуну подкинул книжку "Грокаем алгоритмы", и ему зашло. Поймете суть - дальше все просто.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

качал это гроканье, что-то не пошло.

показать ответы
2
Автор поста оценил этот комментарий

Набрать в гугле

книга алгоритмы и структуры данных pdf


Но самое смешное что сейчас кризис. Слишком много менеджеры на коленке хотят чтобы был сделано. При разработкеи для  микроконтроллеров вы же используете грубо Типовые решения правильно?

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

книга Н.Вирта?

показать ответы
6
Автор поста оценил этот комментарий

Вы говорите о трёх разных скиллах, непонятно какой именно вам нужен. 1) Знание C (синтаксис, идиомы языка, модель памяти, стандарная библиотека итд) 2) Знание прикладных библиотек на C (юниксовые либы, glib, pthreads, Xlib, что хотите) 3) Алгоритмы и структуры данных. Определитесь чего именно вы не знаете

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

Строка это одномерный символьный массив, надо перебрать его посимвольно (скорее всего, циклом от нулевого и до (количество элементов массива)) и находя пробел апать символы следующие за ним. Наверняка, чтобы апнуть символ надо добавить к нему константу, равную расстоянию от символа в нижнем регистре до символа в верхнем регистре. Ну или вычесть эту константу, смотря что идёт в символьной таблице раньше, нижний или верхний регистр.

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

Тут и есть вопрос, как это прокачать?

показать ответы
4
DELETED
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

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

Методом бросания в воду я учился прогать AVR и PIC. Была задача и интернет, хочешь сделать-делай. А тут вот не могу понять, с какого конца браться.

показать ответы
13
ЪУЪ
Автор поста оценил этот комментарий

Codewars это не про Си, а про алгоритмы. Язык вообще не важен

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

это я понимаю. Может, неправильно объяснил. Вот пример, надо взять строку и заменить в ней все первые буквы каждого слова на верхний регистр. Даётся болванка:


char *to_jaden_case (char *jaden_case, const char *string)

{

// write to jaden_case and return it

*jaden_case = '\0';

return jaden_case;

}


Смотрю на неё, и ничего не понимаю. Толи символьный массив ввели, толи переменную строковую, возможно надо библиотеку какую-то подключать, что в предпоследней строке добавили? Короче, тёмный лес. И вроде как я знаю основы, которые дают на шаблонных курсах, которых по всему интернету валом, но применить ничего из своих знаний не могу. Даже загуглить не представляю как.

показать ответы
5
Автор поста оценил этот комментарий
раскрыть ветку (1)
Автор поста оценил этот комментарий

Жаль.

Очень жаль, что не читаю по вражески бегло. Стыжусь, пытаюсь исправляться.

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества