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

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

66 постов 4 787 подписчиков

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

Книга по C++: От нуба до про

Добрый день, Пикапрограммисты. Давно вынашиваю идею написать книгу об изучении C++, с точки зрения новичка без опыта и соответствующего образования. По большому счёту это пост о поиске ментора. Дело в том, что уже не раз пытался начать учить, каждый раз заново, но упирался в простые вопросы, ответы на которые ищутся может и не так долго, но более глубокого объяснения найти не получится. Например о строках на русском языке, почему надо писать сет_локейт, а почему g++ и без этого работает, а почему сетлокейтов несколько, а какой нужен, а где, а почему? и т.п., на что ответы найти почти невозможно. Я к тому, что я пытаюсь понять более глубоко, но постоянно терзают сомнения, а нужно ли это? И многие ответят "нет", но у меня на подсознании обратный ответ, ведь такие мелочи могут всплыть в разных не очень приятных местах, полагаю. Прошу не писать "кури мануалы"/"учи либу", вы серьёздно? Не, это может и очень дельный совет, но не новичку, я пробовал, и... куда читать? что читать? пока читал, забыл зачем читал..

В общем ну смог я написать консольный калькулятор, даже выводит подробное решение квадратных уравнений. Решил раскидать функции по разным файлам, чтоб в основном только Мэйн остался, и встрял, 2 дня гуглинга не дали результатов, и куда идти? И спросить не у кого. Сейчас снова заброшу на некоторое время, потом разберусь и с этим вопросом... но разве это обучение? Так и совсем забить не долго, потому, хочется найти человека, что может выделить хотя бы пару часов в неделю на ответы на накопившиеся вопросы, я не даyh, умею гуглить и задавать правильные вопросы, но в незнакомой сфере это сложно и не всегда видимо получается.

И так, в планах начать всё снова заново, основываясь на пути Метанита, но расширенно, отвечая на кучу мелких вопросов, отсекая лишнее. Конечная цель, я не знаю, вы профессионалы, что является высшей точкой владения C++? Своя ОС? Предлагайте, если не боитесь. Я же настроен добить этот язык, но без помощи это займёт, даже боюсь представить, сильно больше времени, если никто не откликнется. Кто готов стать соавтором книги, пишите) 554cpp@gmail.com
Ну а если вы мимокрокодил, то кидайте тапки и советы на годные источники инфы для изучения) ссаные курсы не советовать)

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

Каждый должен изучать Библию

Каждый должен изучать Библию

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

Типобезопасные контейнеры в 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

Показать полностью
Отличная работа, все прочитано!