Задать вопрос
  • Почему после определения класса ставится точка с запятой, а после определения функции - нет?

    @Mercury13
    Программист на «си с крестами» и не только
    Это пошло ещё с Си. Так что, простите, ничего плюсового не будет, только «няшная сишка».
    // Переменная безымянного типа
    struct {
      int x, y;
    } point;
    
    // Синоним для типа: вместо struct _Point можно писать просто Point.
    typedef struct _Point {
      int x, y;
    } Point;
    Ответ написан
    Комментировать
  • Приведение типов указателей, как перегрузить?

    @Mercury13
    Программист на «си с крестами» и не только
    Для этого есть специальная операция, dynamic_cast.
    myClass = dynamic_cast<MyClass*>(interface);
    Если interface не MyClass, то вернёт NULL.

    В случае, если через dynamic_cast присваиваем не указатели, а ссылки, выбросит аварию std::bad_cast.

    UPD. Такие преобразования «вниз» — это компромисс между ООП и реальностью, которая вынуждает упрощать интерфейсы. Например, в C++ Builder
    int __fastcall SomeObject::ButtonClick(TObject* Sender)
    {
      TButton* button = dynamic_cast<TButton*>(Sender);
      ...
    }
    Ответ написан
    9 комментариев
  • В чем различие между объявлением с new и без него?

    @Mercury13
    Программист на «си с крестами» и не только
    ПОЛОЖЕНИЕ В ПАМЯТИ
    Без new: static/глобальная — в сегменте данных, локальная — на стеке. В сегменте данных память отводится при компиляции линковке, создать стековый фрейм — две команды процессора.
    С new: в куче. Управление кучей — довольно сложная задача, и если этих new много, программа может начать тормозить.

    ВРЕМЯ ЖИЗНИ
    Без new: объект живёт, пока выполнение находится в данном блоке. При выходе из блока автоматически срабатывает деструктор.
    С new: уничтожаем, когда хотим.

    ИМЕНОВАНИЕ
    Без new: объект привязан к своему имени.
    С new: объект безымянный (имя только у указателя). Потому возможны структуры данных переменного размера: динамические массивы, связанные списки, деревья и прочее.

    РАЗМЕР
    Без new: задан при компиляции. То есть массив на 10 позиций, и точка, больше — только перекомпиляцией.
    С new: произвольный.
    Ответ написан
    Комментировать
  • Как в с++ вывести данные в stdout?

    @Mercury13
    Программист на «си с крестами» и не только
    Вам, как я понял, нужен standard I/O redirection — чтобы то, что мы пишем куда-то, служило входом для процесса FFMPEG, заранее запущенного. В Windows делается это через каналы (pipes) и CreateProcess.
    https://msdn.microsoft.com/en-us/library/windows/d...
    Ответ написан
    Комментировать
  • Что произойдёт после move-касте содержимого shared_ptr?

    @Mercury13
    Программист на «си с крестами» и не только
    После move-каста содержимого shared_ptr мы говорим: объект под shared_ptr идёт на заклание, и в операциях перемещения мы можем потрошить его как угодно — лишь бы объект остался корректным. В данном коде (как я уже писал, он не компилируется) у нас одни ссылки, и не будет ровным счётом ничего: не выполнится ни одна операция перемещения.

    Однако возможна такая ситуёвина, никак не связанная с временными ссылками. Во втором есть неуправляемая ссылка на первый — и при определённых условиях она может стать висячей.

    Если в T2 всё-таки не ссылка, а экземпляр (T1 m_var), возможно, операция перемещения оставляет объект под ptr в некорректном состоянии, и деструктор ~T1() не может его уничтожить, или какая-то из операций над ptr не подозревает, что объект под ptr выпотрошен.

    UPD. Что делает updateSearchResults? Только он может продлить время жизни объекта, сохранив где-то shared_ptr.

    UPD2. Константная временная ссылка (const T&&) никакого смысла не несёт (по факту в STL пару раз используется). «Неизменный» и «можно выпотрошить» — это слегка противоречивые вещи.
    И всё-таки я грешу на updateSearchResults, который сохраняет где-то объекты. Проблема может решиться, если в PoiSearchPlacesLocation ссылку заменить на shared_ptr. И — ВНИМАНИЕ — соответствующим образом подкорректировать сигнатуру конструктора. У shared_ptr есть конструктор, который берёт под управление любой объект-указатель, создавая новый счётчик, но хреново будет, если один и тот же объект управлять двумя разными счётчиками.
    Ответ написан
  • Как отличить "слово" от бессмысленного набора символов?

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

    Без заготовленных ранее словарей никуда — например, слова «Шымкент» или «парашют» с «невозможными» буквосочетаниями (их вероятность в ЦМ будет, разумеется, нулевая).
    Ответ написан
    Комментировать
  • Как решить хитрую задачку про этажи?

    @Mercury13
    Программист на «си с крестами» и не только
    Пусть турнир назначен на этаже X.
    На этажах 1…X живут L’ людей, на этажах X+1…N — H′ людей.
    Вопрос 1. Стоит ли переносить турнир на этаж X+1?
    Тогда для L′ людей добавляется лишний этаж, для H′ — исчезает лишний этаж, и выигрыш будет H′−L′.
    Стоит, если H′ > L′. Не стоит, если H′ < L′. Безразлично, если H′ = L′.

    Вопрос 2. Возможно ли такое: вверх на 1 перенести не удаётся (будет хуже или безразлично), но этаж Y > X оптимальнее (строго)?
    Раз вверх на 1 перенести нельзя, то H’ <= L’.
    Если этаж Y − 1 безразличен с Y, перенесём турнир туда. Если Y − 2 тже безразличен, то туда, и т.д. Остановимся на этаже Z. Видно, что Z > X + 1: если мы в результате этих движений добрались до X+1, то он лучше X, противоречие.
    Раз Z — оптимальный этаж, то у этажа Z−1 > X есть свои L″ и H″, и поскольку с Z−1 на этаж вверх перенести всё же можно, то H″ > L″.
    С другой стороны, при повышении этажа увеличивается L и уменьшается H, и L″ >= L′ >= H‘ >= H″, то есть H″ <= L″. Противоречие.

    Следствие 3. Если турнир выгодно перенести на несколько этажей выше/ниже, то его выгодно перенести и на этаж выше/ниже.

    Задача 4. Пусть на этажах 1…X−1 живут L людей, на этаже X — M людей, на этажах X+1…N — H людей.
    Для простоты считаем, что сверху и снизу есть по фиктивному пустому этажу — то есть теоретически можно (на практически неоптимально) проводить турнир в подвале и на чердаке.
    Задачу с переносом турнира вверх мы уже решали, и условие того, что турнир нельзя (или безразлично) перенести на этаж вверх: H <= L + M.
    Условие того, что турнир можно (или безразлично) перенести с этажа X−1: H + M >= L.
    Поскольку H + M + L = N (кол-во людей), то эти условия можно записать в виде: L + M >= N/2, L <= N/2
    (всё, получили чеканное условие, и ключи от чердака и подвала можно отдать техслужбам гостиницы.)

    Решение: Идём по этажам, считаем людей. Где накопится N/2, там проводим турнир.

    // считаем полное кол-во
    N = 0
    для i = [0..nFloors)
      N += a[i]
    // ищем, где половинка N
    sum = 0;
    для i = [0..nFloors)
      sum += a[i]
      если sum * 2 >= N
        вывести: i
        СТОП

    Расширенное решение: Если накопилось ровно N/2, безразличны данный этаж, все нулевые над ним, и ещё один ненулевой. (Можно без кода?)
    Ответ написан
    Комментировать
  • Опасно ли повышение ГЦ экрана с помощью программы?

    @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).
    Ответ написан