Ответы пользователя по тегу C
  • Какие есть доки по сборке APK/AAB с использованием Android NDK?

    @MarkusD
    все время мелю чепуху :)
    Для изучения всего пайплайна сборки Android-приложения достаточно просто прочитать официальную документацию.
    Сборка кода низкого уровня выполняется через ndk-build и cmake.
    Сборка APK выполняется через Gradle напрямую.

    Android Studio ничего от разработчика не скрывает. Gradle по умолчанию встраивается в каждый проект Android-приложения. Gradle всегда настраивается руками, прямо в сценариях самого проекта. Для сборки APK требуется только сам проект, SDK и NDK. Студия не требуется, Gradle запускается из консоли. Сборку низкого уровня можно как встроить отдельным этапом в сценарий Gradle, так и сделать выделенным этапом, также запуская cmake/ndk-build из консоли.
    И все это детально описано в документации разработчика по ссылкам выше.

    Практически все вопросы решаются или через примеры в SDK, или через примеры в NDK.
    Все продвинутые вопросы решаются или в документации Gradle-плагина для Android, или в документации к NDK-Build.
    Ответ написан
    2 комментария
  • Что стоит учить с или c++ или c#?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Начинать нужно всегда с того языка, на котором ты думаешь, разговариваешь в быту и пишешь. С Русского языка. У тебя с ним, видно, все вполне хорошо. Пишешь понятно, мысли за словами прослеживаются.
    Значит нужно двигаться дальше. Следующим языком для тебя должен быть интернациональный. На этом языке идет общение в сообществах и передаются знания, как через книги, так и напрямую. Английским нужно владеть на уровне способности читать без запинки и словарей, также на английском нужно уметь внятно писать. Навыки устного общения будут плюсом, но на этапе обучения сильно не требуются.

    Языки программирования - это инструменты. А инструменты всегда надо выбирать от условий задачи. У тебя не выйдет решать все задачи только каким-то одним языком. Знать во всех тонкостях и уметь использовать строго по назначению Python, Java, C#, C++, Lua, TypeScript и, например, PHP не просто нормально, а важно.
    Бьерн Страуструп один раз говорил о том, что для настоящего инженера важно знать порядка 5 разных языков и разбираться в их особенностях, чтобы считать себя настоящим специалистом.

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

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Для подобных целей уже давно заведены intptr_t и uintptr_t [?], а еще ptrdiff_t [?].
    Именно эти типы и стоит использовать для прямой работы с адресами.

    Теги C и C++ смешивать не совсем уместно. Это мешает выбору более подходящего варианта ответа.
    В C++, например, если нужно только хранить адрес и позволять с ним только определенные операции, лучше мог бы подойти enum class MemoryAddress : uintptr_t;. Пустое перечисление с достаточной шириной и выравниванием избавит от возможности случайно что-то куда-то прибавить или умножить, да и от неявных преобразований убережет. А перегрузка операторов поможет разрешить только определенные операции.
    Но в C так не получится.
    Ответ написан
    Комментировать
  • Как сделать обработчик коллизий в OpenGL?

    @MarkusD
    все время мелю чепуху :)
    OpenGL - Open Graphics Library.
    Это - открытая библиотека работы с графикой. И в ее API содержатся только функции работы с графикой.
    Для обработки коллизий нужна отдельная библиотека обработки коллизий, в зависимости от мировой системы координат. Простую библиотеку можно и самому сделать.
    Для обработки коллизий используют библиотеки коллизий и физические движки.
    Ответ написан
    3 комментария
  • Какие языки совместимы с C++?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Судя по комментариям к ответам, у тебя формулировка вопроса не соответствует твоим ожиданиям.
    Совместимость языков - это тонкий маршалинг типов и совместная линковка в один бинарный файл.
    Этим условиям, в разной степени, удовлетворяют: C, asm, D, C#, Java. Может быть еще какие-то языки. При этом, у каждого языка верхнего уровня будут свои требования к маршалингу типов и передаче управления.

    Тебя же интересуют встраиваемые языки.

    Взять, например, D. Он полностью совместим с C++. Однако, его требования не позволяют простую линковку объектных файлов C++ и D в один бинарный файл. На C++ или должен быть создан D Runtime (что не так просто сделать), или C++ код должен линковаться в бинарник на D, в качестве Better C++. Т.е. получается наоборот, в базе будет D, а C++ его только расширяет.
    С питоном и Java все точно так же. C# вообще работает с библиотеками классов, написанными на C++/Cx, т.е. на модифицированном C++.
    Эти языки не являются встраиваемыми. Их возможности расширяются за счет использования C++.

    Хорошим ответом на твой вопрос будет вот такой список встраиваемых языков. Из этого списка можно брать любой язык, ядро которого написано на C или C++.
    Мой личный выбор - это AngelScript и Lua/Terra.
    Ответ написан
    Комментировать
  • Зачем нужно выравнивание памяти по слову?

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

    @MarkusD
    все время мелю чепуху :)
    Ответ написан
    Комментировать
  • Как добавить поддержку 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

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

    @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 не сработает, т.к. все уже посчитано, а в дебаге будет работать (если в дебаге оптимизация не включена).
    Ответ написан
    Комментировать