• Какая разница между передачей по указателю и по ссылке?

    @Mercury13
    Программист на «си с крестами» и не только
    О передаче объекта в функцию — обычно ссылка, НО!

    1. Если библиотека живёт на указателях (Qt) — указатель.
    void fillCombo(QComboBox* x) {}  // хорошо
    fillCombo(ui->comboHistory);
    
    void fillCombo(QComboBox& x) {}  // плохо
    fillCombo(*ui->comboHistory);


    2. Если возможен NULL — указатель. НО: существует паттерн «Null object», и он иногда бывает хорош.
    // Хуже, но возможно
    void import(AsyncRunner* asy) {
       if (asy) {
          asy->run([](){
            doImport(x);
          });
       } else {
          doImport(x);
       }
    }
    import(nullptr);
    
    // Лучше
    void import(AsyncRunner& asy) {
      asy.run([](){
        doImport(x);
      });
    }
    import(NoAsync::INST);


    3. Если передаём буфер данных — указатель.
    void write(size_t size, const char* data) {}

    4. Если объект невелик — значение.
    void save(std::string_view fileName) {}

    Объект может быть велик, но для него существуют специальные регистры — тогда…
    void transform(Matrix4 x) {}
    Есть одна машина с такими регистрами, не помню только, какая. Xbox?

    5. Идиома «by value + move», позволяющая избавиться от двух версий функции — Obj(string&) и Obj(string &&). Используется для объектов с простым перемещением и сложным копированием — обычно строк и структур STL.
    Obj::Obj(std::string aName) : name(std::move(aName)) {}
    Ответ написан
    Комментировать
  • Какие ошибки в экранах приложения?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Непонятен смысл журнала, ведь это какая-то новостная лента.
    2. Освещённость в люксах избыточна, ведь Солнце светит одинаково, а люксы зависят от облачности, пыли, времени суток и года. То же самое с влажностью — она производна от других параметров.
    3. Люксы сокращаются как «лк», а мили в русском не стоит сокращать «ми».
    4. Странный диапазон силы ветра, спишем на ограничение.
    5. Слишком много экранного места отдано дому, что имеет смысл лишь если домов несколько.
    6. Непонятен смысл кнопок «Автоматическая настройка» и «Информация».
    7. Настраивать погоду на несколько дней — замучаешься.
    8. Наше «божественное устройство», управляющее погодой, скорее всего имеет какие-то ограничения, и их надо указать.
    9. Тут нужно указывать не просто миллиметры дождя, а его силу. Дождик целый день и большая гроза на полчаса — немного разное.
    10. У вас какой-то мягкий нагскрин, большинство прог, которые я видел, просят оплату наглее.
    Ответ написан
    3 комментария
  • Существует ли структура данных «расширяемая 2D-таблица»?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Пока остановился на таком механизме.
    Есть два одномерных массива — оглавление строк и оглавление столбцов, два одномерных массива — задействованность строк/столбцов, а также двухмерный массив — буфер.

    a[i,j] := buffer[rowIndex[i−i0], colIndex[j−j0]]

    Если в rowIndex[i−i0] замечен маркер незадействованности, находим незадействованную строку и прописываем её в оглавлении.
    Чтобы меньше перевыделять памяти, перевыделение идёт импульсами и с запасом. Например, хотим 20 строк, а выделяем сразу на 30.
    Такой массив способен только расширяться, но этого мне хватает.
    Ответ написан
    Комментировать
  • Это сколько 63 280,4 млн. долл.?

    @Mercury13
    Программист на «си с крестами» и не только
    Миллиарда
    Я бы такому редактору бил по рукам: постороннему читателю надо писать 63,3 млрд долларов.
    Ответ написан
    Комментировать
  • Как заряжать данный аккумулятор?

    @Mercury13
    Программист на «си с крестами» и не только
    Это обычные необслуживаемые аккумуляторы от бесперебойника.
    Автомобильное зарядное катит, но зарядный ток, получается, порядка 3 ампер (а лучше — 1 ампер). Найдётся такой?
    Если соединять вместе — то параллельно, удвоив ток. Хотя лучше поодиночке.
    12 вольт 10 ватт дают чуть меньше ампера, у таких аккумуляторов обычно порядка 7 ампер-часов, и одна лампочка на одном аккумуляторе будет работать 7 часов.
    UPD. Уточнил значение тока.
    Ответ написан
    2 комментария
  • Как записать правило математическими символами?

    @Mercury13
    Программист на «си с крестами» и не только
    ∀i Nkk i= 1 & Li ≤ 8
    Ответ написан
    1 комментарий
  • Аппаратный переключатель раскладки, есть такой в природе?

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

    Может, как-то и можно сделать, чтобы наш переключатель был клавиатурой и передавал какие-нибудь очень нестандартные комбинации клавиш вроде F13 (да, была такая клавиша на какой-то дремучей XT-клавиатуре). Но, во-первых, они должны быть без Shift/Ctrl — иначе бы это конфликтовало с обычной клавой. Во-вторых, на 10-ке я просто не вижу горячих кнопок для раскладок.

    UPD. Настройки клавиш нашёл (чёртова 10-ка, где из интерфейса новой Панели вызываются куски старой), установка раскладок без Ctrl невозможна.
    Ответ написан
    Комментировать
  • Почему не любят c++ builder?

    @Mercury13
    Программист на «си с крестами» и не только
    Я работал, и профессионально тоже.
    1. Вторичен по отношению к Delphi, и те, кому нужна «амбаркадебра», осваивают Delphi. Носит на себе и Паскаль, и Си, и потому громадные EXE’шники.
    2. До недавнего времени — устаревший компилятор. Сейчас и под x86, и под x64 clang. Где-то до 2012 вообще x64 не было!
    3. Поставили не на тот кроссплатформенный фреймворк — не нравится мне FireMonkey.
    4. WinForms как-то проще в разработке.
    5. Долгое время — невнятная лицензионная политика «амбаркадебры».
    6. Долгое время — отсталость Delphi/VCL (например, нет Юникода).
    Ответ написан
    Комментировать
  • Как при изменение размеров окна удержать выведенный текст?

    @Mercury13
    Программист на «си с крестами» и не только
    Первое, самое главное. WM_PAINT рисует содержимое окна целиком. Если нужны тысяча надписей — или рисуйте их тысячу штук, или отпечатайте на внеэкранный BITMAP, или ещё что-нибудь.

    Это экономит память: Win3 хреново, но работала на одном мегабайте, лично видел. Но имеет побочный эффект — если прога перестаёт отвечать, например, в 95 с её вытесняющей многозадачностью, WM_PAINT никак не вызовешь, и будет белое окошко. XP (вроде она) кэширует содержимое окна и выводит его, пока прога не отвечает.

    Второе. InvalidateRect в WM_PAINT не имеет смысла. Смысл этого вызова — попросить Windows перерисовать окно, когда получится.
    Ответ написан
    2 комментария
  • В чем разница связаного списка от хеш-таблицы?

    @Mercury13
    Программист на «си с крестами» и не только
    Связанный список решает такую задачу: как хранить коллекцию объектов, добавляя и удаляя туда объекты. (Простите, что я не пишу характеристики того и другого, почитайте это в умных книгах)

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

    Хэш-таблица решает другую задачу: наладить отображение ключ→значение. Например, «осёл → иа, петух → кукареку», и так далее. Массив, только индексом будет не цифра, а что-то другое: x[«осёл»] = «иа». Так называемый ассоциативный массив.

    Если индексом массива может быть только цифра, поступим так: превратим нашего осла в цифру — например, о+с+ё+л = 4363 (в Юникоде), и пусть 63 — это номер гнезда. В 63-м элементе массива пусть и лежит наше «осёл → иа».

    Если у другого животного значением хэша будет 63 — это хэш-коллизия, и в разных реализациях решается по-разному. Я знаю такое: в гнезде лежит не просто один элемент, но связанный список. Главное, что такое слегка снижает производительность, но допустимо.
    Ответ написан
    Комментировать
  • Почему возникает конфликт MAC адресов?

    @Mercury13
    Программист на «си с крестами» и не только
    MAC-адрес принадлежит LG Electronics. Вероятно, на «янчуде» MAC-адрес был скопирован с ноутбука LG, а потом сам этот ноутбук подключился к этой сети.
    Ответ написан
    2 комментария
  • Каков смысл скалярного произведения в Cel Shading?

    @Mercury13
    Программист на «си с крестами» и не только
    Отвечу по существу.

    У нормали длина всегда 1. Иногда это реально вектор, перпендикулярный к полигону — если мы хотим осветить плоский полигон как плоскость. Иногда мы хотим из плоских полигонов создать впечатление криволинейной поверхности и потому делаем (например, интерполяцией или специальной текстурой, т.н. картой нормалей) непрерывное поле нормалей.

    Вектор луча — это единичный (или той длины, какой хочешь) вектор, идущий от источника света к той точке, с которой работаем. (Ну или наоборот, смотря как формула записана.)

    Если длина вектора луча тоже 1 — то результат будет [−1…1]. Если он меньше 0 (в случае, если нормаль наружная, а луч идёт от источника света) — перед нами коэффициент, во сколько раз реальная освещённость меньше, чем обеспечиваемая источником света. Если больше — поверхность в собственной тени. (Расчёт падающих теней — отдельный и сложный вопрос.)

    С цел-шейдингом никак это не связано, это вообще база по освещению.
    Ответ написан
    Комментировать
  • SwapBuffers/ glXSwapBuffers потребляет ровно 50% времени работы приложения(нагрузка неважна),в чём может быть причина?

    @Mercury13
    Программист на «си с крестами» и не только
    glSwapBuffers крутится в ожидании VSYNC’а. Потому и потребляет столько.
    Ответ написан
  • Как прочесть аргументы функции на стеке / заставить gcc хранить аргументы функции на стеке?

    @Mercury13
    Программист на «си с крестами» и не только
    https://godbolt.org/z/ARYhis
    Если посмотреть в пролог функции, она делает локальную копию нашей a. А желаемое место в стеке на 36 байтов выше, чем вы ищете.
    Разумеется, всё под x86. Вызов под x64 подразумевает регистры.

    UPD. А вот Интел не делает локальных копий и всё на месте.
    Ответ написан
    Комментировать
  • Есть ли функция которая сильно меняет большие значения и чуть чуть маленькие?

    @Mercury13
    Программист на «си с крестами» и не только
    Главное требование: f’(0)=1. Но из вашего описания непонятно, как функция должна вести себя на ∞-и, и вот несколько вариантов.

    Самое простое — это линейная функция kx, k<1 (например, 0,9x). Она везде (и на ∞-и) линейна.
    Можно посложнее: x/(kx²+1). Этот зверь будет переть к нулю.
    Можно что-то среднее: k·ln(x/k + 1). Стремится к ∞-и, но не так, как x.
    Ещё вариант: 2k sqrt(x/k + 1). Тоже стремится к ∞-и, но побыстрее.
    Если нужно к константе a — то [2a/pi] arctg(x/a). Единственное что — для управления скоростью сходимости придётся в арктангенс вместо x подставить примерно такую же функцию (f'(0)=1).
    Ответ написан
  • Как понять условие задачи?

    @Mercury13
    Программист на «си с крестами» и не только
    Подобный вывод используется, чтобы было понятно, что вы способны, если нужно, вычислить с точностью до обыкновенной дроби, но в длинную арифметику (а дроби бывают длинные) не лезть. Ибо реализации длинной арифметики различаются по эффективности от ЯП к ЯП, а в некоторых вообще нет штатной (внешние библиотеки в олимпиадном программировании запрещены).

    Числа P и Q высчитываем с точностью до остатка от деления на Z := 109+ 7.

    Авторы обещают, что Q mod Z ≠ 0. Z — простое. Тогда НОД(Q mod Z, Z) = 1. Так называемый расширенный алгоритм Евклида (гуглите!) позволяет подобрать такие числа, чтобы m(Q mod Z) + nZ = 1.

    Ваша задача — вывести ((P mod Z) · m) mod Z. Специально указал дважды mod Z: первое у вас будет при работе с числом P, второе — при генерации вывода.

    Почему так? Возьмём вместо здоровенного Z цифру поменьше, 17. Если у вас получился результат 100/400, при расчётах выйдет цифра 15/9, и 9·2+17·(−1) = 1, и ваша задача — вывести (15·2) mod 17 = 13.

    Если же у вас получилось, например, 35/140, при расчётах получается 1/4, 1·(−4)+17·1 = 1, и вы должны вывести (1·(−4)) mod 17 = 13. То есть: независимо от того, насколько сократимая дробь у вас получилась, вы получите один и тот же результат. Тут надо уточнить: там, где возможен отрицательный числитель, нужен не обычный % из Си++, а (a % Z; если получилось отрицательное — добавь Z).

    Ну а арифметических переполнений просто не допускайте, Z = 109 + 7 позволяет умножать в типе long long и не уходить в переполнение.

    UPD. То, что Z — простое, даёт несколько выгод. Часто результат бывает круглый, и простота требует честно считать остаток, а не угадывать. Ну и побочек меньше.
    Ответ написан
    3 комментария
  • Почему шарик застревает в стене?

    @Mercury13
    Программист на «си с крестами» и не только
    У вас тут переменная кадровая частота. Если за длинный кадр шарик ушёл далеко за стенку, короткий кадр его не сможет вытащить наружу и снова инвертирует скорость — шар застрял. (Я это с лёгкостью повторил функцией Windows 10 «Aero Shake»).

    В простейшем случае — определять, за какую стенку шар выскочил, и давать ему скорость такую, чтобы он возвращался в площадку. А не просто vx=−vx, независимо от того, куда эта скорость смотрит.

    Также стоит ограничивать длительность кадра, и если он, например, продлился больше 0,2 с — пусть игра в такой ситуации «запнётся». Случилось что-то нехорошее, и не хочется, чтобы всё слетело с катушек со своих позиций.

    Также надо давать float time = clock.restart().asMicroseconds(); Сейчас компы быстры и погрешность незначительна, но всё-таки.
    Ответ написан
    Комментировать
  • Ошибка при чтении из файла в си.Что делать?

    @Mercury13
    Программист на «си с крестами» и не только
    feof возвращает true, когда мы попытались прочитать и не смогли, потому что каретка ударилась в конец файла. А не когда каретка аккуратно припарковалась в конце файла — и уж тем более не когда она отделена от конца пробелами.

    Лучше прочитайте про scanf…
    On success, the function returns the number of items of the argument list successfully filled. This count can match the expected number of items or be less (even zero) due to a matching failure, a reading error, or the reach of the end-of-file.

    …и посмотрите, как можно переделать условие цикла.
    Ответ написан
    Комментировать
  • Не работает функция. Что сделать?

    @Mercury13
    Программист на «си с крестами» и не только
    Я пока вижу…
    shitf_up(s,Parent);

    Может, ещё вы напутали с порядком кучи, но на таком кусочке кода этого не видно.
    Ответ написан
  • Столкнулся с проблемой парсинга заголовка wav звука?

    @Mercury13
    Программист на «си с крестами» и не только
    Пропускать «левые» блоки, пока не дойдём до data! Что ещё делать?
    У меня получился файл длиной 5.241.822, и там такие блоки: по смещению 0C fmt длиной 0x10, по смещению 24=0C+8+10 LIST длиной AA, и по смещению D6=24+8+AA будет нужная нам data.

    Уточню, что я имел в виду. RIFF — это стандартный блочный формат, не ограничивающийся WAV’ом. Допустим, есть формат RMI = RIFF MIDI. Ваше решение подразумевает, что за блоком «fmt» сразу идёт блок «data», что не всегда верно.

    Ещё раз, мужик! По смещению 0C будет блок «fmt»: 4 байта сигнатура, 4 байта длина и 0x10 байт данные.
    За этими 0x10 байтами, по смещению 24=0C+8+10, идёт блок LIST: 4 байта сигнатура, 4 байта длина и 0xAA байт данные. Блок не наш — пропускаем эти байты, и переходим сразу на смещение 0xD6=24+8+AA. Там 4 байта сигнатура, 4 байта длина и 0x4FFB00 байт данные. Их-то и читаем.
    Ответ написан