• Как вернуть ссылку/указатель на элемент вектора?

    @Mercury13
    Программист на «си с крестами» и не только
    1.
    bool FindElement(const string& search, CElement*& result);

    2. CElement* FindElement(const string& search);
    Ответ написан
    1 комментарий
  • Что такое безсерверная обработка данных?

    @Mercury13
    Программист на «си с крестами» и не только
    Название странное. Это когда облачная платформа выделяет не сервер (виртуальную машину, контейнер), а какую-то функцию, и на каких серверах она работает — не важно.
    https://en.wikipedia.org/wiki/Serverless_computing
    Ответ написан
    Комментировать
  • Что такое 3D математика?

    @Mercury13
    Программист на «си с крестами» и не только
    Векторная алгебра (ну или векторная геометрия) в 3D.
    Векторы, матрицы, базисы, однородные координаты, видовые преобразования, кватернион поворота…
    Первый курс университета, покрывается курсом «Линейная алгебра и аналитическая геометрия».
    Дизайнеру не нужно.
    Ответ написан
    4 комментария
  • Нужно ли создавать интерфейсы для одного класса?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Если из класса можно вытащить какую-то абстракцию. Например, из объекта «файл» можно вытащить абстракцию «поток». Личное — объект Project реализует интерфейс Modifiable с двумя функциями: modify() и isModified().

    2. Для упрощения юнит-тестирования при условии владения.
    Предположим, у нас есть класс «класс» (школьный) и класс «ученик». Ученик знает, в каком он классе.
    В такой ситуации получается «клубок»: если надо делать ученика, то надо делать и класс.
    Этот замкнутый круг можно разорвать, сделав интерфейс ISchoolClass и унаследовав от него класс. При юнит-тестировании заменяем класс на какую-то заглушку.
    Ответ написан
    Комментировать
  • Можно ли организовать связь между QT, mySQL и Excel?

    @Mercury13
    Программист на «си с крестами» и не только
    Qt и MySQL работают отлично и очень быстро. Маленькая подсказка: помимо DLL драйвера, который надо бросить в подкаталог plugins\sqldrivers, надо положить в РАБОЧИЙ каталог программы DLL MySQL или MariaDB (зависит от сборки Qt).

    С Excel’ем сложнее, и приходится искать любую Excel-библиотеку, имеющуюся на Си++.
    Из открытых — XLNT (кроссплатформенный) и QtXlsx (привязан к системе классов Qt).
    Мы используем частично LibXL (платный, тормозной, огромный расход памяти, но QtXlsx ещё хуже, насколько я проверял), частично свой велосипед (минимум функциональности, оптимизирован под огромные XLSX — вплоть до того, что Excel берёт большую таблицу за 10 секунд, а мы за три, а LibreOffice вообще над ней размышляет минутами).

    Но это уже собственно вопрос: а что есть для Excel’я на Си++. Может, сырой XLNT довели до ума. Может, у вас нет огромных таблиц, и того, что есть, вам хватает…

    UPD. Есть разные сборки DLL MySQL, так что придётся экспрериментировать, чтобы работало не только на разработческой машине, но и у потенциального юзверя.
    Ответ написан
    Комментировать
  • Как удалить часть строки в c++?

    @Mercury13
    Программист на «си с крестами» и не только
    Так и надо, но не хватает только одного: каким-то образом обрезать строку после всего этого.
    for (…)
      s1[i] = s1[i + s2len]
    s1.resize(s1.length() - s2len);

    Не забывайте: если длина вашей строки — это strlen, то length() в цикле вызывать запрещено!

    Да, ещё вопрос: убрать ПЕРВОЕ вхождение или ВСЕ вхождения?
    Ответ написан
  • Как нарисовать на курсоре в RunTime?

    @Mercury13
    Программист на «си с крестами» и не только
    Попробуйте Brush.Color := $FF000000 or clBlue;. Велика вероятность, что механизмы работы с 32-битными изображениями тут слабоваты.
    Ответ написан
    1 комментарий
  • Как подключиться к глобальному интернету Маска?

    @Mercury13
    Программист на «си с крестами» и не только
    Потребуется специальная антенная решётка. По предварительным расчётам, она будет по размеру с коробку от пиццы. Пока выведены два спутника, она вряд ли где-то продаётся.
    И предварительная стоимость — 50$/мес — негуманная для страны, где интернет один из лучших в мире (ой, если бы ещё не роскомнадзоры и их украинские аналоги).

    (Долго вспоминал, как называется крупная спутниковая сеть голосовой связи — Iridium. Удивительно, что она ещё работает и для работы полагается именно что на Маска.)

    Нашёл.
    https://www.reddit.com/r/Starlink/comments/7zqm2c/...
    Ответ написан
    2 комментария
  • Как понимать алгоритмы?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть три специфичных вида алгоритмов.
    • Математические. Из них я могу припомнить геометрические (выпуклая оболочка) и вычислительные (метод Рунге-Кутты).
    • Связанные с особыми структурами данных.
    • Параллельные.

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

    Из общего — те части математики, которые служат основополагающими принципами работы компьютеров. Теория множеств, булева алгебра, комбинаторика, теория автоматов… Также важно изучить символы Ландау и понятие «асимптотическая сложность алгоритма».

    Для параллельных важно понимать архитектуру параллельных систем.
    Ответ написан
    Комментировать
  • Как скомпилировать QWT готовым Qt 5.10 MinGW-w64 Dynamic?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Например, можно скомпилировать прямо через Qt Creator.
    Ответ написан
    Комментировать
  • Как получить нужную точность при умножении и делении чисел типа double?

    @Mercury13
    Программист на «си с крестами» и не только
    Дело в том, что 4,2 и 4,3 невозможно представить в виде double. И система, например, сохраняет 4,3 в виде 4,2999999, которое при умножении на 10 станет 42,999999.
    Нужно убедиться, что при преобразовании double → int происходит round, а не усечение.
    Ответ написан
    2 комментария
  • Насколько отвратителен данный код?

    @Mercury13
    Программист на «си с крестами» и не только
    Главная проблема.
    const char *source = fmt::format("/tmp/{}.ini", unid).c_str();

    Объект fmt::format сразу же исчезнет, и source будет «висеть».

    Придётся писать…
    fmt::format fmSource("/tmp/{}.ini", unid);
    const char *source = fmSource.c_str();

    И так далее.
    Ответ написан
    8 комментариев
  • Почему не работает код (c)?

    @Mercury13
    Программист на «си с крестами» и не только
    https://ru.wikipedia.org/wiki/Условия_Йоды
    Аж в двух местах.

    Причём в Си не нужно ставить в сложных условиях скобки, как в Паскале, вполне покатит такое…
    if ((a >= 11 && a <= 14) || m == 0 || (m >= 5 && m <= 9))

    Но нет, вы наставили лишних скобок и заглушили ошибку.

    Также, что мне не нравится.
    Вместо 0,1,2,3 лучше использовать константы MANY/FEW/ONE/UNKNOWN.

    В case 1 символ подстановки плохо содран с доски.

    Если условие на MANY самое сложное и выполняется по остаточному принципу — почему его делаем самым первым? Лучше что-то типа…
    • 10…20 → MANY
    • 1 → ONE
    • 2…4 → FEW
    • Иначе MANY
    Ответ написан
    Комментировать
  • В чем причина некоректного отображения текста во всех браузерах?

    @Mercury13
    Программист на «си с крестами» и не только
    Что-то заглючило или в файле шрифта Arial, или в библиотеках Direct2D. И Blink, и «рыжая» используют DirectWrite, если он есть (у вас 10, он точно есть). У Edge свой шрифтовой движок. Разумеется, нужно восстановить соответствующие файлы.
    Больше грешу на шрифт Arial: всё, что вы показываете как ошибку, выведено именно этим шрифтом. Если у вас SSD, заодно проверьте его SMART.
    UPD. Может быть, не сам шрифт виноват, а кэш шрифтов. Прежде надо попробовать это. https://winaero.com/blog/rebuild-font-cache-windows-10/
    Ответ написан
  • Какой формулой определить где находится персонаж - за другим персонажем, перед, справа-слева и тд.?

    @Mercury13
    Программист на «си с крестами» и не только
    Считаем, что у нас FPS, т.е. есть некая абсолютная «горизонталь». Обычно в таких играх взгляд хранится через углы (yaw, pitch, roll).
    Взад-вперёд: знак скалярного произведения двух векторов: единичного вектора взгляда без учёта тангажа (cos(yaw), sin(yaw)) и вектора на персонажа (x1−x0, y1−y0).
    Влево-вправо: знак косого произведения той же пары векторов.
    Вверх-вниз: и так понятно.
    Все три в одних единицах, и у кого модуль больше, то и пишем: сверху, справа и т.д. Возможно, придётся сделать скидку на рост персонажей и их диаметр.

    В играх типа Descent нет верха и низа, горизонтали и вертикали. Верх и низ есть только относительно кабины нашего аппарата, а взгляд хранится в виде ортонормированной матрицы, куска этой матрицы или кватерниона.
    1) Скалярное произведение единичного 3D-вектора взгляда (обычно в таких играх хранится напрямую или считается через кватернион поворота) и 3D-вектора на персонажа.
    2) Скалярное произведение единичного вектора, который смотрит вбок (если такой есть), и вектора на персонажа. Либо смешанное произведение единичного вектора взгляда, единичного вектора макушки и вектора на персонажа.
    3) Скалярное произведение единичного вектора макушки и вектора на персонажа.

    Смешанный случай — с переменным вектором гравитации (в глобальных авиасимуляторах или играх на астероидах) — распиши сам.
    Ответ написан
    Комментировать
  • Как вычислить члены геометрической прогрессии?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть два варианта. 1) Какие попало целые члены; 2) Последовательные целые члены. На вопрос «какие попало члены» (без решения) ответил longclaps, отвечу на второй.
    589952 = a0 (2n−1).
    А теперь разбиваем наше число на множители: 589952 = 27 ∙ 11 ∙ 419.
    Двойки могут идти только в первый член a0. А с 419 и 11 — ни каждое из них, ни их произведение не похожи на 2n−1.
    Так что единственный ответ — единственный член, равный 589952.

    Вы точно переписали цифру 589952?

    Если члены последовательные, но не целые, возможно ∞ ответов — например, 10 членов, первый из которых — 589952/1023.
    Ответ написан
  • Как работает криптор который из exe может сделать doc или подобные форматы?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть две разные задачи.
    1. Просто. Пронести программу через систему безопасности при условии, что твой компьютер — «тихая гавань» и можно спокойно декодировать и запустить. Например, чтобы сбить с толку антивирус Gmail.
    2. Сложно. Твой компьютер — уже не «тихая гавань», на нём действуют системы безопасности, и требуется их как-то обойти. Или, например, мы распространяем вирус, а в роли системы безопасности — бдительный пользователь.

    Первая задача в простейшем случае решается сменой расширения. Можно придумывать и более сложные методы, чтобы антивирус сказал: это действительно DOC.

    Чтобы решить вторую задачу, надо в программе (Word, WinRAR и т.д.) найти эксплойт типа «исполнение произвольного кода».
    Ответ написан
  • Как организовать структуру классов?

    @Mercury13
    Программист на «си с крестами» и не только
    Strategy[N] хранит не наследников Strategy, а объекты класса Strategy. Поэтому в массиве придётся хранить не тела объектов, а указатели.

    Если у вашего МК есть полноценное управление памятью с операцией new, всё просто: std::unique_ptr<Strategy> strategies[N]. Если нет — приходится как-то извращаться, и об этом не будем.

    Как сериализировать? Добавим классу Strategy небольшую функцию
    unsigned char code() const;
    Пусть первая стратегия возвращает, например, 1=CODE_DUPLICATE, а вторая — 2=CODE_MACRO. Сериализация, в числе прочего, будет записывать в память эти коды.

    Считав код, мы создаём Duplicate или Macro, а затем считываем объект этого класса.
    std::unique_ptr<Strategy>& thatObject = strategies[i];
    switch (getSomeByte) {
    case CODE_DUPLICATE:
      thatObject = new DuplicateStrategy();
      break;
    case CODE_MACRO:
      thatObject = new MacroStrategy();
      break;
    default:
      // можно ничего не делать. Можно сообщить об ошибке.
    }
    thatObject->read();
    Ответ написан
    Комментировать
  • Какой вариант применения исключений лучше?

    @Mercury13
    Программист на «си с крестами» и не только
    Декларируемые исключения Java — это плохо. Однако эти декларируемые исключения позволяют осознать, что есть три типа аварий.

    1. Среда исполнения чувствует себя плохо, исполнение программы под угрозой (сработала самопроверка в какой-то части программы, не подконтрольной программисту). Например, срабатывание какого-то встроенного детектора, определяющего запись в чужую память. Выпадают где угодно. Их на практике не приходится ни выбрасывать, ни ловить.

    2. Нарушена логика программы (сработала самопроверка, зависящая от программиста). Неверный аргумент, выход за границу массива. Выпадают где угодно. Их часто выбрасывают и крайне редко ловят.

    3. Нестабильная часть программного окружения чувствует себя плохо. Файл не найден, нет связи. Выпадают в определённых точках. Часто выбрасывают и часто ловят. В Java только их требуется декларировать.

    Таким образом, ваш холивар относится к вопросу: выбрасывать ли исключение, если случилась авария 3-го типа? Я лично замечал подобные вопросы только в одном языке — Си++. Думаю, это связано с двумя вещами. 1) Большие издержки, связанными с определёнными методиками обработки исключений. 2) Довольно невнятное поведение Си++ при выпадении исключения из конструктора.

    Если же отойти от недостатка конкретного языка — даже по поводу обычного HTTP 404 есть «путь Indy» и «путь cURL» — выбросить исключение и сообщить о ненайденном документе другими методами. За первое и за второе можно найти кучу аргументов.
    Ответ написан
    Комментировать
  • Как сделать разную реализацию одной и той же функции класса в C++?

    @Mercury13
    Программист на «си с крестами» и не только
    Перенести пользовательскую функциональность в другое место — так называемый «слушатель».
    using EvClick = void (*)();
    
    Class Model{
    public:
      void click() { if (fOnClick) fOnClick(); }
      void setOnClick(EvClick x) { fOnClick = x; }
    private:
      EvClick fOnClick = nullptr;
    }

    Подобные слушатели есть в любой визуальной оконной библиотеке: VCL, Qt. В VCL так и есть, за исключением вписанных в синтаксис свойств. В Qt для этого используют сигналы-слоты.

    Наладить передачу любых данных в эту функцию — шаблон «команда».
    class ClickEvent {
    public:
      int x, y;
      virtual ~ClickEvent();
    }
    
    using EvClick = void (*)(ClickEvent&);
    Ответ написан
    7 комментариев