Рубрика «C» - 4

C++23 — финал, C++26 — начало - 1

С момента моей прошлой публикации состоялось уже две встречи международного комитета по стандартизации C++.

Комитет занимался полировкой C++23:

  • static operator[];
  • static constexpr в constexpr-функциях;
  • безопасный range-based for;
  • взаимодействие std::print с другими консольными выводами;
  • монадический интерфейс для std::expected;
  • static_assert(false) и прочее.

И прорабатывал новые фичи C++26:

  • std::get и std::tuple_size для агрегатов;
  • #embed;
  • получение std::stacktrace из исключений;
  • stackful-корутины.

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

Впереди 14 февраля. Можно спорить об уместности этого праздника в наших краях, а можно направить энергию в мирное русло. Например, откопать ардуину, щедро обсыпать светодиодами и сформовать их во что-то сердечкоподобное. Неубедительно? Согласен. Давайте так: откопаем в дальней коробке макетку на stm32, забудем, что у нас есть готовые библиотеки и подёргаем регистры, выгрызая каждый байт ROM у злобного компилятора. Потом сделаем всё тоже самое, но без фанатизма, с привлечением CMSIS библиотек и сравним результаты. Возможно даже сделаем выводы. Будет код, надругательство над таблицей векторов. Ардуинка тоже будет, куда ж без неё.

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

Сразу скажу, все шаги повторять не нужно. Можно сразу перейти к схеме и проекту :)

Несколько лет назад Мосэнергосбыт устновил у меня в квартире новый электросчетчик "КАСКАД-1-МТ-W1-A1-230-5-60A-S-OV3".

КАСКАД-1-МТ-W1-A1-230-5-60A-S-OV3
КАСКАД-1-МТ-W1-A1-230-5-60A-S-OV3

Из внешних интерфейсов у этого счетчика есть только оптопорт.

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

Предисловие

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

Подсистема памяти - это часть т.н. C Runtime или CRT, отвечающая за работу с памятью. Библиотека CRT служит посредником между прикладной программой и ядром операционной системы. Соответственно, её внешним интерфейсом является “стандартная библиотека С”, внутренний интерфейс специфичен для конкретной ОС.

А почему нельзя доверить выделение памяти ОС, у неё и аппаратная поддержка есть? Причин несколько

Все уже слышали, что openAI выпустили в свет свою новую нейросеть-асистента, так что я решил попробовать на что она способна и описать свой опыт взаимодействия с этим.. Этой... Сущностью.

Разговор будет вестись как с человеком в вежливой форме, так как оказалось, что нейросеть очень хорошо запоминает = )

Начнём с чего-то простого, попросим сгенерировать на языке CMake простую программу

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

Всё началось с безобидного пролистывания GCC расширений для C. Мой глаз зацепился за вложенные функции. Оказывается, в C можно определять функции внутри функций:

int main() {
    void foo(int a) {
        printf("%dn", a);
    }
    for(int i = 0; i < 10; i ++)
        foo(i);
    return 0;
}

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

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

Как оценить реальную производительность своего кода - 1


Код, который мы пишем, и который будет исполнен процессором, — две разные вещи. На уровне ассемблера существует миллион вариантов, в каком виде интерпретировать и запустить высокоуровневые команды. Более того, современные компиляторы сильно оптимизируют код, а результат этой оптимизации похож на магию.
Читать полностью »

Пишем Hex Viewer для Flipper Zero - 1

Примерно месяц назад основная поставка Flipper'ов таки доехала до России. Вопреки моим ожиданиям, это не вызвало волну публикаций про создание приложений под него. Хорошие публикации есть (например, эта и вот этаЧитать полностью »

Самое очевидное объяснение: индекс — это смещение относительно начала массива. Так элементы массива легче адресовать в памяти.

Проверим это на C.

#include <stdio.h>
int main()
{
    int data[3] = {1, 2, 3};
    int i = 0;
    printf("Array address: %pn", data);
    do {
        printf("Array[%u] = %pn", i, (void *)(&data[i]));
        i++;
    } while(i < 3);
}

Получим результат:

Array address: 0x7ffd7c514a6c
Array[0] = 0x7ffd7c514a6c
Array[1] = 0x7ffd7c514a70
Array[2] = 0x7ffd7c514a74

Как первый (нулевой) элемент, так и сам массив находятся по одному и тому же адресу, поскольку 0-й элемент удалён на 0 элементов от начала. Эта связь между указателями и массивами в C настолько тесная, что их даже можно рассматривать вместе.

Однако это ответ на вопрос «зачем», а не «почему». Нумеровать массивы с нуля стали не сразу. Удивительно, но развитие такого простого вопроса не умещается в предложении или абзаце.
Читать полностью »


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