• Для чего нужна двойная ссылка &&?

    Это называется rvalue reference
    Ответ написан
    Комментировать
  • Как ускорить алгоритм скользящего среднего?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const movingAverage = (data, windowSize) => {
      let sum = data.slice(0, windowSize).reduce((acc, cur) => acc + cur, 0);
      const result = [sum / windowSize];
      for (let i = windowSize; i < data.length; i += 1) {
        sum = sum - data[i - windowSize] + data[i];
        result.push(sum / windowSize);
      }
      return result;
    };
    console.log(movingAverage([9, 3, 2, 0, 1, 5, 1, 0, 0], 3));
    // Array(7) [ 4.666666666666667, 1.6666666666666667, 1, 2, 2.3333333333333335, 2, 0.3333333333333333 ]
    Ответ написан
    2 комментария
  • Что нужно изучать по алгоритмам?

    includedlibrary
    @includedlibrary
    Вот книга "Алгоритмы: построение и анализ"
    Ответ написан
    8 комментариев
  • Как происходит доступ к эл. массива на уровне ядра? Malloc выделяет непрерывную физическую память?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как происходит доступ к эл. массива на уровне ядра?

    Так же как и на уровне приложения -- через трансляцию виртуального адреса в физический.

    Например массив Int* arr = new int[1024*1024*1024] он как храниться?

    Если мы для определённости возьмём linux, то у ядра есть несколько разных способов выделения памяти, в зависимости от того, для чего эта память выделяется. Есть наиболее простой и стандартный kmalloc который выделяет память непрерывную как виртуально так и физически. Обычно этим механизмом нельзя выделить большой непрерывный кусок. Есть vmalloc, который выделяет непрерывную виртуально, но возможно прерывную физически память. Есть get_free_pages который выделяет непрерывные страницы физической памяти, возможно, не отображаемые ни в какие виртуальные адреса. Есть Contiguous Memory Allocator который при старте системы резервирует кусок непрерывной физической памяти и может аллоцировать оттуда куски по запросу.
    Важный момент состоит в том, что аллокации делаемые ядром linux через упомянутые интерфейсы всегда обеспечиваются физической памятью, у памяти ядра нет пейджинга.

    А физическая, для массива то же? Ведь, так будет доступ намного быстрее?

    Почему быстрее? С точки зрения процессора всё равно будет трансляция виртуального адреса в физический, если повезёт -- попадание в TLB, если не повезёт -- ходить по каталогам и таблицам страниц в памяти.

    получается эмулятор каждый адрес вычислять что ли?

    Простой эмулятор -- да, наверно. Умный эмулятор может кешировать эту информацию, например именно это свойство даёт QEMU большую часть его Q.
    Ответ написан
    Комментировать
  • Как реализовать опциональные колбэки?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Раз Unit - интерфейс, то заведи метод OnPlace, но у базового класса Unit он просто будет пустым. Т.е. вызывай его всегда. А конкретный Unit реализует то, что ему надо.
    Дженерик тут вообще не нужен. Просто внутри метода Unit проверяй, какой объект вызывал метод

    Пример на Delphi
    type
      IUnit = interface;
    
      ILane = interface
        ['{494F502B-7659-4C5F-B72A-B6BFBF67F9B7}']
        procedure Place(Item: IUnit);
      end;
    
      IGroundLane = interface(ILane)
        ['{02D598FF-2AA9-4752-B808-44F8FE909B7B}']
      end;
    
      IUnit = interface
        ['{4EB084E7-9F79-40B6-92C0-A1A8C794F025}']
        procedure OnPlace(Sender: ILane);
      end;
    
      TUnit = class(TInterfacedObject, IUnit)
        procedure OnPlace(Sender: ILane); virtual;
      end;
    
      TMyUnit = class(TUnit)
        procedure OnPlace(Sender: ILane); override;
      end;
    
      TLane = class(TInterfacedObject, ILane)
        procedure Place(Item: IUnit);
      end;
    
    impl
    
    { TUnit }
    
    procedure TUnit.OnPlace(Sender: ILane);
    begin
      // do nothing
    end;
    
    { TLane }
    
    procedure TLane.Place(Item: IUnit);
    begin
      //add item
      Item.OnPlace(Self);
    end;
    
    { TMyUnit }
    
    procedure TMyUnit.OnPlace(Sender: ILane);
    var
      Lane: IGroundLane;
    begin
      if Supports(Sender, IGroundLane, Lane) then
        // it's IGroundLane
    end;
    Ответ написан
    Комментировать
  • Как повернуть квадратную матрицу?

    0xD34F
    @0xD34F
    class Solution:
      def rotate(self, matrix: List[List[int]]) -> None:
        length = len(matrix)
        for i in range(0, length // 2):
          for j in range(i, length - i - 1):
            matrix[i][j], \
            matrix[j][length - i - 1], \
            matrix[length - i - 1][length - j - 1], \
            matrix[length - j - 1][i] \
            = \
            matrix[length - j - 1][i], \
            matrix[i][j], \
            matrix[j][length - i - 1], \
            matrix[length - i - 1][length - j - 1]
    Ответ написан
    1 комментарий
  • Достаточно ли будет чтения cppreference для освоения STL?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Не слишком понятно, что имеется ввиду под "освоением STL". Это всего лишь библиотека языка. Вам надо знать, грубо говоря, что в ней есть в плане возможностей. А уж потом, по мере необходимости, идти и читать документацию.

    Проще говоря, допустим случай, когда вам надо отсортировать массив. Зная, что в STL есть и класс для массива и методы сортировки, вы идёте и читаете документацию, а потом используете. cppreference -- отличный ресурс с примерами.

    Я помню читал одну относительно тоненькую книгу по STL когда-то. Вроде бы неплохая была. Сейчас уже наверно устарела: "STL tutorial and reference guide" by David R. Musser .
    Ответ написан
    Комментировать
  • Конструктор не создает переменную внутри класса. что делать?

    GavriKos
    @GavriKos
    Пространство видимости. Ващ massive объявлен в конструкторе, а не в классе. Поэтому в function он не доступен.
    Ответ написан
    5 комментариев
  • Почему программа требует константу?

    @res2001
    Developer, ex-admin
    Наверное стоит обратится к учебнику по Си почему именно так.
    Изначально автоматические массивы в Си имели фиксированный размер, т.е. размер надо задавать константой.
    Отличие константы от обычной переменной - компилятор в процессе компиляции знает значение константы, а значение переменной нет. В процессе компиляции компилятор может сгенерировать команды для выделения памяти под массив.

    Начиная с С99 (это такой стандарт Си от 1999 года) появились VLA (Variable Length Array). Синтаксис такой же как и у обычных массивов, но они могут иметь изменяемый размер, т.е. размер можно задавать обычной переменной.
    Использование VLA влечет дополнительные расходы времени выполнения, поэтому многие принципиально не используют эту возможность (например ядро Linux). И это вполне оправданно еще и потому, что память под VLA массивы выделяется на стеке, пространство стека ограничено, а вы с дуру можете там выделить слишком большой массив, что вызовет переполнение стека.

    Большинство компиляторов поддерживают VLA, но судя по ошибке, вы используете микрософтовский компилятор. Микрософт никогда не славилась поддержкой стандартов Си. VLA в ее компилятор не завезли до сих пор.
    Ответ написан
    Комментировать
  • Почему программа требует константу?

    MvcBox
    @MvcBox
    Software Developer [C/C++/JS(for Node.js)/etc]
    Потому, что массив "block" живет на стеке и компилятору надо знать его размер еще на этапе компиляции, чтобы правильно посчитать смещения. Если на этапе компиляции Вы не знаете сколько вам может потребоваться памяти, используйте malloc() для ее выделения в куче.
    Ответ написан
    2 комментария
  • Какой подход использовать в многопоточном программировании на Си?

    includedlibrary
    @includedlibrary
    Можно. Макросы генерируют код, после чего он компилируется. Проблемы с многопоточностью могут возникнуть только в случае, если вы сделаете макрос, который генерирует не потокобезопасный код
    Ответ написан
    2 комментария
  • Как построчно сравнить два файла txt?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Первое. Тема топика Python + PowerShell. Тоесть непонятно тебе нужно программировать и развивать этот софт или решить задачу 1 раз и забыть. В зависимости от желания - будет разная реализация.

    Второе. Есть коробочные утилиты fc (Windows) diff (Linux) которые такое сравнение делают. Но обычно для исходников и при условии что изменений мало. Почитай про них. Возможно это частично решит твою задачу.

    Третье. Ты хочешь сравнивать одну строку со всеми из другого файла. Это декартово произведение. В данном случае тебе можно сортировать оба файла и тогда одинаковые значения будут кластеризованы рядом. Sort + Diff решают твою беду.

    Вобщем думай. Но лучше 1 раз сделай покрывающий пример двух файлов. И результат чего надо на выходе. Это сэкономит время.
    Ответ написан
    1 комментарий
  • Существует ли формула позволяющая определить какое из двух чисел является самым большим?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Максимум:

    ( a + b + sqrt(  ( a - b ) * ( a - b ) ) ) 
    ___________________________________________
                         2


    Чтобы получить минимум, надо перевернуть знак перед корнем:

    ( a + b - sqrt(  ( a - b ) * ( a - b ) ) ) 
    ___________________________________________
                         2


    Где SQRT - взятие корня квадратного

    Код на плюсиках:
    int32_t TheMadMax( const int32_t a, const int32_t b ) 
    {
        const int32_t alpha = ( a - b );
        const int32_t beta  = alpha >> 31;
        const int32_t gamma = ( alpha ^ beta ) - beta;
        return ( a + b + gamma ) >> 1;
    }


    Референс
    Ответ написан
  • Как хранить два натуральных числа в одном, не превышающем их произведение (границы множества чисел для обоих из чисел известны)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    все это не подходит, так как мне нужно чтобы полученное число c лежало в промежутке [0; 11]


    Ну так a * (max(b) + 1) + b же.
    Иными словами мы делаем двузначное число в позиционной системе исчисления с неравными весами разрядов, младший разряд -- b, старший разряд -- a. Вес младшего разряда -- 1, вес старшего -- max(b) + 1.
    Ответ написан
    6 комментариев
  • Как хранить и сравнивать локации?

    vabka
    @vabka
    Токсичный шарпист
    Во многих СУБД есть расширения для работы с пространственными и гео-данными.
    Например в postgres - PostGIS.
    Тебе нужно просто для каждого пользователя определить геолокацию как широту-долготу, а поиск в определённом радиусе уже будет реализован в postgis.

    Это будет сильно быстрее чем "сравнить всех со всеми" благодаря специальным индексам
    Ответ написан
    Комментировать
  • Задание создания динамического массива до первого отрицательного числа, как это сделать?

    @res2001
    Developer, ex-admin
    Лучше использовать std::vector. Просто вводите числа в промежуточную переменную. После ввода каждого числа проверяете отрицательно ли оно, если нет, то добавляете число в вектор. Если число отрицательное и вектор не нулевого размера, то сортируете вектор с помощью std::sort и выводите вектор на экран. Все.

    Вместо вектора можно использовать и "сырые" Си массивы в динамической памяти. Алгоритм тот же, но при добавлении каждого нового числа вам нужно выделить новый массив большего размера, скопировать содержимое старого в новый, старый удалить. Для перевыделения массива можно использовать realloc(), она выполняет все эти операции. Вектор скрывает эти операции от вас и делает все то же самое, но без вашего участия, так же в векторе есть оптимизация, позволяющая делать меньше перевыделений памяти.
    Ответ написан
    Комментировать
  • Как получить вывод команды с терминала в переменную?

    @res2001
    Developer, ex-admin
    Через файл - это самый простой вариант.
    Более технологичный вариант - запускать процесс с перенаправлением потоков stdin/stdout/stderr в каналы (pipe).
    В этом случае можно в режиме "on-line" получать вывод от запущенного приложения и генерировать вход для приложения. Этот сложнее, но дает гораздо больше гибкости в работе с запускаемым процессом.
    Ответ написан
    Комментировать
  • Почему возникает ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    invalid abstract return type ‘Axis<unsigned int>’
    Почему возникает ошибка?

    Потому что Axis<unsigned int> -- абстрактный тип, а ты пытаешься вернуть объект такого типа.
    Скажи, что конкретно в сообщении об ошибке непонятно?
    Что с этим делать?
    - если тип не должен быть абстрактным -- смотреть в его иерархию наследования, искать недоопределённые чистые виртуальные функции и определять их или выкидывать.
    - если тип должен быть абстрактным -- пересмотреть свои взгляды на жизнь и начать возвращать либо ссылки, либо указатели на объекты абстрактного типа.
    Ответ написан
  • Как правильно вывести/считать double C++/python?

    @lz961
    python
    D = ...
    print(f'{D:16.10e}')


    C
    D = ...
    printf("%16.10e", D);
    Ответ написан
    Комментировать
  • Как исправить ошибку линковки undefined reference?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Команда сборки:
    D:\mingw\mingw64\bin\g++.exe -fdiagnostics-color=always -g D:\running\code\parser.cpp -o D:\running\code\parser.exe

    Прости, но как по-твоему mingw должен из этой команды понять, что ты используешь какую-то библиотеку и слинковаться с ней?
    Тебе надо выполнить шаги по сборке библиотеки, а потом добавить её в свою команду сборки, типа того:
    D:\mingw\mingw64\bin\g++.exe -fdiagnostics-color=always \
    -g D:\running\code\parser.cpp \
    -L<путь куда ты установил libgq> -lgq \
    -o D:\running\code\parser.exe


    И я подозреваю, что поскольку gumbo-query это обёртка для gumbo, то когда ты успешно слинкуешься с libgq тебе прийдётся повторить эти шаги и для gumbo.
    Ответ написан
    1 комментарий