Ответы пользователя по тегу C
  • Зачем нужно выравнивание памяти по слову?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Разобраться с вопросом тебе поможет статья: Расставим точки над структурами C/C++.
    Если точнее, то тебе стоит детально изучить первый же пункт статьи: Выравнивание полей памяти.
    В общем выравниваются в памяти поля по границе кратной своему же размеру. То есть 1-байтовые поля не выравниваются, 2-байтовые — выравниваются на чётные позиции, 4-байтовые — на позиции кратные четырём и т.д.
    Ответ написан
  • Как добавить поддержку ZLIB в Android Studio ( C++ )?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    cannot find -llz

    Память мне подсказывает что не "-llz", а "-lz". :)
    Ответ написан
  • Как получить изображение максимально малого объёма для микроконтроллеров?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Для максимального сжатия изображений используют палитровую графику. Суть в том, чтобы в пиксельной матрице изображения заменить тяжелую информацию о цвете на значительно более легкий индекс цвета в некоторой цветовой палитре.

    Для картинки считается количество уникальных цветов, потом все уникальные цвета складываются в палитру и индексируются, а матрица цветов заменяется на матрицу индексов цветов.
    Число цветов в палитре принято делать от степени двойки, чаще всего встречаются палитры в 256 цветов. В этом случае размер индекса цвета в матрице занимает 1 байт. 16 цветов в палитре - индекс уже 4 байта. и.т.д.
    Прозрачность в этом случае неудобств не доставляет, т.к. в палитре можно спокойно хранить цвет в формате RGBA.

    Когда число цветов нужно вписать в некоторые рамки, для этого применяют разные алгоритмы так называемого dithering.
    Ответ написан
  • Как посмотреть результат работы линкера?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Для этих целей есть целый набор утилит. Всякие пакеты для разработки обычно кладут эти инструменты рядом с GCC.
    Вот, первое что вспомнилось: https://sourceware.org/binutils/docs/binutils/objd...
    Думаю, даже если это не то, то там ты найдешь нужный тебе инструмент.
    Ответ написан
  • Какие задачи на C / C++ сейчас востребованы?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Понимаешь, практика показывает, что востребованным может стать абсолютно любая библиотека. Особенно если ты берешь на себя ответственность ее поддержки.
    Людей много, задачи они порождают все время и самые разные. Зачастую, количество потребностей в коде у человека превышает возможности его создания и поддержки. И фактор нехватки ресурсов (времени/рук) чаще всего играет решающую роль в отказе от идеи.

    К тому же, у художников вот есть такие места, как deviantart.com / cghub.com (был), где они выкладывают свои работы, по которым видно их рост и общий стаж в ремесле. Я считаю что и у разработчика тоже можно проследить тенденцию роста по его проектам на гитхабе, а по открытым доскам на trello.com можно еще и проследить уровень самоорганизации человека.

    Нашему IT рынку сейчас более нужны не гениальные раздолбаи, а собранные и самоорганизованные специалисты. Поэтому мой совет вот такой: лучше нацелиться на простые и организованные проекты из личного интереса, чем искать что либо выдающееся.
    Ответ написан
  • Как парсить структуры с битовыми полями в С?

    @MarkusD
    все время мелю чепуху :)
    Так. Для начала...
    void* p = 02b05e1...

    SectionSyntaxIndicator=00 -Должна быть 1


    Первые 8 бит отходят к "unsigned tableID", все норм. А потом в описании идет однобитовый "unsigned SectionSyntaxIndicator".

    Значение второго байта == 0xB0, его первый бит == 0 и в результате все нормально.
    Первые 4 бита 0xB0 равны 0, поэтому все следующие ("SectionSyntaxIndicator", "Reserved1", "Reserved2") поля будут равны 0 ибо это первые четыре бита этого же самого байта.

    Поле "SectionLength" занимает 12 бит, стало быть оно захватывает вторые 4 бита из 0xB0 и весь байт 0x5E. Поэтому все правильно что оно тебе пишет 0x5EB.

    Теперь. Про битовые поля в структурах.
    habrahabr.ru/post/142662

    После этой ссылки я даже не знаю, что еще от себя писать.
    В целом, программа тут ни в чем не виновата, просто, по видимому, ты сам забыл что в шестнадцатиричном представлении байта пишется сперва старший квартет бит, а потом младший. Весной это бывает. :)
    Ответ написан
  • Есть ли способ посчитать хэшсумму объявления структуры?

    @MarkusD
    все время мелю чепуху :)
    Если я правильно понял суть вопроса, то могу предложить один вариант. Скажем, будем считать CRC32 на этапе компиляции (тема бородатая, делается легко). Предположим, что 11 стандарта на руках нету.
    В первую очередь надо взять строку от определения структуры. Сделать это можно так:

    #define TOSTR( V )  #V
    #define MKSTR( V ) TOSTR( V )
    #define STRINGIFY_BODY( STR_NAME, ... ) \
    static const char* STR_NAME = MKSTR( __VA_ARGS__ ); \
    __VA_ARGS__
    
    STRINGIFY_BODY( MY_STRUCT_STR,
    struct MyStruct {
    	uint32_t	m_field1;
    	int16_t	m_field2;
    	int64_t	m_field3;
    }
    );


    Конечно-же, сама строка нам тут не нужна, а нужна именно CRC32. Да при том, посчитанная в compile-time.
    Для этого вводим в свой код такой вот ужас:
    static const uint32_t CRC32_TABLE[256] = {
    ... // тут много констант.
    };
    
    template< int pos >
    __forceinline uint32_t make_crc32( const char* data ){
    	const uint32_t crc = make_crc32< pos - 1 >( data );
    	return ( crc >> 8 ) ^ CRC32_TABLE[ ( crc ^ data[ pos ] ) & 0x000000FFU ];
    };
    
    template<>
    __forceinline uint32_t make_crc32<-1>( const char* data ){
    	return 0xFFFFFFFFU;
    };
    
    // -1 будет указывать на концевой ноль строки,
    // а -2 - в самую пору для начала подсчета - это последний символ строки.
    #define GET_CRC32( V ) ( make_crc32< sizeof( V ) - 2 >( V ) ^ 0xFFFFFFFFU )


    В самом подсчете суммы я мог наломать дров, точностей на скорую руку не помню. Поправьте меня, если не так.
    Что это за код.
    "__forceinline" - специальное слово для MSVC++ компилятора, указывающее принудительное развертывание этого кода. Работает это слово только при включенной оптимизации.
    Шаблон "make_crc32" будет инстанцирован столько раз, какая в коде встретится максимальная длина строки. В релизе шаблоны "make_crc32" будут схлопнуты в значения, а табличка "CRC32_TABLE" будет вырезана из бинарника за ненадобностью. Контрольная сумма посчитатся при сборке проекта.
    Теперь осталось только дописать макрос стрингификатор.

    #define STRINGIFY_BODY( CRC_NAME, ... ) \
    static const uint32_t CRC_NAME = GET_CRC32( MKSTR( __VA_ARGS__ ) ); \
    __VA_ARGS__


    А использовать теперь этот стрингификатор можно вот так:

    STRINGIFY_BODY( MY_STRUCT_CRC,
    struct MyStruct {
    	static const uint32_t H;
    
    	uint32_t	m_field1;
    	int16_t	m_field2;
    	int64_t	m_field3;
    }
    );
    
    const uint32_t MyStruct::H = MY_STRUCT_CRC;


    ...или как-либо иначе. Идея, в общем, нарисовалась вот такая.
    От __forceinline можно избавиться в пользу constexpr (для случая с 11 стандартом), результат должен быть таким же.
    В релизе breakpoint внутри подсчета CRC32 не сработает, т.к. все уже посчитано, а в дебаге будет работать (если в дебаге оптимизация не включена).
    Ответ написан