Задать вопрос
  • Как "выпрямить" кольцевой буфер c ограниченной доп.памятью?

    jcmvbkbc
    @jcmvbkbc
    Руслан ., это не опечатка, выглядит ровно так как и должно выглядеть, мало того, даже работает, в чём несложно убедиться.
    Написано
  • Какой приоритет операций, разворачивающихся из fold-expression?

    jcmvbkbc
    @jcmvbkbc
    где можно посмотреть изменения в variadic template между 11 и 17 версией плюсов? Пытался разглядывать два стандарта, но дифф так и не осилил построить

    Ближайшее что я знаю -- это https://github.com/cplusplus/draft Там, правда, нет c++11.
    Ну и можно почитать https://www.open-std.org/JTC1/SC22/WG21/docs/papers/ , но для этого надо дофига времени и желания.
    Написано
  • Как "выпрямить" кольцевой буфер c ограниченной доп.памятью?

    jcmvbkbc
    @jcmvbkbc
    Наколеночный бенчмарк показал, что ваш вариант примерно в 2-2.5 раза быстрее что на мелких массивах, что на больших.

    Круто. И чувсвтуется, что у этого алгоритма ещё есть потенциал для дальнейшей оптимизации векторизацией.
    Написано
  • Как "выпрямить" кольцевой буфер c ограниченной доп.памятью?

    jcmvbkbc
    @jcmvbkbc
    У этой задачи есть ещё одно прикольное решение:
    static void reverse(int *a, int n)
    {
        int i, j;
        for (i = 0, j = n - 1; i < j; ++i, --j) {
            std::swap(a[i], a[j]);
        }
    }
    
    void shift_left(int *a, int n, int k)
    {
        k %= n;
        reverse(a, k);
        reverse(a + k, n - k);
        reverse(a, n);
    }
    Написано
  • Можно ли как-то короче доказать этот факт?

    jcmvbkbc
    @jcmvbkbc
    если подстановка переменной это что-то совсем простое, как например, отнять по X с обоих частей уравнения и объясняется в одно утверждение, то я как раз и хотел понять в какое

    floppa322, подстановка -- это переход от рассмотрения всех пар (x, y) в уравнении g(x, y) = 0 к рассмотрению только тех, которые удовлетворяют условию f(x, y) = 0.
    Написано
  • Как link`овать fasm + c(++)?

    jcmvbkbc
    @jcmvbkbc
    сменил -m16 на -m32 и всё скомпилировалось, запустилось, но при вводе команды hello VM зависает

    Zailox, тут без шансов, 32-битный код в реальном режиме работать не будет, разве что по по случайному совпадению.
    Написано
  • Как link`овать fasm + c(++)?

    jcmvbkbc
    @jcmvbkbc
    судя по сохраненному temp файлу он ругается на .cfi_offset 3, -12

    Zailox, ok, мне gcc таких смещений не генерирует, всё это барахло можно отключить добавив опцию -fno-asynchronous-unwind-tables в командную строку gcc. Я запушил патч с этим изменением в репу из ответа.
    Написано
  • Как загрузить VirtualBox EFI в QEMU?

    jcmvbkbc
    @jcmvbkbc
    -drive if=pflash,file=Downloads/VBoxEFI64.fd,readonly=true

    что такое Downloads/VBoxEFI64.fd и чего ты от этой командной строки ожидаешь, что x86_64 вдруг возьмёт и загрузится с параллельного FLASH-чипа?
    Написано
  • Как link`овать fasm + c(++)?

    jcmvbkbc
    @jcmvbkbc
    сейчас протестирую.

    Zailox, как успехи?
    Написано
  • Как link`овать fasm + c(++)?

    jcmvbkbc
    @jcmvbkbc
    мне главное из под ассемблера запустить уже другое ядро, на Си

    Zailox, для этого ассемблер-то и не нужен. Можно собрать свой код как multiboot приложение и загружать его напрямую в QEMU или с помощью u-boot на реальном железе. Или как UEFI приложение. В обоих случаях код приложения стартует сразу в защищённом режиме.
    Написано
  • Дерево файлов основаное на RecyclerView. После открытия папки, все ниже уходит на 0 уровень. Как исправить?

    jcmvbkbc
    @jcmvbkbc
    Сначало говорят что надо минимум кода, а потом весь)

    Xedox SlimeLime, если ты не можешь привести минимальный достаточный пример -- приводи весь код. Лишнее можно проигнорировать, недостающее додумать гораздо сложнее.

    Я уже решил проблему

    Об этом тоже стоило бы написать.
    Написано
  • Как link`овать fasm + c(++)?

    jcmvbkbc
    @jcmvbkbc
    Zailox, написал ответ.
    Написано
  • А return 0(1) * _getch(), есть ли смысл от такой конструкции?

    jcmvbkbc
    @jcmvbkbc
    А ещё 0*что то может быть выкинуто при оптимизации и никакого ожидания ввода не останется.

    rPman, не может оптимизатор выкинуть вызов функции о которой ничего неизвестно.
    Написано
  • Как link`овать fasm + c(++)?

    jcmvbkbc
    @jcmvbkbc
    я починил эту ос, теперь хотел понемногу добавлять C

    Zailox, поделись ссылкой на код?
    Написано
  • Как link`овать fasm + c(++)?

    jcmvbkbc
    @jcmvbkbc
    Zailox Если ты приведёшь пример в котором ты хочешь сделать такую линковку я могу показать как это сделать конкретно в твоём примере.
    Написано
  • Запись только в конец файла?

    jcmvbkbc
    @jcmvbkbc
    Vitsliputsli, флаг "a" для fopen() транслируется в флаг O_APPEND для open(), который гарантирует, что запись всегда происходит в конец файла, вне зависимости от внешних воздействий на этот файл. См. https://man7.org/linux/man-pages/man2/open.2.html
    Написано
  • Интерактивный скрипт с read при запуске системы (debian). Как?

    jcmvbkbc
    @jcmvbkbc
    Во время загрузки не работает интерактивный ввод

    чего это "не работает"? всякие пароли от LUKS на ура интерактивно запрашиваются и вводятся.
    Написано
  • Какой atomic::Ordering нужен в этих ситуациях?

    jcmvbkbc
    @jcmvbkbc
    мы довольно забавно обменялись очевидными фактами

    Eugene Usachev, ок, давай попробуем ещё раз, сначала:

    Предположим, что надо написать Once только с двумя значениями (WasNotCalled = 0, WasCalled = 1). Для метод call может использовать swap и вернуть предыдущее значение. Но какой порядок нужно использовать в этом swap?


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

    Например, если этот once используется, чтобы гарантировать однократную запись в какой-нибудь регистр. Т.е. наблюдение once = 0 говорит о том, что никто не записал и пока не планирует записывать, а once = 1 говорит о том, что запись уже произошла или произойдёт в будущем. Это можно реализовать как CAS 0->1 для once + последующая запись в регистр, если CAS был успешен. Тогда нужно использовать как минимум release при записи в once и consume при чтении из него, чтобы эти две операции синхронизировались друг с другом при исполнении разными агентами. А так же гарантировать, что запись в регистр не будет переупорядочена с записью в once, например барьером между записью в once и записью в регистр.

    Я уверен, что двумя значениями once (0 и 1) нельзя обеспечить одновременно единственность вызова и предоставить информацию о том, что вызов уже совершён. Для этого нужно как минимум три значения.
    Написано
  • Какой atomic::Ordering нужен в этих ситуациях?

    jcmvbkbc
    @jcmvbkbc
    Eugene Usachev, говоря, что для CAS это единственная опция я имел в виду вот что. Acquire говорит о том, что операция чтения должна обозреть произошедшие записи в память, Release говорит о том, что операция записи должна опубликовать произведённые изменения. Поскольку CAS -- это обе эти операции, то для него имееют смысл только Relaxed и Acquire + Release, что эквивалентно SeqCst. Relaxed -- это по сути ничего, ни упорядочивания, ни публикации изменений. Acquire и Release имеет смысл применять поотдельности только тогда, когда между ними есть что-то ещё. Это не твой первый случай (где нужно просто атомарно установить значение 1 если было 0 и вернуть, что было). И это не твой второй случай (где нужно в одном месте атомарно увеличить значение и вернуть что было, а в другом -- атомарно уменьшить).
    Написано