• Как задать свойство класса экземпляром другого класса, если его значения не известны при инициализации?

    @Mercury13
    Программист на «си с крестами» и не только
    center_pt = *new Point(x/size, y/size);
    Утечка памяти. Никто в «си с крестами» за вас не будет подчищать все эти new.
    Правильно:
    center_pt = Point(x/size, y/size);
    (Ну и, разумеется, я не понимаю, что значат эти x/size и y/size, но шут с ним.)

    Примерно таким образом и происходит переприсваивание объектов, если им оставили таки операцию =. То есть…
    class Geolocator {
    public:
      Point coords;
      bool isReliable;
    
      Geolocator() : coords(0,0), isReliable(false) {}
    
      void getFromSensor() {
        coords = Point(100, 100);
        isReliable = true;
      }
    };


    Вариант 2. Через указатель, создание и уничтожение. Для простоты не буду это делать «руками», а воспользуюсь указателем единоличного владения unique_ptr.
    class Geolocator {
    public:
      std::unique_ptr<Point> coords;
    
      void getFromSensor() {
        Point pt(100, 100);
        if (coords) {
          *coords = pt;
        } else {
          coords.reset(new Point(pt));
        }
        // а если и операции = у Point нет, то можно
        // coords.reset(new Point(100, 100));
      }
    
      void declareUnreliable() {
        coords.reset();
      }
    };
    Ответ написан
    6 комментариев
  • Не заканчивается программа?

    @Mercury13
    Программист на «си с крестами» и не только
    Потому что конец консоли с клавиатуры зависит от ОС, и для Windows это Ctrl+Z.
    Нажатие ввода не передаёт в поток EOF.
    Ответ написан
    6 комментариев
  • Как доказать, что не существует трех таких цифр (0-9), сумма квадратов которых равна 172?

    @Mercury13
    Программист на «си с крестами» и не только
    Перебор.
    98x — не получается
    97x — не получается
    96x — не получается
    95x — не получается
    94x — не получается
    93x — x уже великоват

    88x — не получается
    87x — не получается
    86x — не получается
    85x — x уже великоват

    77x — не получается
    76x — x уже великоват
    66x — x и подавно великоват

    Вариант 2.
    172 делится на 4. Любой квадрат делится на 4 с остатком 0 или 1 — потому у нас должны быть три чётных цифры.
    Перебор сокращается.

    88x — не получается
    86x — x уже великоват

    66x — x и подавно великоват, дальше перебирать нет смысла.
    Ответ написан
    3 комментария
  • В корпусе сбоку вентилятор должен работать на вдув или на выдув (фото)?

    @Mercury13
    Программист на «си с крестами» и не только
    На вдув + грязевик. Который периодически снимают и трясут.
    В этом месте на выдув ставить бесполезно, надо сверху или на задней стенке.
    Баланс корпусных кулеров всегда смещают в сторону вдува — тогда внутри будет меньше грязи.
    Ответ написан
    Комментировать
  • Ввывод сообщения об успешном завершении программы в с++?

    @Mercury13
    Программист на «си с крестами» и не только
    Вопрос в буферизации потоков ввода-вывода. Разумеется, на Windows и OSX эти подробности устроены по-разному. Два модификатора, std::endl и std::flush, сбрасывают буфера.
    cout << "Кол-ва нат чис: " << std::flush;
        cin >> n;
        
        cout << sum(n) << std::endl;
    Ответ написан
    Комментировать
  • Старые игровые движки и их строение?

    @Mercury13
    Программист на «си с крестами» и не только
    Нашёл вот такую книгу.
    gamesmaker.ru/books/kak-samomu-sozdat-trehmernuyu-igru
    Вроде она.
    Ответ написан
    Комментировать
  • Почему Embarcadero ODBC работает, а Qt ODBC буксует? И есть ли замена?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Опять приходится отвечать самому.
    В Qt ODBC крайне тормозной, используй другую библиотеку!
    Ответ написан
    Комментировать
  • Существует ли переходник USB 3.0?

    @Mercury13
    Программист на «си с крестами» и не только
    Итак, на корпусе, как я понимаю, две пары разъёмов. На матплате всего одна пара.

    Самое простое, что можно предложить,— одну из пар подключить в 2.0. В большинстве матплат этого добра переизбыток. Так я поступил на своём рабочем компьютере (только там одна пара на «морде» и ни одной на матплате).
    https://ru.aliexpress.com/store/product/Computer-M...

    Вариант второй. Купить адаптер и к нему подключить оставшуюся пару.
    https://ru.aliexpress.com/store/product/PCIe-Dual-...

    Вариант третий. Купить переходник на USB-A…
    https://ru.aliexpress.com/store/product/2-pieces-l...
    …или на USB-B…
    https://ru.aliexpress.com/store/product/19-USB-Dua...
    простейший хаб и переходник на 20-штырьковый USB.
    https://ru.aliexpress.com/store/product/Desktop-Co...
    Но это уже, по-моему, извращенство.

    Вариант четвёртый. Взять их с задней панели матплаты.
    https://ru.aliexpress.com/store/product/25-2-USB-3...
    Тоже извращенство, по-моему. К тому же у вас полноразмерный корпус, что, возможно, говорит о том, что матплата тоже полноразмерная и адаптер уместится. В общем, склоняюсь или к 2.0, или к установке адаптера.
    Ответ написан
    3 комментария
  • Можно ли число представить в виде float?

    @Mercury13
    Программист на «си с крестами» и не только
    Float содержит 23 бита мантиссы и неявную единицу. Порядок float запредельный и даже qword не упрётся в него.
    Это значит: всё, что дальше 23 бит от верхней единицы, должно быть нулём.

    bool isPreciseFloat(unsigned long long n)
    {
      // Простейшая проверка: стираем нижние 24 бита
      // Если в них вписываемся — ДА.
      unsigned long long n1 = n & ~((1ULL << 24) - 1);
      if (n1 == 0)
        return true;
    
      // Получаем верхнюю единицу
      // (можно также двоичным поиском, но я этого с листа не напишу)
      while (true) {
        unsigned long long n2 = n1 & (n1 - 1);
        if (n2 == 0)
          break;
        n1 = n2;
      }
    
      // Получаем маску всего, что ниже 23 бит от верхнего бита.
      n1 >>= 23;
      --n1;
    
      // Проверяем по маске
      return (n & n1) == 0;
    }


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

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

    алг recurse(поссылке x : элемент, поссылке результат : список)
      если x.метка = чёрный
        возврат
      если x.метка = серый
        стоп ("найдена циклическая зависимость")
      x.метка := серый
      для всех y : зависимых от x
        recurse(y)
      x.метка := чёрный
      результат.добавить(x)
    
    алг main()
      для всех x : массив
        x.метка := белый
      result := []
      для всех x : массив
        recurse(x, result)


    Вкратце: проводим стандартный поиск в глубину, начиная со всех элементов, и при выходе вносим элемент в список.
    Ответ написан
    1 комментарий
  • Иероглифы вместо кириллицы в с++?

    @Mercury13
    Программист на «си с крестами» и не только
    Перед нами UTF-8. Перекодируйте исходник в рабочую кодировку (обычно DOS-866 или Windows-1251).

    Или работайте в широких строках. У меня на MinGW 5.3 получился вот такой исходник.
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        setlocale(LC_ALL, "rus");
        wcout << L"Превед!" << endl;
        return 0;
    }
    Ответ написан
  • Что делать при несовпадении координат на клиенте и сервере?

    @Mercury13
    Программист на «си с крестами» и не только
    Я об играх, где игрок управляет одним объектом: шутерах, гонках…
    Клиент и сервер держат несколько исторических положений.

    Координаты СЕБЯ, ЛЮБИМОГО — клиентские. Если серверные координаты в такт 1234 не совпадают с нашими — откатываемся к серверным, повторно прокрутив нужное количество тактов управления.
    Вещи неуправляемые/слабоуправляемые, вроде запаса жизни, берутся подтверждённые сервером.

    Координаты ВРАГОВ — серверные (возможно, каким-то образом экстраполированные).

    Для физики пуль пишется т.н. «компенсация пинга»: если клиент пишет, что в такт 1234 он стреляет, сервер восстанавливает, что КЛИЕНТ ВИДЕЛ в такт 1234, и сравнивает попадание именно с ТЕМ положением клиента. Для медленных снарядов компенсация обычно не пишется.
    Ответ написан
    Комментировать
  • Что нужно сделать в этой задаче?

    @Mercury13
    Программист на «си с крестами» и не только
    Если N=20, X=3, Y=5, то наш выход — 8.
    3, 5, 6, 9, 10, 12, 15, 18.

    Лобовое решение — пройти [2, N) и пересчитать нужные числа.

    Идея умного решения. Если X и Y гарантированно простые, то эти самые числа повторяются с шагом X·Y.
    3, 5, 6, 9, 10, 12, 15
    18, 20, 21, 24, 25, 27, 30
    А дальше думайте сами.
    Ответ написан
    Комментировать
  • Как подсчитать вероятность каждого гола в матче, если вероятность одного и более голов - 60%, а двух и более - 25%?

    @Mercury13
    Программист на «си с крестами» и не только
    Вероятность ровно одного гола 0,35.
    Тогда получается, что среднее кол-во голов не менее 0,35·1 + 0,25·2 = 0,85.
    Вот и всё, что у нас есть при таких данных.
    Можно подобрать распределение, которое приближает наши голы — но распределением Пуассона всё это дело приближается плохо.
    UPD. Если коряво приблизить распределением Пуассона, получается цифра 0,9 или 1, но реальная цифра скорее ближе к 1, чем к 0,9. В общем, приближение Пуассоном явно неадекватно.
    Ответ написан
    1 комментарий
  • Почему неправильный вывод значений в printf?

    @Mercury13
    Программист на «си с крестами» и не только
    У меня вышло: 0 1074266112 0 1074266112
    Или, в 16-й системе, 0 40080000 0 40080000

    Связано это с такими вещами.
    1. Аргументы типа float записываются в стеке как double.
    2. На x86 порядок байтов Intel (обратный).
    3. Дробные числа хранятся без ведущего разряда (который всегда 1), в формате мантисса-порядок-знак (на порядке байтов Intel).
    4. Для единицы (xxx·20) порядок будет 011…11.

    3 = 1,10…02·2¹, и с учётом отброшенного ведущего разряда мантисса будет 10…0.
    Порядок 011…11 + 1 = 10…0.

    С учётом обратного порядка байтов double 3,0 будет выглядеть так
    • 6 нулевых байтов — мантисса
    • 0000.1000: нижние полбайта — это мантисса, верхние — уже порядок
    • 0100.0000: бит знака и ещё семь битов порядка

    Получается 00.00.00.00.00.00.08.40.
    Разбиваем на два куска памяти по 4 байта.
    [00.00.00.00] [00.00.08.40]
    Опять-таки не забудем, что у целых тоже обратный порядок байтов — и получается 0 и 40080000.
    Ответ написан
    Комментировать
  • Почему не переполняется float?

    @Mercury13
    Программист на «си с крестами» и не только
    Представьте, у нас десятичная арифметика с тремя значащими цифрами. Соответственно, сложение работает не более чем с пятью цифрами: три собственно значащих, слева на перенос и справа на округление. То, что получилось, в любом случае будет округлено до трёх.
     99900000000000
    +             1,00
     -----------------
     9990   →   9,99e13

    Если сделать второе слагаемое покрупнее, то будет
     99900000000000
    +   50000000000
     -----------------
     9995   →   1,00e14 → переполнение


    То есть вот что надо добавить, чтобы случилось переполнение: в зависимости от настроек сопроцессора или ulp(FLT_MAX) (ULP = Unit of Last Place — цена младшего разряда на данном порядке), или ulp(FLT_MAX)/2.
    Ответ написан
    Комментировать
  • Почему за время, равное периоду обращения угол поворота радиуса-вектора равен 2π? Откуда взялось π именно в этой формуле?

    @Mercury13
    Программист на «си с крестами» и не только
    Определение π: отношение длины окружности (P) к диаметру. То есть P=2πR.
    Определение радиана: дуга, равная радиусу. Из предыдущей формулы полный оборот = 2π радиан.

    Угловая скорость измеряется в угловых единицах в секунду. Из-за удобного преобразования из угловых единиц в линейные и наоборот в науке широко используют радианы, которых в полном обороте 2π.

    Если T = секунд/оборот, то T/2π = секунд/радиан, и 2π/T = радианы/секунду. Вот и всё.
    Хотите в градусах? Пожалуйста! T/360 = секунд/градус, и 360/T — градусы/секунду.
    Ответ написан
    Комментировать
  • Зачем во избежание XSS нужно указывать на каждой странице кодировку, если злоумышленник все равно может изменить ее?

    @Mercury13
    Программист на «си с крестами» и не только
    Совет несколько устаревший, и вот он для чего.
    Есть откровенно странная кодировка под названием UTF-7, которую по-чёрному использовали для XSS. Например:
    +ADw-script+AD4-alert(+ACc-utf-7!+ACc-)+ADw-+AC8-script+AD4-


    Задачей хакера было заставить браузер верить, что текст в UTF-7, прежде чем в HTML’е придёт маркер кодировки.
    IE11 поддерживал UTF-7, поддерживает ли Edge — не в курсе. Остальные браузеры отказались лет десять назад.

    Подробнее:
    https://nedbatchelder.com/blog/200704/xss_with_utf...

    Ну и будет просто некрасиво, если пользовательские данные появляются до маркера кодировки и браузер эту самую кодировку неверно опознал. Но хоть XSS не будет ни в одной кодировке, основанной на ASCII.
    Ответ написан
    3 комментария
  • Почему n^3 работает быстрей чем 2^n?

    @Mercury13
    Программист на «си с крестами» и не только
    Одно из двух.
    А. O(n³) и O(2n) — сложность каких-то алгоритмов.

    Читайте определение символов Ландау, и будет всё понятно.
    n³ = o(2n) при n→∞, что означает:

    lim{n→∞} n³ / 2n = 0.

    Что означает: при безграничном повышении n алгоритм, работающий за n³, будет иметь всё большее и большее преимущество перед конкурентом.

    Б. n³ и 2n — функции, которые нам надо вычислить.

    Сложность первой O(1) (всегда два умножения), сложность второй в общем случае — O(log n) (из-за того, что логарифмы от разных оснований отличаются на константу, а константу символы Ландау не учитывают, основание логарифма не пишут).

    UPD. Что значит «в общем случае»? Оценку могут увеличить различные второстепенные алгоритмы вроде выделения памяти и преобразования в десятичный вид, и уменьшить — то, что 2n можно вычислть сдвигом. Не забудьте, что сложность алгоритмов определяется при n→∞.
    Ответ написан
    Комментировать
  • Так ли необходима TN матрица для дизайна?

    @Mercury13
    Программист на «си с крестами» и не только
    «Среднепотолочный» IPS для дизайна лучше «среднепотолочного» TN, независимо от разрядности ЦАПа и разрешения.
    На IPS удобнее сидеть долго, и на TN принципиально нельзя настроить цветопередачу: меняется даже при повороте головы.

    UPD. Пишу «среднепотолочный», потому что видал плохие IPS на уровне TN’ов. Может, появились хорошие геймерские TN на уровне IPS’ов средней руки, я лично таких не видел.
    Ответ написан