Задать вопрос
  • Что такое обратный вызов в программировании?

    Griboks
    @Griboks
    Когда функция выполняется долго, нет смысла ожидать её завершения (визуально это будет выглядеть как зависший браузер, и пользователь закроет сайт). Поэтому ей передают callback, мол, сама сообщишь, когда закончишь работу.
    Ответ написан
    Комментировать
  • Что такое обратный вызов в программировании?

    Обратный вызов (англ. callback) — это ещё одна функция, которую вызовут «потом».

    Бытовой аналог – когда отправляешь в письме на радиостанцию пустой конверт со своим же адресом и марками, чтобы в нём прислали ответ.

    Обычно это нужно при асинхронном выполнении — когда строчки кода не последовательно выполняются одна за другой, а запускается (и отпускается) какая-то долгая задача и ещё неизвестно, когда она закончится.

    Например, нужно выполнить HTTP запрос к далёкому серверу и получить от него ответ.

    Тогда в функцию, которая займётся общением с далёким сервером, передают не только параметры запроса, но и callback-функцию, которая будет вызвана после получения ответа, с данными из ответа.
    Ответ написан
    1 комментарий
  • Что такое обратный вызов в программировании?

    bingo347
    @bingo347
    Crazy on performance...
    Что такое обратные вызовы?
    Я знаю только что это функция которая передается как аргумент в другую функцию.
    В принципе, можно и так сказать. Если быть более точным - это вызов функции переданной в качестве аргумента.
    Почему они так называются?
    Это игра слов. На английском callback - это не только обратный вызов, но и обратный звонок (по телефону). Данная абстракция позволяет вызываемому коду вызвать вызывающий код, подобно тому как собеседник может перезвонить Вам позднее, если Вы сообщите ему куда.
    В чем их смысл и зачем нужны?
    В принципе я уже ответил, они нужны для возможности вызываемому коду вызвать вызывающий код. Это позволяет строить высокоуровневые абстракции, вроде обобщенных функций или асинхронных функций.
    Обобщенные функции позволяют не писать однотипный код, снижая тем самым вероятность ошибок, а с помощью обратных вызовов они могут принимать в себя фрагменты кода, которые могут меняться от использования к использованию. Для примера, абстрагируем цикл от 0 до n на C:
    // абстракция цикла
    void each(int n, void (*callback)(int, void*), void* closure_data) {
      if(n <= 0) { return; }
      for(int i = 0; i < n; i++) {
        (*callback)(i, closure_data);
      }
    }
    
    // колбэк - тело цикла, вариант 1
    void cb_body1(int i, void*) {
      printf("%d", i);
    }
    
    // колбэк - тело цикла, вариант 2
    void cb_body2(int i, void* acc) {
      int* normalized_acc = (int*)acc;
      *normalized_acc += i;
    }
    
    int main() {
      each(10, cb_body1, null); // напечатает строки 0, 1, ...9
    
      int result = 0;
      each(10, cb_body2, &result); // посчитает в result сумму чисел от 0 до 9
      printf("%d", result);
      return 0;
    }

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

    Так же стоит заметить, что во многих высокоуровневых языках наряду с обратными вызовами используется механизм замыканий, который позволяет объявлять функции внутри других функций и захватывать окружающие переменные. Но нужно понимать, что это лишь компиляторный сахар, и на самом деле в функцию просто передаются указатели на захваченные переменные в качестве аргументов, подобно тому, как я сделал это руками в примере выше, с помощью аргумента closure_data в функции each. Обычно компилятор создает для этого анонимные структуры (C++, Rust) или анонимные классы (C#), которые хранят указатель на функцию и указатели на окружение. А в некоторых языках, например в js, замыкания возведены в абсолют, и каждая функция является замыканием.
    Ответ написан
    2 комментария
  • Шифрование с открытым ключом. Что такое ключ?

    Stalker_RED
    @Stalker_RED
    Я просто оставлю это здесь.
    Ответ написан
    Комментировать
  • Каково назначение команды ORG в Assembler?

    demimurych
    @demimurych
    В мс дос при запуске com файла первые 100H байт перед запущенным кодом резервируется под разного рода управляющие структуры. Потому вся адресация внутри кода должна начинаться с смещением 100H байт.
    Директива org 100H как раз и говорит компилятору что всю адресацию внутри кода нужно сместить именно на эти 100H байт.

    т.е. например у тебя в коде есть область где ты собираешься что то хранить которую ты обьявляешь например
    data1 DB 30h

    которую внутри кода ты адресуешь как
    mov ax,OFFSET Data1

    при компиляции структура OFFSET Data1 преобразовывается в конкретный адрес к которому прибавиться значение из org
    Ответ написан
    3 комментария
  • Остаток от деления на 1?

    sgjurano
    @sgjurano
    Разработчик
    % — это операция взятия остатка от деления, а не частного. Остаток от деления любого целого числа на 1 равен 0, поскольку любое целое число можно представить в виде суммы единиц, а 1 делится на 1 без остатка.

    Пример:
    3 % 1 = 3 (mod 1) = 1 + 1 + 1 (mod 1) = 0 + 0 + 0 = 0
    Ответ написан
    1 комментарий
  • Как откатить средства сборки проекта?

    @kokapuk Автор вопроса
    Нашел ответ, нужно просто сменить набор инструментов для платформы.
    Проект > Свойства > Общие > Набор инструментов для платформы
    Ответ написан
    1 комментарий
  • Стоит ли бэкенд разработчику знать как работает Интернет?

    @RaGe22
    Курс по основам
    Понадобится больше, поймете куда копать

    https://youtu.be/OLFA0soYGhw
    Ответ написан
    Комментировать
  • Sql-ex какие особенности у проверочной бд "Компьютерная фирма"?

    @BorisKorobkov
    Web developer
    Вы забыли условие "... у которых есть продукты с известной ценой хотя бы в одной из таблиц..."

    То есть надо:
    select 
      maker,
      max(l.price) as laptop,
      max(pc.price) as pc,
      max(r.price) as printer
    from 
      Product t
      left join Laptop l 
        on t.model=l.model
      left join PC 
        on t.model=pc.model
      left join Printer r 
        on t.model=r.model
    group by 
      maker
    having
    	max(l.price) IS NOT NULL
    	OR max(pc.price) IS NOT NULL
    	OR max(r.price) IS NOT NULL
    Ответ написан
    Комментировать