• Возможно ли в процедурном программирование, имитировать ООП?

    @Mercury13
    Программист на «си с крестами» и не только
    Можно, и я бы посоветовал посмотреть на две вещи.
    1. MiniZip. Настоящие виртуальные потоки, написанные на чистом Си!
    Кстати, у нас на работе есть библиотека MiniZipPort, представляющая собой тупой перевод MiniZip на виртуальные потоки и шаблонные контейнеры — две строчки Си превращались в одну строчку на «крестах». К тому же для хранения каталога я использовал уже имевшийся самописный AccuStream (что-то вроде std::deque, только в виде потока).
    2. Doom. Самый первый, 1993–94 года. Там тоже ухитрились делать объектно — правда, другими методами.
    Ответ написан
    3 комментария
  • Как сделать срез массива?

    @Mercury13
    Программист на «си с крестами» и не только
    В Си++ нет понятия «произвольный массив», и это мешает.
    Но несложно этот самый произвольный массив (без хранения) написать
    template <class T>
    struct Buf1d {
      size_t size;
      T* d;
      constexpr Buf1d() : size(0), d(nullptr) {}
      constexpr Buf1d(size_t aSize, T* aD) : size(aSize), d(aD) {}
      Buf1d(std::vector<T>& x) : size(x.size()), d(x.data()) {}
    }

    И этому Buf1d можно придумать и другие функции, например:
    template <class T>
    Buf1d<T> Buf1d<T>::sliceLeft(size_t x) const
    {
      if (x >= size) {
        return {};
      } else {
        return { size - x, d + x };
      }
    }


    Если же вам нужно с хранением, то, например, можно воспользоваться старым добрым vector.
    template<class T>
    std::vector<T> sliceLeft(const std::vector<T>& v, size_t x)
    {
      if (x >= v.size()) {
        return {};
      } else {
        std::vector<T> r;
        r.insert(r.end(); v.begin() + x, v.end());
        return r;
      }
    }
    Ответ написан
  • Какую программу можно сделать с использованием двумерного массива?

    @Mercury13
    Программист на «си с крестами» и не только
    Тетрис. Питончик. Морской бой.
    Ответ написан
    Комментировать
  • Как решить задачу на or?

    @Mercury13
    Программист на «си с крестами» и не только
    Это невозможно.
    Пусть у нас есть массив, состоящий НЕ ЦЕЛИКОМ из нулей и содержащий хоть один ноль.
    Возьмём любой ненулевой элемент a и про-XOR’им с ним все элементы массива.
    Ноль переместился в другое место, а результаты нашей операции a[i] xor a[j] не изменились.
    Получается, что первый массив неотличим от второго, и нули в них в разных местах.

    Например: массив 0 1 2 3 неотличим от массива 1 0 3 2.
    0 xor 1 = 1 … 1 xor 0 = 1
    0 xor 2 = 2 … 1 xor 3 = 2
    0 xor 3 = 3 … 1 xor 2 = 3
    1 xor 2 = 3 … 0 xor 3 = 3
    1 xor 3 = 2 … 0 xor 2 = 2
    2 xor 3 = 1 … 3 xor 2 = 1
    Ну а 0 xor 0, 1 xor 1, 2 xor 2 и 3 xor 3 всегда были нулями.

    ------------------

    В версии с OR — берём a[0] or a[i], поддерживая AND этих сумм и подсчитывая, сколько раз этот самый AND среди наших сумм встречается.
    1) Если числа, превышающие AND, встречаются столько раз, сколько [ну, подсчитайте, сколько чисел от 0 до N−1 будут иметь все эти биты] — отбросим наше 0-е число, а также проверенные числа, чья сумма НЕ совпадает с AND, и начнём сначала.
    ПРИМЕР: 2 3 4 0 1
    2 or 3 = 5, AND=5
    2 or 4 = 6, AND=2 — бит 2 тут будут иметь только 2 и 3, отбрасываем 2, 3 и 4.

    Если AND встречается 2k−1 раз (k — кол-во битов в AND), оставим ТОЛЬКО ЭТИ случаи и снова начнём сначала.
    ПРИМЕР: 2 1 0 3
    2 OR 1 = 3, AND=3
    2 OR 0 = 2, AND=2
    2k−1=1, и нам хватает одной встречи числа 2 — оставляем 2 и 0.

    Остались три числа — действуем по стандартному алгоритму.
    Осталось одно число — оно 0.
    Остались два числа — одно 0, другое некий бит. Мы должны найти число, этого бита не имеющее. Снова проходим по результату предыдущего обхода, суммируя сначала с одним, потом с другим. Видим разницу — понятно, где 0, а где бит.
    Ответ написан
  • Как найти координаты точек на дуге зная координаты точек хорды?

    @Mercury13
    Программист на «си с крестами» и не только
    По теореме Пифагора находим расстояние от центра до хорды: d = sqrt(R² − [(x2−x1)² + (y2−y1)²]/4).
    Находим середину отрезка AB (назовём её (x3, y3)). Находим направляющий вектор отрезка AB (x4,y4) = ((x2−x1)/|AB|, (y2−y1)/|AB|), и есть два варианта центра — (x0,y0) = (x3±d·y4, y3∓d·x4).
    А дальше через atan2 получаем углы, упорядочиваем их и через углы получаем сколько угодно точек.
    Ответ написан
  • Порядок выполнения действий в выражении --i + i++?

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

    В компьютерах есть побочные эффекты и желание сделать поменьше промежуточной памяти, потому приоритет и ассоциативность служат только для расстановки неявных скобок — а порядок вычисления прост: «сначала левая часть, потом правая» (для некоторых операций наоборот).

    В Си даже это «левая → правая» зачастую остаётся за реализацией: в каком порядке компилятор хочет вычислять, в таком будет вычислять. Да ещё и «i++» — не атомарное выражение, а «i:=i+1», то есть прибавить 1, а потом присвоить — и эти операции «прибавить» и «присвоить» компилятор может разнести далеко друг от друга, если так пожелает.
    Ответ написан
    9 комментариев
  • Нормально ли обращаться к методам и свойствам классов через единый сервис?

    @Mercury13
    Программист на «си с крестами» и не только
    С моей колокольни статических языков такая конструкция — избыточная сложность на пустом месте.
    Но есть места, где такая сложность ещё и чем-то оправдана. Например, Qt — содержимое ячейки таблицы…
    QVariant SomeModel::data(
        const QModelIndex &index, int role = Qt::DisplayRole) const override {}

    Для чего оно такое в Qt…
    • в самом начале функции может вычисляться адрес в памяти, где все эти данные находятся, а за ним — длинный switch/case «в зависимости от роли, возьми то-то»;
    • возможно возвращение пустого QVariant, когда надо сказать: «действуй как обычно»;
    • наконец, возможны сложные операции с данными, вроде преобразования в отображаемую форму и сортировки, которые не зависят от специфики модели данных.

    Так что ответ. Смотрите по месту: что вы хотите этой конструкцией сказать и почему более простые не оправданы.
    Ответ написан
  • Что значит const volatile?

    @Mercury13
    Программист на «си с крестами» и не только
    const — чтобы исключить попытки писать в него.
    volatile — каждый раз при обращении проходить по адресу и брать данные , а не кэшировать.
    Если какая-то ячейка в памяти (в данном случае по адресу 0x30) меняется другим потоком или, например, железом, она volatile.
    Лучше было бы писать
    const volatile char* const port = (const volatile char *) 0x30;

    Ещё лучше (Си++11 и непортабельно)
    constexpr const volatile char *port = (const volatile char *) 0x30;

    А ещё лучше сделал Паскаль
    var
      SomePort : byte absolute $30;
    Ответ написан
  • Ошибка с типами с++?

    @Mercury13
    Программист на «си с крестами» и не только
    1. C:\Users\XXX\Desktop — не обязательно стол будет там.
    2. Гуглите функцию std::string::c_str() — преобразование string в нуль-терминированную строку Си.
    Ответ написан
    Комментировать
  • Что означает данная запись структуры?

    @Mercury13
    Программист на «си с крестами» и не только
    Переменная этого типа.
    Ответ написан
    Комментировать
  • Какие бывают библиотеки для лицензирования, и бывают ли?

    @Mercury13
    Программист на «си с крестами» и не только
    Я бы посоветовал посмотреть открытые части VmProtect (там и на PHP версия есть, и на C++). Они связаны именно с лицензированием.
    А также поискать где-то структуру VmProtect’овского hardware ID.
    Закрытые части, связанные с защитой лицензий от взлома и собственно виртуальной машиной, которая и дала название защите VmProtect, вы вряд ли найдёте. Да и вообще защита от копирования не может быть опенсорсной.
    Ответ написан
    Комментировать
  • Как сделать алгоритм?

    @Mercury13
    Программист на «си с крестами» и не только
    Пусть минимальный простой делитель a.
    Тогда минимальный делитель a (будь мин.делитель составной — нашёлся бы меньший), максимальный — x/a (по сходной причине), x=91·a².
    Кроме того, 91 = 7·13, и потому a <= 7.
    2²·91 и 3²·91 до четырёхзначного явно не дотягивают.
    А вот следующее — a=5 — даёт 2275 = 5²·7·13.
    Также должно подойти a=7, x=7³·13=4459.
    (Раз тут математика, часто запрещён даже калькулятор, потому попытался написать так, как думал бы человек без калькулятора)
    Ответ написан
    Комментировать
  • Почему элемент svg выглядит по другому на ios и других браузерах, в отличие от Chrome и android?

    @Mercury13
    Программист на «си с крестами» и не только
    Если хотите рендеринг шрифтов 1:1 — конвертируйте их в кривые!
    Сколько раз твердили миру…
    Ответ написан
    Комментировать
  • В чём главное отличие информации от ключей?

    @Mercury13
    Программист на «си с крестами» и не только
    Информация в деревьях — это…
    • ключи (то есть string в map<string, int>)
    • любая информация, которую программист прицепил на элементы дерева (то есть int в map<string, int>)
    • информация, которая служит, чтобы поддерживать само дерево и его сбалансированность: указатели, флаг R/B…
    Ответ написан
    Комментировать
  • Где хранится код блокнота в Windows 10?

    @Mercury13
    Программист на «си с крестами» и не только
    Где-то в Microsoft. Исходный текст блокнота (как и всей остальной Windows) не открыт.
    Ответ написан
    1 комментарий
  • Зачем нужна таблица маршрутизации?

    @Mercury13
    Программист на «си с крестами» и не только
    Будем считать сначала по типу (немаршрутизируемый → маршрутизируемый), потом от самых приоритетных (20) до наименее приоритетного (306).

    Доступность On-link (немаршрутизируемая), приоритет 276.
    №5. 192.168.1.x — отвечает за нашу подсеть.
    №6. 192.168.1.100 — отвечает за собственный IP.
    №7. 192.168.1.255 — ещё один зарезервированный адрес «всем в подсети».
    №9. (240-255).x.x.x — зарезервированный диапазон мультивещательных сетей
    №11. 255.255.255.255 — зарезервированный адрес «всем в подсети».

    Доступность On-link (немаршрутизируемая), приоритет 306.
    №2. 127.x.x.x
    №3. 127.0.0.1
    №4. 127.255.255.255 — эти три строчки служат, чтобы задать зарезервированные адреса 127.x.x.x.
    №8, №10. Они не действуют: есть более приоритетные 9 и 11. Но 9 и 11 исчезнут, когда отключится .100, и 8 и 10 начинают действовать.

    Доступность маршрутизируемая, приоритет 20
    №1. 0.0.0.0. Под эту строчку подходит что угодно, и если ни один из on-link’ов не пройдёт — берётся она. Посылаем пакет на роутер.
    Ответ написан
    Комментировать
  • Как с помощью какой функции можно int PID преобразовать в Handle?

    @Mercury13
    Программист на «си с крестами» и не только
    CreateProcess, последний параметр: processInfo.hProcess.
    https://stackoverflow.com/questions/42531/how-do-i...
    Ответ написан
    3 комментария
  • Есть ли простая математика расчета попадания в зону?

    @Mercury13
    Программист на «си с крестами» и не только
    Вам уже подсказали общие способы. Теперь специализированные.
    Точка гарантированно в охватывающем прямоугольнике. Мы получаем уравнения прямых и смотрим, с какой стороны. Проще всего это делать через косое произведение векторов — AX×AB <> 0, или
    (x − xA)(yB − yA) − (xB − xA)(y − yA) <> 0
    Ответ написан
    Комментировать
  • Сможет ли работать такая сетевая схема?

    @Mercury13
    Программист на «си с крестами» и не только
    В этой системе два внешних IP-адреса. И раз уж провайдеры закрепляют IP-адрес за портом на своём свитче — то не будет.
    Сейчас, когда адреса IPv4 закончились, может и работать, когда, например, они за провайдерским NAT, но традиционно — нет. Или вы реально купили два IP-адреса.
    Ответ написан
    Комментировать
  • Как вывести результат программы на cpp в ms excel?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть три варианта.
    1. Найти библиотеку работы с Excel. Самая маленькая и открытая — libxlsxwriter.
    2. Сохранять в более простых форматах. Самый простой из них — CSV. Не забудьте, что русский и английский Excel работают с разными CSV.
    3. Использовать OLE-автоматизацию Excel.
    У Спольского есть статья, почему форматы M$ Office такие сложные: https://rutlib5.com/book/25666/p/27
    Ответ написан
    Комментировать