Сообщество - Лига программистов C/C++
Добавить пост

Лига программистов C/C++

63 поста 4 766 подписчиков

Популярные теги в сообществе:

Стек, функция, передача по значению

Друзья, пишу небольшие карточки для школьников по Ардуино. Сейчас проходим функции, а именно передачу по значению. В теории как и на практике всё понятно, но описать понятным для них языком проблематично. Упрощаю уже до "нельзя". Есть ли какие замечания по представленному? Любая критика или помощь, только - За!

Стек, функция, передача по значению Arduino, Программирование, Школьники

С++-программист - приколы с собеседований

Занимаюсь поиском работы, прохожу собеседования тут разные. Разработчик C++. Делюсь улыбками с вами.


Звонит человек, представился техническим руководителем какой-то компании, набирает людей в новую команду. Я спрашиваю:

- Скажите, какой стандарт С++ у вас используется в проекте?

- Стандарт? Да никаких стандартов у нас нет! У нас вообще очень демократичная компания, никакой тебе бюрократии!

- Эээ... до свидания.


Другой эпизод (другая компания):

- Мы небольшая уютная компания (около 50 человек - прим.), у нас все демократичненько, без бюрократии (я уже начинаю напрягаться когда слышу "без бюрократии" - прим.), все быстро решается с руководителями!
я, через некоторое время беседы:
- Расскажите. допустим кто-то из разработчиков предлагает улучшение процесса, ну, принять Код Стайл, например. Как у вас организован процесс подобных улучшений:
- Ну, для начала автор предложения должен согласовать с техлидом и создать тикет в JIRA. Потом менеджер проекта его просматривает, если возражений нет, возвращается автору. Автор дописывает оценку по срокам, а так же какую финансовую выгоду предложение несет. Тикет переводится тех. диру, который с генеральным директором обсуждает уже целесообразность внедрения изменения. После этого задача попадает в беклог.
- Стоп, может вы не поняли, речь о любых изменениях?
- Да, конечно, генеральный директор отслеживает все предложения которые влияют на эффективность.
(разговор был не тупо с HR если что, а в нем участвовал техдир пресловутый). Демократичненько.

Еще тоже забавное:

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

Но добило сопроводительное: "mapron, скажите, у вас есть опыт с технология1 и технология2 для данной позиции?".  Конечно, мать твою, ты б хоть резюме мое открыла...

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


И под конец, скорее грустное.

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

- Конечно, для опытных сотрудников которые давно работают, у нас это не проводится. Они могут и коммиты прямо в master  оформлять.
- Эмм, можно уточнение, скажите по-вашему, для чего нужно ревью кода? 2-3 пункта?

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


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

Показать полностью

Программирование на C в эпоху ООП. Оно такое

Программирование на C в эпоху ООП. Оно такое Программирование, Профессиональный юмор, Си
Показать полностью 1

Как устроиться на работу Trainee/Junior?

Не так давно к нам с женой в гости приехала подруга жены, с молодым человеком. Этот молодой человек (который оказался действительно прилично моложе меня) работает программистом в достаточно большой компании. Он оказался крайне интересным человеком и с помощью пары бутылок вина я решил перейти на темную сторону. Тобишь, сменить специализацию. Как итог - теперь я учу c++ примерно по 4 часа в сутки с пару месяцев. Как ни странно, оказалось, что мне это очень сильно нравится и уже начало что-то получаться. Но вот дилемма: на данный момент у меня есть основная профессия, которая занимает примерно пол дня, 3-4 дня в неделю. Иногда меньше, но бывает и сутками без вынимачки. Все зависит только от меня. Проблема в том, что эта профессия кормит как меня, так и мою семью. И как уйти из нее в программирование, примерно на те же деньги - я не знаю. На данный момент я могу претендовать только на trainee, может, на недо-джуна. Я трезво оцениваю свои навыки и понимаю, что сразу принести пользу компании - я вряд ли смогу. Значит, компания будет со мной работать в минус, ведь это - рабочее место, время и силы кадровика, нервы и человеко-часы наставника. На выходе - имеем вилку: работодатель забирает меня на полный рабочий день и платит мне заработную плату, с которой я кормлю семью, либо работодатель забирает меня не на full time, на какой-то более "мягкий" график, я продолжаю кормить семью с старой работы, работая (получая практику) бесплатно. Конечно, оба варианта меня полностью устраивают.

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

Дорогие Пикабушники, расскажите, как Вы устроились в первый раз? Сталкивался ли кто-то с такой сменой профессии? Как Вы выходили из подобной ситуации?

Показать полностью

Типобезопасные контейнеры в GNU C11 без кодогенерации

Всем привет!
Я решаю проблему про которую никто не знает, на языке, на котором никто не пишет. Это пост про язык Си.

Я сам не пишу на Си уже очень давно. Профессионально последние 7 лет только на C++ и C#. Но Си очень привлекает своей простотой. Но отталкивает отсутствием множества удобных штук.

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


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


Вот сразу ссылка на пример в Wandbox - https://wandbox.org/permlink/pOwkHRfWyipp8P89

1. Проблема
Если вы хотите универсальные контейнера на Си, можно пойти двумя путями:
1. Макросы, которые работают почти как шаблоны в C++, генерировать функции для доступа к контейнерам для тех типов, которые вы хотите использовать. Вот пример: https://github.com/stefanct/sglib
Это быстро, но требует объявить все используемые типы в одном месте, что усложняет разделение проекта на модули. Поправьте, если я не прав.
2. Типы данных, хранящие всю инфорацию внутри как это сделано в Glib  https://developer.gnome.org/glib/2.66/ в данном случае, невозможно организовать типобезопасность, повсеместно используюется void* . Меняешь тип контейнера и не знаешь, что после этого отвалится. Моя цель - решить именно этот класс проблем.


