• Опасно ли повышение ГЦ экрана с помощью программы?

    @Mercury13
    Программист на «си с крестами» и не только
    Вероятность, что он сломается, крайне невелика. Но, как известно, «заметно — это 20%», для 60 Гц это будет 72.
    На 75 Гц типичный монитор гарантированно откажет (обратимо), а на 72 — будет пищать на определённых изображениях.
    Проверено на личном LG W2220P и утилите nVidia.
    Ответ написан
    Комментировать
  • Как можно заразиться вирусом просто посещая сайты?

    @Mercury13
    Программист на «си с крестами» и не только
    Сейчас это крайне тяжело. Заражение возможно через четыре канала:
    • Уязвимости конкретного браузера. Кстати, это одна из причин, почему каждая вкладка Хрома — отдельный (и низкопривилегированный) процесс: если процесс хакнут, меньше шансов, что дойдёт до овладения компьютером.
    UPD. Это такой набор данных (например, специально созданный GIF/JPEG/HTML), который, например, пробивает в браузере буфер.
    • Уязвимости плагинов. Уязвимости в Java — это настолько обсосанная вещь, что и говорить не буду; вроде от Java в вебе отказались даже сами Oracle. Flash каждую неделю обновляют. Уязвимости плагинов плохи двумя вещами: 1) Пускай сейчас в мире один браузер — есть ещё два десятка прихлебателей и три браузера «труба пониже, дым пожиже». А Флэш один на всех; 2) Старое плагинное API, оставленное только Флэшу,— большая дыра в безопасности.
    • Уязвимости прочего софта. Казалось бы, качаешь PDF — а это эксплойт для Adobe Reader.
    • «Троянские кони» — но это уже надо своими руками запустить EXE.
    Кстати, в нашей пиратской культуре считается, что UAC надо побыстрее отключить, и во всех «левых» дистрибутивах он выключен. По-моему, это в корне неверно.
    Ответ написан
    8 комментариев
  • Что за компонент на плате рядом с HDD?

    @Mercury13
    Программист на «си с крестами» и не только
    Очень похоже на картридер для обычной Secure Digital.
    Ответ написан
    Комментировать
  • Какую библиотеку использовать для построения простых графиков?

    @Mercury13
    Программист на «си с крестами» и не только
    Если Qt — то QWT.
    Ответ написан
    1 комментарий
  • Как исправить данный алгоритм поиска максимального подмассива?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Учите, что означает операция «запятая». Если вы хотите выдать наружу три числа — так и пишите возвращаемым типом не int, а структуру из трёх чисел.
    2. Передавать vector по значению невыгодно, лучше по константной ссылке.

    struct ArrayOut {
      int low, high, sum;
    
      ArrayOut() : low(0), high(0), sum(0) {}
      ArrayOut(int aLow, int aHigh, int aSum) : low(aLow), high(aHigh), sum(aSum) {}
    };
    
    
    ArrayOut Find_Max_Crossing_Subarray(const vector<int>& A, int low, int mid, int high)  { ... }


    UPD. Операция «запятая» — это странный хак Си, позволяющий впихнуть несколько операторов туда, где разрешён только один. В основном в цикл for.
    Ответ написан
  • Как в графе найти самый "большой" полный подграф?

    @Mercury13
    Программист на «си с крестами» и не только
    Это штатная задача, т.н. «задача о клике», NP-полная. Ничего лучше усовершенствованного перебора не существует.
    https://ru.wikipedia.org/wiki/Алгоритм_Брона_—_Кербоша
    Ответ написан
    Комментировать
  • Как отсортировать "случайно", с возможностью отсортировать так же в будущем?

    @Mercury13
    Программист на «си с крестами» и не только
    У генератора псевдослучайных чисел есть такое понятие, как «случайная затравка» (random seed). Затравку берут из истинно случайных мест вроде счётчика тактов процессора. Достаточно сохранить затравку — и последующие запуски генератора дадут те же результаты.

    Допустим, манипуляции с затравкой есть вот тут.
    php.net/manual/ru/function.mt-srand.php
    Ответ написан
    Комментировать
  • Почему выражение делится на 6?

    @Mercury13
    Программист на «си с крестами» и не только
    Разложим на множители, получается mn(m−n)(m+n)(m²+n²). А теперь думаем.

    Делимость на 2. Или m делится, или n, или m+n.
    Делимость на 3. Хоть у одного остаток 0 — делимость налицо. У обоих 1 или 2 — делится m−n. У одного 1, у другого 2 — делится m+n.

    Значит, делится на НОК(2,3) = 6.
    Ответ написан
    2 комментария
  • Какой хэшкод является идейно верным?

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

    Потому криптографические хэши огромные (устаревший MD5 — 16 байтов, большинство современных — 32 или 64). Как его записать в БД, если и тип такой не всегда есть, а BLOB’ы — пальба из пушки по муравьям? Как-то закодировать в строчку. К тому же в вебе есть места, где двоичные данные не катят и без строчного кодирования никак (например, URL’ы).

    Автор, очевидно, мэн из лагеря Perl/PHP и в дополнение к вычислению хэша взял и закодировал его. Вероятно, методом BASE64 (8 символов BASE64 соответствуют 6-байтовому хэшу). Для чего так кодировать обычные, не криптографические хэши — я вообще не знаю!
    Ответ написан
    Комментировать
  • Как построить треугольник?

    @Mercury13
    Программист на «си с крестами» и не только
    Этот код вычисляет координату верхней вершины треугольника.

    2,3 — полученная обмерами конкретного экрана пропорция пикселя. Расчётная 2,4 = (640·3) / (200·4), и заметно, что на эмуляторе треугольник слегка сплюснутый.
    √3 / 2 — высота треугольника при единичном основании.
    Координаты вершин (100, 160), (400, 160) [основание соответственно 300]. Какие (X, Y) у третьей?
    X3 — среднее между ними, основание 300, ну а Y3 = 160 − 300·(√3 / 2) / aspect.

    Первое, что вам придётся сделать на современном компьютере — избавиться от коэффициента 2,3: пиксели-то сейчас квадратные. Затем как можно больше констант сделать производными. Например:
    TriangleX = 100
    TriangleY = 50
    TringleSide = 300
    Sqr32 = Sqr(3) / 2
    TriangleHeight = TriangleSide * Sqr32
    X1 = TriangleX
    Y1 = TriangleY + TriangleHeight
    X3 = X1 + TriangleSide
    Y3 = Y1
    X2 = X1 + TriangleSide / 2
    Y2 = TriangleY

    UPD. Я поменял местами X2/X3 так, чтобы оно сходилось с экраном. И ты не забудь. То есть, 400 — теперь это будет X3!!!
    Ответ написан
  • Java или C++ в качестве первого языка. Что выбрать?

    @Mercury13
    Программист на «си с крестами» и не только
    Только Java. Почему…
    1. Достаточно удачная стандартная библиотека.
    2. Проверка массивов на индекс — для начинающего бесценно.
    3. Не настолько полагается на указатели, когда человек ещё толком не знает, что это такое.
    4. Очень строгая проверка типов.
    5. Статическая типизация, Си-подобный синтаксис (хотя всё это у обоих).
    6. Сообщения об ошибках не настолько страшны (стандартная библиотека Си++ полагается на шаблоны).
    Вторым языком человек уже съест что угодно, но Си без плюсов — один из худших первых. Си++ не так плох, но Java, по-видимому, лучше.
    Ответ написан
    4 комментария
  • Как вывести уравнение прямой в R3 пространстве через точку и направляющий вектор через определитель?

    @Mercury13
    Программист на «си с крестами» и не только
    Через векторы: M = M0 + td, t — параметр.
    (мы различаем точку M0 и вектор td, но точка + вектор = точка)
    По координатам: x = x0 + pt, и т.д.
    Выпишем, чему равняется t, и получаем наше уравнение.
    Ответ написан
    Комментировать
  • Как решить ошибку LNK2019?

    @Mercury13
    Программист на «си с крестами» и не только
    Судя по всему, эти функции в библиотеках OpenGL. Надо включить в проект opengl32.lib (и, возможно, glu32.lib).
    Ответ написан
  • Задача "Бинарные числа"?

    @Mercury13
    Программист на «си с крестами» и не только
    (n > 0) and (n and (n - 1) = 0)
    Раз у вас паскаль, первый AND логический, второй битовый.
    Второе условие — стандартный программистский приём, срезающий последний единичный бит.

    UPD2. Да, ты меня слегка перехитрил с алгоритмом, но, нем не менее…
    1. Если число <= 0 — без единой итерации пишет YES, что неверно.
    2. Если у вас условие сложное — лучше разделить программу на проверку условия (подпрограмму или переменную типа boolean) и реакцию на это условие.
    3. Стандартная ошибка начинающих: допустим, не сработало условие N mod 2 = 1. Зачем писать N mod 2 = 0, если есть else?
    Ответ написан
  • Как передать вывод?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Чтобы получить ссылку на CMD.EXE, прочитайте переменную окружения COMSPEC.
    2. Не используйте ShellExecute для запуска того, что гарантированно программа, для этого есть CreateProcess.
    3. Да, и не забывайте, что ShellExecute заканчивает работу, когда программа пошла на исполнение. Если нужен результат исполнения — всё тот же CreateProcess + ввод-вывод через каналы + WaitForSingleObject.
    Ответ написан
    Комментировать
  • Принцип работы анимации?

    @Mercury13
    Программист на «си с крестами» и не только
    time — это длительность такта (в игре, очевидно, не просто переменный FPS, но и переменная тактовая частота). Писал такое, правда, не в платформере, а в гоночке.

    rect.left — это точное решение дифура left′ = dx (движение с постоянной скоростью). Очевидно, dx где-то устанавливается по управлению.

    rect.top и dy — это приближённое решение дифура top′′ = 0,005, если снят флаг onGround (полёт под действием силы тяжести). Здесь 0,005 — это ускорение силы тяжести, ось Y направлена вниз. Дифур второго порядка, преобразуется в систему top' = dy, dy′ = 0,005, и то, что в первом случае было точным, здесь приближённое, но приемлемое для игр.

    currentFrame просто прокручивается, чтобы 6-кадровая анимация прошла за 1200 тактов, независимо от частоты. Здесь 1200 = 6 / 0,005.

    Заметьте, dx и dy проходят по разным трактам данных: один — состояние управления, второй — состояние физики персонажа. К тому же что делает dx = 0 и где он ставится не в 0, чтобы не зависеть от частоты автоповтора клавы — непонятно. И много магических констант. Говнокод.

    UPD. Прямые ответы на ваши вопросы.
    1) 6-кадровая анимация, но тут одно из двух. Либо из-за огромного цикла (1200 тактов) явно анимируются не ноги. А может, афтар гонит такты с предельной частотой и потому 1200 тактов действительно пройдут за секунду-две, но тогда это слишком уж явная привязка к скорости компьютера;
    2) в зависимости от номера кадра выбираем тот или иной спрайт на атласе;
    3) dy — скорость, и чтобы откорректировать положение (rect.y), надо прибавить к нему скорость·время.

    UPD2. Кроме того, непонятно, почему в коде анимации нет бега в разные стороны. Хотя из-за крайне простой физики есть подозрение, что жанр — бесконечная бегалка.
    Ответ написан
    3 комментария
  • Как продумать геймплей, чтобы он был завлекающий и сбалансированный?

    @Mercury13
    Программист на «си с крестами» и не только
    К сожалению, геймдизайн — это очень творческая профессия, и Extra Credits предупреждает: дизайн, базирующийся на собранных данных, не делает нового, он только оттачивает имеющееся.
    https://www.youtube.com/watch?v=nqGcXOksFGg

    Может быть, это вам и нужно — заработать побольше денег на клоне Dota (PUBG, Candy Crush, Angry Birds). Но про творчество попытаюсь рассказать.

    1. Ходите на художественные выставки.
    2. Играйте во что угодно, впрочем, необычным образом. Во-первых, играйте не только в любимые жанры, но и в файтинги, RPG, симуляторы и прочее. Во-вторых, часто хватит потратить на игру четыре-пять часов. В-третьих, прикарманивайте их решения. В четвёртых, ищите поломы системные (например, где-то ∞ денег) и поломы отдельной подсистемы (застревающая камера). Намеренные ли эти поломы? Мешают ли играть?
    Ответ написан
    Комментировать
  • HTML5 game | Как убрать задержку клавиатуры после первого нажатия клавиши?

    @Mercury13
    Программист на «си с крестами» и не только
    Если игрок управляет дискретным курсором или маркером, например, в сапёре или пасьянсе (если те играются с клавиатуры, разумеется) — так и надо, нужен системный автоповтор клавиш.

    Если игрок управляет непрерывно движущимся персонажем, надо отойти от системных автоповторов и сделать две независимых подсистемы.
    • Подсистема реагирования на клавиатуру. При нажатии на кнопку системный код превращается в виртуальную клавишу (например, «Идти вверх», «Выстрел» или «Бомба»). Затем в битовой маске управления в соответствующей позиции ставится 1. При отпускании — соответственно 0.
    • Подсистема тактов игры. По таймеру проводится такт игры — акт управления всеми её персонажами, главным и врагами. В зависимости от состояния клавиш мы ведём Главного в ту или иную сторону.
    • Третья подсистема — рендерер игры. Она может быть синхронной с тактами игры или нет, в зависимости от того, какое мы хотим поведение на слабых машинах и есть ли желание проработать асинхронщину (не обязательно многопоточную; например, рендерер может поминутно вызывать «прокрути такт игры, если надо»). А также звук и сеть — в нашем вопросе, впрочем, не до них (и вообще рендерингом занимается браузер).

    Если тактовая частота игры невелика (скажем, до 16) и приходится подгонять героя «на один шажок», у меня есть маленький лайфхак, оставшийся с J2ME. Создаём две маски: «нажатая» и «удерживаемая».
    • При нажатии: поставить 1 в обе маски.
    • При отпускании: поставить 0 только в удерживаемую.
    • При управлении героем: нажатая := нажатая OR удерживаемая; именно по этой «нажатой» управляем героем; нажатая := 0.

    С новым годом, и хороших игр!
    Ответ написан
    1 комментарий
  • Нету вывода из массива с указателями из структуры с++?

    @Mercury13
    Программист на «си с крестами» и не только
    Первое и главное. Удивительно, что у вас программа заработала, ведь text.sentences не инициализировано. У меня вылет.

    Ну и извечная ошибка начинающего «плюсовика»: память выделяется, непонятно, кто чем владеет, и, разумеется, память «течёт». Для чего, извините, в Си++ сделали инкапсуляцию, конструкторы и деструкторы?
    Ответ написан
    Комментировать
  • Почему компилятор не видит конструктор?

    @Mercury13
    Программист на «си с крестами» и не только
    Нет, дело не в этом. Линкер не может найти среди OBJ-файлов конструктор MyDb::MyDb. Очевидно, mydb.cpp не скомпилировался или не подключён.
    1) Убедиться, что mydb.cpp включён в проект. 2) Build → Run Qmake.

    Гуглите понятие «единица трансляции» и что делает линкер.
    Ответ написан
    1 комментарий