• С чего начать, чтобы написать свою библиотеку по загрузке бинарника в микроконтроллер?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    У твоей задачи есть как минимум два решения. Одно, попроще: взять готовую программу прошивки, посмотреть, как она работает, написать библиотеку реализующую то же самое. Другое, посложнее: начать со спецификации контроллера который ты собираешься прошивать и раскручивать зависимости с той стороны. Поскольку ни то, ни другое решение сами по себе большого смысла не имеют (потому что есть уже программы для прошивки), тебе надо решить, чего ты сам хочешь получить от этого упражнения.

    Есть, может, какие-то специальные книги по этой теме?

    Спецификации на контроллер, а недостаток большой картины можно покрыть википедией и всяким osdev.org
    Ответ написан
    Комментировать
  • Возможно ли как-то использовать обычную функцию заместо макро-функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    #define BIT_SET(port, bit) (port |= (1 << bit))
    
    int main(void)
    {
        BIT_SET(PORTB, PORTB0);
    }


    вот такой вариант, с макро-функцией, работает, так как это просто текстовая замена

    Он работает, потому что с таким определением BIT_SET PORTB не может быть определён просто как 0x04. Потому что просто текстовая замена 0x04 |= 1 << 0 не имеет смысла. Он определён как volatile ссылка на память с адресом 0x04. Когда ты научишься передавать ссылку на такую память в функцию, функция тоже начнёт работать.
    Ответ написан
    3 комментария
  • Возможно ли как-то использовать обычную функцию заместо макро-функции?

    Vindicar
    @Vindicar
    RTFM!
    bit_set() принимает аргумент по значению, т.е. принимает его копию. От того, что эта копия изменена внутри функции, снаружи ничего не поменяется. А раз других побочных эффектов у функции нет, компилятор удаляет её вызов.
    Макрос же после всех подстановок сделает просто присваивание указанной переменной. Тут побочный эффект есть.
    Ответ написан
    4 комментария
  • Как ускорить чтение строк из файла?

    egor_nullptr
    @egor_nullptr Куратор тега C
    mmap + ручной разбор, получилось примерно в 10 раз быстрее, чем fgets + sscanf
    Код

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    #include <sys/mman.h>
    #include <unistd.h>
    
    int main(int argc, char** argv)
    {
        int fin = open(argv[1], O_RDONLY);
        struct stat finfo = {0};
        fstat(fin, &finfo);
        char *map = mmap(0, finfo.st_size, PROT_READ, MAP_SHARED, fin, 0);
    
        char src[4] = {0};
        char dst[4] = {0};
        int cost;
        int i;
        int off = 0;
    
        while (off < finfo.st_size)
        {   
            memcpy(src, map + off, 3); 
            memcpy(dst, map + off + 4, 3);
            i = 0; 
            cost = 0;
            while (map[off + 8 + i] != 10) { 
                cost = cost * 10 + map[off + 8 + i] - 48;
                ++i;
            };
            off += 9 + i;
        };
    
        munmap(map, finfo.st_size);
        close(fin);
    
        return EXIT_SUCCESS;
    }

    Ответ написан
    2 комментария
  • Как вывести боди в зависимости от типа?

    WblCHA
    @WblCHA
    Можно, конечно, написать красивее, но там сам тип тогда править надо.

    function handler<T extends C["type"]>(type: T, body: Omit<C & { type: T }, 'type'>) {}
    Ответ написан
    Комментировать
  • Как браузер выполнить наложение эти стилей в данном случае?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    Длинный ответ:
    https://developer.mozilla.org/ru/docs/Web/Performa...

    Короткий ответ:
    Для каждого узла найдёт соответствующие правила и применит наиболее приоритетное из них. В данном случае - из медиа. А вот эта формулировка "сначала одно потом другое" - лишена смысл. Файл само собой читается последовательно, а не все строки одновременно.

    Браузер сначала задаст высоту 30, а потом 60, тем самым вызвав два рефлоу?

    Рефлоу - это когда уже страница была отрисована. На первичной отрисовке это, по идее, произойдёт в первом случае при построении render tree(title в него не попадёт, так как display: none), во втором, при компоновке. Но в обоих случаях до первичной отрисовки.

    То есть куда улчше было бы использовать еще и media min-width?

    Зачем намеренно утяжелять дерево стилей?
    Ответ написан
    7 комментариев
  • Когда вы используете type, а когда - intefcace, в React?

    @uroot
    У нас на галере юзают interface когда нужно описать объект, например объект пропсов или стейта. Через interface это проще.

    А type юзают для какой-то отдельной переменной, допустим значение этой переменной может быть строго определённым, например "error" | "warning" | "good". Тогда как я и написал юзают type.
    Ответ написан
    Комментировать
  • Когда вы используете type, а когда - intefcace, в React?

    profesor08
    @profesor08
    Если надо описать некоторый перечень значений, то type:

    type ResponseStatus = "error" | "success";

    Если надо описать объект, то intefcace:

    interface ApiResponse {
        status: ResponseStatus;
    }


    И никто не запрещает написать через type:

    namespace Api {
        type Status = "error" | "success";
    
        type Response = {
            status: Status;
        };
    }
    Ответ написан
    1 комментарий
  • Есть ли разница в том, как проверить наличие window в js?

    @wonderingpeanut
    Это связано с тем, что html документ формируется на сервере. Как ты сам сказал, на сервере нет window объекта, поэтому он и ругается.

    Сделай
    const [isMobile, setIsMobile] = useState(undefined);

    и при загрузке страницы измени стейт в нужное тебе значение (юзефект)
    const [state,setState] = useState();
    useEffect(() => {
      if (typeof window !== 'undefined')
        setState(...)
    }
    Ответ написан
    3 комментария
  • Как можно использовать Proxy в react?

    Alexandroppolus
    @Alexandroppolus
    кодир
    MobX, 6 версия
    Ответ написан
    Комментировать
  • Как из строковых литералов сделать тип массива?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    В TS есть 2 варианта итерироваться по частям юнион типа - это условные типы и итерация по ключам, притом итерация по ключам ограничена типом number | string | symbol

    Условные типы проверяют условие для каждого варианта юниона, а значит позволяют трансформировать каждый из вариантов по отдельности:
    type MyFunc = <N extends string>() => (N extends string ? Field<N> : never)[];
    но возвращаемый тип так же будет юнионом:({ name: "town" } | { name: "city" })[]

    Сделать кортежный тип из юниона не выйдет, так как в юнионе не определен порядок, тип "town" | "city" это тоже самое, что и тип "city" | "town".
    Но можно сделать кортеж из кортежа:
    type MyFunc = <N extends string[]>() => {
        [K in keyof N]: N[K] extends string ? Field<N[K]> : never;
    };
    
    myFunc<["town", "city"]>()


    Ну и в реальном коде гораздо удобнее, когда дженерик выводится из аргументов, а для того что бы TS сам вывел кортежный тип из абстрактного массива, данный массив нужно помечать as const, что так же делает его readonly массивом. Но принимать аргументы через readonly там где нам не нужно их мутирорвать - это вообще хорошая практика. Полный пример будет выглядеть так:
    https://www.typescriptlang.org/play?#code/C4TwDgpg...
    Ответ написан
    Комментировать
  • Unity. Взаимодействие с объектами?

    GavriKos
    @GavriKos Куратор тега Unity
    Нужно смотреть скрипты, которые на второй сцене. Какой то из них (возможно даже стандартный юнитевый) прячет курсор.
    Ну и убедитесь что у вас нигде нет чего то вроде Screen.showCursor или Cursor.visible
    Ответ написан
    2 комментария
  • C#. Что лучше: PictureBox или Paint?

    yudinikita
    @yudinikita
    Инженер-программист из России
    Я считаю, что нужно сначала пытаться отобразить шарики изображением, а если по какой-либо причине картинки не загрузились, то рисовать их.
    1. Создаем переменную с изображением
    Bitmap ImageBall;
    2. При инициализации формы с игрой пытаемся загрузить в эту переменную изображение
    try
    {
        ImageBall = new Bitmap("путь до изображения");
    }
    catch (Exception ex)
    {
        MessageBox.Show(@"Не удалось загрузить: " + ex.Message, @"Ошибка при загрузке изображений!");
    }

    3. Во время генерации шарика, мы проверяем, что изображение загрузилось, иначе рисуем сами
    Bitmap bmp = new Bitmap(50,50);
    Graphics gr = Graphics.FromImage(bmp);  // это пространство на котором рисуется игра
    Rectangle rect = new Rectangle(0,0,50,50); // размер шарика
    if(ImageBall == null) // если картинка не загрузилась
    {
        gr.DrawEllipse(new Pen(Color.Black), rect); // рисуем круг
    }
    else
    {
        gr.DrawImage(ImageBalls, rect); 
    }

    5. Помещаем в PictureBox наш шарик нарисованный или с картинкой
    pictureBox1.Image = bmp
    Ответ написан
    4 комментария
  • C#. Как сохранить информацию между формами Windows Form?

    petermzg
    @petermzg
    Самый лучший программист
    Вариантов полно:
    1. Передать ссылку на экзепляр класса основного окна формы, через конструктор при создании другого окна.
    2. Передать делегат на функцию, также через конструктор
    3. В классе зависимого окна создать event и подписаться на него после создания.
    и т.д.
    Ответ написан
    4 комментария
  • Как в c# сделать так, чтобы ввод с клавиатуры запоминался в одну строчку?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    нет прямых аналогов, строку придется парсить
    к примеру Split через пробел (ну или ожидаемый набор возможных разделителей), и парсинг ожидаемых типов значений, типа Int32.TryParse (метод реализован для всех основных числовых типов)
    Ответ написан
    Комментировать