Snake – искусственный интеллект для игры «Змейка»
Цель змеи – постоянно есть пищу и как можно скорее заполнить карту своим телом
Первоначально проект был написан на C++. Теперь он был переписан на Python с удобным графическим интерфейсом для пользователя
https://github.com/chuyangliu/snake
Цель змеи – постоянно есть пищу и как можно скорее заполнить карту своим телом
Первоначально проект был написан на C++. Теперь он был переписан на Python с удобным графическим интерфейсом для пользователя
https://github.com/chuyangliu/snake
#вопросы_с_собоседований
В чем различия между delete и delete[]?
delete предназначен для уничтожения объектов, память под которые выделена при помощи new(). delete[] для объектов выделенных при помощи оператора new[]().
При неправильном использовании оператора delete (например, delete вместо delete[]) результат будет: undefined behavior.
В чем различия между delete и delete[]?
delete предназначен для уничтожения объектов, память под которые выделена при помощи new(). delete[] для объектов выделенных при помощи оператора new[]().
При неправильном использовании оператора delete (например, delete вместо delete[]) результат будет: undefined behavior.
Быстрая сортировка
Отсортируйте заданный массив с помощью быстрой сортировки.
Формат входных данных:
Первая строка входных данных содержит одно натуральное число nn (1 ≤ n ≤ 10^5) – количество элементов в массиве. В следующей строке находятся элементы массива – n целых чисел, не превосходящих по абсолютной величине 10^9.
Формат выходных данных:
Выведите элементы массива в порядке неубывания.
Отсортируйте заданный массив с помощью быстрой сортировки.
Формат входных данных:
Первая строка входных данных содержит одно натуральное число nn (1 ≤ n ≤ 10^5) – количество элементов в массиве. В следующей строке находятся элементы массива – n целых чисел, не превосходящих по абсолютной величине 10^9.
Формат выходных данных:
Выведите элементы массива в порядке неубывания.
#вопросы_с_собеседований
Виртуальный конструктор: что он собой представляет?
Ответ:
Это каверзный вопрос с IT-собеседований, который чаще всего задают после виртуальных деструкторов, чтобы запутать. Конструктор не может быть виртуальным, поскольку в этом нет никакого смысла: при создании объектов нет такой неоднозначности, как при их удалении. 😁
Виртуальный конструктор: что он собой представляет?
Ответ:
#вопросы_с_собеседований по Си
Что такое void указатель? Можно ли разыменовать указатель void, не зная его типа?
void указатель — это указатель, который можно использовать для указания на любые данные любого произвольного типа. Указатель void может быть разыменован только после явного приведения. Например:
int a = 5;
void *b = &a;
printf(“%d\n”, *((int*)b));
Что такое void указатель? Можно ли разыменовать указатель void, не зная его типа?
void указатель — это указатель, который можно использовать для указания на любые данные любого произвольного типа. Указатель void может быть разыменован только после явного приведения. Например:
int a = 5;
void *b = &a;
printf(“%d\n”, *((int*)b));
This media is not supported in your browser
VIEW IN TELEGRAM
Приглашаем на бесплатный открытый вебинар курса «Программист С»: «С без компромиссов: обработка ошибок и полиморфизм»
Когда: 25 августа, 20:00 (мск)
Язык С даёт полный контроль над памятью и железом, но за эту мощь приходится платить — в нём нет встроенных исключений и классов. Однако, это не значит, что отказоустойчивость и гибкость недоступны. На вебинаре разберём техники, которые обычно остаются за кадром, и покажем, как писать на С надёжно, масштабируемо и без ущерба для производительности.
Что будет на вебинаре:
Рассмотрим setjmp/longjmp — аналог исключений, который позволяет «телепортироваться» сквозь стек вызовов;
Создадим виртуальные таблицы (vtable) — руками реализуем полиморфизм, как в C++;
Соединим обе техники в одном проекте – создадим систему логирования с централизованной обработкой ошибок.
Зарегистрироваться https://otus.pw/DhtK/
Бесплатное занятие приурочено к старту курса «Программист С», на котором вы освоите продвинутые приёмы работы с памятью, многопоточностью, сетевым взаимодействием и созданием высоконагруженных систем на чистом С.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Когда: 25 августа, 20:00 (мск)
Язык С даёт полный контроль над памятью и железом, но за эту мощь приходится платить — в нём нет встроенных исключений и классов. Однако, это не значит, что отказоустойчивость и гибкость недоступны. На вебинаре разберём техники, которые обычно остаются за кадром, и покажем, как писать на С надёжно, масштабируемо и без ущерба для производительности.
Что будет на вебинаре:
Рассмотрим setjmp/longjmp — аналог исключений, который позволяет «телепортироваться» сквозь стек вызовов;
Создадим виртуальные таблицы (vtable) — руками реализуем полиморфизм, как в C++;
Соединим обе техники в одном проекте – создадим систему логирования с централизованной обработкой ошибок.
Зарегистрироваться https://otus.pw/DhtK/
Бесплатное занятие приурочено к старту курса «Программист С», на котором вы освоите продвинутые приёмы работы с памятью, многопоточностью, сетевым взаимодействием и созданием высоконагруженных систем на чистом С.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
#вопросы_с_собеседований
Бывает такое, что оператор new не выделяет память?
Ответ:
Да, бывает, когда new передаётся указатель на уже выделенную память (например, с помощью malloc). Это называется placement new. И оператор new без изменения возвращает второй параметр - указатель (void* operator new(std::size_t, void*)). Это используется для создания объектов в выделенном "хранилище" или после malloc.
Важно! В этом случае деструктор нужно вызывать самостоятельно!
Бывает такое, что оператор new не выделяет память?
Ответ:
Важно! В этом случае деструктор нужно вызывать самостоятельно!
Основные концепции библиотеки chrono (C++)
Работа со временем как с безразмерной величиной может приводить к недоразумениям и ошибкам конвертации временных единиц измерения.
Для избежания таких ошибок предусмотрена библиотека chrono (namespace std::chrono). Она была добавлена в C++11 и дорабатывалась в поздних стандартах.
Смотреть статью
Работа со временем как с безразмерной величиной может приводить к недоразумениям и ошибкам конвертации временных единиц измерения.
Для избежания таких ошибок предусмотрена библиотека chrono (namespace std::chrono). Она была добавлена в C++11 и дорабатывалась в поздних стандартах.
Смотреть статью
❓Кто этот призрак в вашем коде: изучаем особенности работы с легаси на C++
Легаси — вот что объединяет всех разработчиков на всех языках программирования. Мы учимся уживаться с «наследием», встраиваем его в современную кодовую базу или стараемся не трогать.
Пришло время разобраться с легаси в email-проекте Ghost in the code.
Вы получите семь писем от инженеров, в числе которых представитель России в Международной рабочей группе по стандартизации C++ Антон Полухин и эксперт по архитектуре Константин Владимиров. Вместе с ними и другими опытным разработчиками пройдете путь от навигации по «зрелому» коду с помощью AI до выстраивания процессов с учетом легаси.
➡️Подписывайтесь на серию писем, это бесплатно. Оставляйте email-адрес на сайте проекта — первое письмо придет 15 сентября.
Легаси — вот что объединяет всех разработчиков на всех языках программирования. Мы учимся уживаться с «наследием», встраиваем его в современную кодовую базу или стараемся не трогать.
Пришло время разобраться с легаси в email-проекте Ghost in the code.
Вы получите семь писем от инженеров, в числе которых представитель России в Международной рабочей группе по стандартизации C++ Антон Полухин и эксперт по архитектуре Константин Владимиров. Вместе с ними и другими опытным разработчиками пройдете путь от навигации по «зрелому» коду с помощью AI до выстраивания процессов с учетом легаси.
➡️Подписывайтесь на серию писем, это бесплатно. Оставляйте email-адрес на сайте проекта — первое письмо придет 15 сентября.
Что нужно дописать, чтобы при вызове конструктора перемещения член класса действительно "переместился"?
Нужно дописать std::move в списке инициализации перемещающего конструктора:
Нужно дописать std::move в списке инициализации перемещающего конструктора:
A(A&& oth) : str(std::move(oth.str)){ }
Но это гарантирует "перемещение" только в том случае, если у этого объекта, в свою очередь, есть перемещающий конструктор (в данном случае, у std::string он есть).#вопросы_с_собеседований
Какие примитивы синхронизации реализованы в C++?
В с++ реализовано множество примитивов синхронизации, ниже представлены их предназначения:
Какие примитивы синхронизации реализованы в C++?
В с++ реализовано множество примитивов синхронизации, ниже представлены их предназначения:
Mutex - используется для блокировки мьютекса при доступе к разделяемому ресурсу.lockguard и uniquelock - используются для автоматической блокировки и разблокировки мьютекса. condition_variable - используется для уведомления потоков о состоянии разделяемого ресурса.atomic - используется для атомарной операции с переменными.semaphore - используется для синхронизации доступа к ограниченному количеству ресурсов.barrier - используется для синхронизации потоков, когда все потоки должны достичь определенной точки их выполнения перед тем, как продолжить работу.#вопросы_с_собеседований
Какие есть особенности работы с shared memory?
Работа с разделяемой памятью (shared memory) предполагает использование операций чтения и записи данных в общую область памяти, которая разделяется между несколькими процессами.
Среди особенностей можно выделить основные:
Синхронизация доступа к этой памяти должна происходить с помощью механизмов синхронизации, иначе возможны ситуации, когда несколько процессов одновременно пытаются получить доступ к одним данным.
Кроме того, при работе с shared memory необходимо учитывать, что изменения данных в одном процессе автоматически не отображаются в других процессах. Для обновления данных необходимо явно синхронизироваться между процессами.
Также необходимо учитывать, что при работе с shared memory необходимо правильно управлять выделением и освобождением памяти, чтобы избежать утечек памяти и других проблем, связанных с неправильной работой с памятью.
Какие есть особенности работы с shared memory?
Работа с разделяемой памятью (shared memory) предполагает использование операций чтения и записи данных в общую область памяти, которая разделяется между несколькими процессами.
Среди особенностей можно выделить основные:
Синхронизация доступа к этой памяти должна происходить с помощью механизмов синхронизации, иначе возможны ситуации, когда несколько процессов одновременно пытаются получить доступ к одним данным.
Кроме того, при работе с shared memory необходимо учитывать, что изменения данных в одном процессе автоматически не отображаются в других процессах. Для обновления данных необходимо явно синхронизироваться между процессами.
Также необходимо учитывать, что при работе с shared memory необходимо правильно управлять выделением и освобождением памяти, чтобы избежать утечек памяти и других проблем, связанных с неправильной работой с памятью.