Рубрика «c/c++»

Марио. Ноты

Предисловие

Привет, Мир!

Уже года 3 хочу написать что-нибудь на Хабр, но никак не находилось темы, на которую можно было бы накатать пост. Так было до тех пор пока мне не понадобилось узнать немного про работу системного таймера и системного динамика для лабораторной работы. Порыскав немного в интернете, я не нашел ничего дельного: что-то было написано слишком сложным языком, что-то было не особо содержательно. Я обзавелся неплохой книгой, целой ночью и попытался сыграть всеми известную тему из игры Марио. Продолжение прямо под катом, вроде бы у вас тут так заведено.

Дисклеймер

Код написан так как он написан. Автор не гений программирования, а всего лишь студент, но тем не менее, попытался написать максимально читаемый и понятный код. Всё было написано на Borland C и было протестировано в DOSBox только потому, что нет установленного доса и не очень хочется напортачить с часами реального времени.

В далеком 2012 году Loiqig уже написал более крутую версию, но, как мне показалось, мало внимания уделил теории.

Так же автор (т.е. я) имеет 4 года музыкального образования и был плох в сольфеджио (музыкальная грамота).
Читать полностью »

Топ-10 докладов конференции C++ CoreHard Autumn 2019 - 1

CoreHard – C++ конференция, проходящая в Минске дважды в год, весной и осенью. С 2015 года мы выросли из небольшого сообщества энтузиастов в крупную региональную конференцию. Мы стараемся совмещать знания признанных мастеров мира С++ с развитием локального С++ движения, активно привлекая докладчиков из местных белорусских, российских и украинских компаний.

Спешим поделиться сами топ-10 свежеиспеченных видео с нашей недавно отшумевшей конференции.

Итак, поехали: топ-10 докладов по оценкам зрителей.
Читать полностью »

Обычное понимание Drag and Drop(D&D) предполагает, что берётся, например, ссылка на файл из одного виджета и перемещается мышкой в другое окно или виджет. Далее пойдёт речь не о библиотечных функциях D&D, а о собственной реализации перемещения виджета в пределах окна и сопутствующего функционала. Код больше для примера, чем конкретного практического применения, написан в стиле Си с классами. Редактор — CodeBlocks 17.12, который перестал вылетать на Ubuntu x64 по сравнению с 16-ой версией.

image

Читать полностью »

Опровергаем четыре стереотипа о языке программирования Rust - 1

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

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

  1. Rust — сложный язык программирования
  2. Rust — ещё один "убийца C/C++"
  3. Unsafe губит все гарантии, предоставляемые Rust
  4. Rust никогда не обгонит C/C++ по скоростиЧитать полностью »

На размышления меня натолкнула статья об использовании «странной» инструкции popcount в современных процессорах. Речь пойдет не о подсчете числа единичек, а об обнаружении признака окончания Си строки (нуль-терминированная строка).

Нуль-терминированная строка — способ представления строк в языках программирования, при котором вместо введения специального строкового типа используется массив символов, а концом строки считается первый встретившийся специальный нуль-символ (NUL из кода ASCII, со значением 0).

Для определения длины таких срок применяется стандартная функция

size_t __cdecl strlen(char const* str)

Алгоритм работы которой можно описать на языке Си как:


size_t strlen_algo(const char* str)
{
	size_t length = 0;
	while (*str++)
		length++;
	return length;
}

Посмотрим во что его превращает компилятор MS Visual Studio 2019 community (Release, x86):

08811F7h:
mov         al,byte ptr [ecx]  
inc         ecx  
test        al,al  
jne         main+0D7h (08811F7h) 

Читать полностью »

Неопределённое поведение с устаревшими объявлениями функций в ANSI C - 1

Стандарт ANSI C определяет понятие прототипа функции, представляющее собой подмножество объявления функции, которое указывает типы входных параметров. Прототипы были введены с целью устранить недостатки, которыми обладают обычные объявления функций.

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

Читать полностью »

Пишем на Rust + CUDA C - 1

Всем привет!

В данном руководстве хочу рассказать как подружить CUDA C/С++ и Rust. И в качестве примера напишем небольшую программу на Rust для вычисления скалярного произведения векторов, вычисление скалярного произведения будет производиться на GPU с использованием CUDA C.

Кому интересно под кат!
Читать полностью »

строгий единорог

В начале 2018 года в нашем блоге появился цикл статей, посвящённый шестой проверке исходного кода проекта Chromium. Цикл включает в себя 8 статей, посвященных ошибкам и рекомендациям по их предотвращению. Две статьи вызвали бурное обсуждение, и до сих пор на почту мне изредка приходят комментарии касательно тем, затронутых в них. Пожалуй, следует дать некоторые дополнительные пояснения и, как говорится, расставить точки над i.
Читать полностью »

PVS-Studio free for open source

В канун празднования нового 2019 года команда PVS-Studio решила сделать приятный подарок всем контрибьюторам open-source проектов, хостящихся на GitHub или Bitbucket. Им предоставляется возможность бесплатного использования статического анализатора PVS-Studio для развития открытых проектов.
Читать полностью »

PVS-Studio, MISRA C, MISRA C++

Начиная с версии 6.27 статический анализатор кода PVS-Studio может классифицировать свои предупреждения согласно стандартам MISRA C и MISRA C++. Благодаря поддержке этих стандартов анализатор стало возможным эффективно использовать для улучшения безопасности, переносимости и надежности программ для встраиваемых систем.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js