2. Как выглядит решение
Так вот, слыхали что существует C11? Это почти как C++11, только C11.


Так вот, там появилось такое ключевое слово _Generic, которое позволяет выбрать функцию, в зависимости от типа и позволяет сделать какую ни какую перегрузку функций (которой нет в Си из коробки)

Оказалось, что используя _Generic  + typeof() из GNU + указатели на функции можно сделать типобезопасные контейнеры прямо в Си! Эти контейнеры не используют кодогенерацию, однако так же удобны в использовании (хотя будут чуть медленней работать, но в большинстве случаев удобство важнее)


Вот короткий пример создания вектора:

ABVECTOR(int) numbers = CREATE_ABVECTOR(int);
for (int i = 0; i < 20; i++)
*PUSH( numbers) = i; // обратите внимание, тип известен!

В данном примере ABVECTOR(int) это аналог std::vector<int>

Если поменять тип контейнера, или тип переменной хоть в одном месте, вы получите ошибку компиляции. А это ровно то, чего я хочу!

Другой пример, передача контейнера в качестве аргумента в функцию:

void printValues(ABVECTOR(float) numbers)
{
for (float* iter = BEGIN(numbers); iter != END(numbers); iter = NEXT(numbers, iter))
printf("Val: %f\n", *iter);
for (int i = 0; i < LENGTH(numbers); i++)
printf("Val: %f\n", *GET(numbers, i));
}

Если передать в функцию неправильный тип контейнера, например List, вместо Vector - будет ошибка. Если тип элемента контейнера будет отличаться - то же ошибка.

3. Как этого добиться?

1. Использовать указатель на функцию чтобы хранить сразу два типа, тип контейнера + тип элемента. Например int (*) (ABVector*)

2. Использовать typeof, чтобы достать тип элемента контейнера typeof( X(0) ) - получение типа результата вызова функции

3. Использовать _Generic, чтобы проверить тип контейнера

_Generic(( X ), typeof(X(0)) (*) (ABVector*) : __my_container_func__ )(X)

На этом пожалуй все ) Спасибо за внимание!

Не забудьте потыкать пример в Wandbox - https://wandbox.org/permlink/pOwkHRfWyipp8P89

Показать полностью

Краткое содержание доклада "Незаменимый С++"

Автор доклада: Антон Полухин.

Конференция: C++ Russia 2019 Piter.

Ссылка на видео доклада: https://www.youtube.com/watch?v=LZflL44SVVY&amp;list=PLZN9ZG....


Краткое содержание с таймингом:


1:20 - миф "На С++ не пишут". На С++ написаны все поисковые движки, игры с хорошей графикой (даже если наружу торчит C#, внутри - С++), компиляторы, ...


6:45 - "чем С++ привлекает?" - вы не платите за то, чем не пользуетесь, поддержка огромного количества платформ, ...


9:05 - "сравнение С++ с другими языками":

1) нельзя найти гениального разработчика на ассемблере, который оптимизирует код лучше, чем С++.

2) Rust потенциально позволяет оптимизировать код лучше. На простом примере показано что сейчас Rust оптимизирует хуже. На Rust сложно использовать библиотеки на Си.

3) Go скорее конкурент Python, чем С++.

4) Почему в бенчмарках оказывается, что язык X быстрее С++?

- в языке Х отключается сборщик мусора;

- код пишется не на С++ (float* value = new float;)

- на X написана другая программа - (php долго обгонял все языки в 8 раз, но программа на php работала в 32 потока).

- тестируется библиотека, а не язык (в С++ не очень хорошо с дизайном регулярных выражений).

5) миф "Сборщик мусора не добавляет накладных расходов". Очень кратко рассказывается как может работать сборщик мусора. Для сборки мусора нужно хранить дополнительную информацию об объектах. Сильное замедление в многопоточном коде. ...

6) сравнение с C# и Java. Для своих ниш эти библиотеки очень хорошо подходят, но есть накладные расходы (за счет сборщика мусора). Отсылка к другому видео (где показывался аналог Logstash, разработанный в Яндексе на C++).


41:10 Проблемы С++:

- скрытый высокий порог вхождения;

- отсутствие изкоробочности (в том числе за счет отсутствия готовой инфраструктуры)


43:40 Итоги.

Показать полностью 1

С++ стрим от Тимофея Хирьянова

Преподаватель МФТИ запустил трансляцию лекцию Алгоритмы и структуры данных с++

Сможете найти на картинке цифру среди букв?

Справились? Тогда попробуйте пройти нашу новую игру на внимательность. Приз — награда в профиль на Пикабу: https://pikabu.ru/link/-oD8sjtmAi

Сможете найти на картинке цифру среди букв? Игры, Награда

Как устроены умные указатели C++

Привет.Частое использование указателей приводит к путанице и дублированию кода (при создании например указателей, которые нужны нам только в области работы функции, придётся прописывать оператор delete, чтобы устранить утечку памяти). Поэтому в C++ есть shared-ptr, unique-ptr и auto-ptr (это вообще отдельная тема в чем их отличие:))


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


По сути, этот объект за счёт устройства языка позволяет не заботиться об освобождении памяти. Ведь при выходе из области видимости функции у нашего объекта вызывается деструктор, который за нас освобождает память.


на 20-ой строчке переопределение оператора звездочка, чтобы обращаться к элементу


Так устроен самый примитивный смарт поинтер :)


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

Как устроены умные указатели C++ C++, Структура
Показать полностью 1
Отличная работа, все прочитано!