Задать вопрос
  • Почему ругается на дружественную функцию?

    @Mercury13
    Программист на «си с крестами» и не только
    Причина, вероятно, в том, что ты допустил код в хедере, и sort_pred оказался реализован дважды в разных единицах компиляции.
    Либо сделай sort_pred inline (inline кода не производит, производит его тот, кто этот inline вызовет), либо вынеси его в cpp-файл.

    Ах, да. Почему всё правильно с этой функцией…

    bool operator()(two *t)
    {
        return t->getA()==a;
    }


    А потому что тело внутри класса автоматически inline и тоже кода не производит.
    Ответ написан
    Комментировать
  • Как правильно обрабатывать изображения в стороннем потоке?

    @Mercury13
    Программист на «си с крестами» и не только
    Что я пока вижу.
    1. В любой высокоуровневой библиотеке CreateThread использовать ЗАПРЕЩЕНО, вместо этого используй beginthreadex (или что-то ещё, предоставленное библиотекой). Или, раз уж ты по-чёрному используешь VCL, особо не убудет, если будешь использовать TThread.
    2. Lock и Unlock — это обыкновенный мьютекс. Все конкурирующие потоки, кому захочется рисовать на холсте, ждут и курят, ничего не делая.
    3. Самое-то главное ты упустил. Если ждёшь помощи, не нужно так секретничать, что не поймёшь, в чём дело. Где — хотя бы примерно — тело потока, и что делается в главном потоке?
    4. А как надо работать? Есть некая структура данных, в которой мы возвращаем из потока обработанные картинки, и volatile bool isWorking, который отвечает за то, работает поток или нет. Когда этот флажок false, главный поток имеет право работать с нашей структурой. Он переключается в true — в структуре может быть любой мусор, обращаться к ней запрещено! Если ещё и надо предупредить, когда поток закончился и можно забирать информацию — TThread.Synchronize или PostMessage. То и другое работает только в GUI-программах, если консольная — то через события (CreateEvent).
    5. А почему «нельзя этого делать»? Если партия приказала, значит, надо. Просто многопоточность — это тяжёлое дело, ошибки на каждом шагу, но «принципиально нельзя» — нет такого.
    Ответ написан
    4 комментария
  • Тригонометрическая регрессия?

    @Mercury13
    Программист на «си с крестами» и не только
    Совершенно верно. Вообще регрессия методом наименьших квадратов крайне легко выводится для любой формулы вида

    y = A1·f1(x) + A2·f2(x) + … + Am·fm(x)

    при условии, что заданы m пар (x1, y1) ... (xm, ym). Неизвестные — A1…Am.

    Чуть посложнее, надо вспоминать теорию матриц — для N > m пар.
    Ответ написан
    5 комментариев
  • Почему получается странная кодировка в файле?

    @Mercury13
    Программист на «си с крестами» и не только
    msc.insert(dat);
    Перед этой строчкой dat правильный, проверь?

    Если правильный — возможно, виновата ваша коллекция.
    Ответ написан
    1 комментарий
  • Странная кодировка в файле,с++?

    @Mercury13
    Программист на «си с крестами» и не только
    Причина у тебя другая.

    char* — это просто указатель на чей-то другой отрезок памяти. И программист должен чётко осознавать его время жизни. Скорее всего, строка исчезла раньше, чем указатель. Используй автоматические строки наподобие std::string.

    Кроме того, std::map будет, если я не ошибаюсь, сортировать по адресам, а не по строкам. Чтобы всё работало, надо писать свою операцию <, читай документацию, как.
    Ответ написан
    6 комментариев
  • [Delphi] Как постоянно генерировать новый класс окна формы?

    @Mercury13
    Программист на «си с крестами» и не только
    Если ты имел в виду оконный класс (понятие WinApi) — переопредели TWinControl.CreateParams.

    type
      TfmMain = class (TForm)
      .....
      protected
        procedure CreateParams(var Params : TCreateParams); override;
      end;
    
    procedure TfmMain.CreateParams(var Params : TCreateParams);
    begin
      inherited;
      // а затем подкорректируй Params по собственному желанию.
    end;

    Что, кстати, пишешь? Вирус? :)

    Если ты имел в виду класс как понятие ООП — никак.

    P.S. И всё-таки напиши свою задачу. Защититься от FindWindow? — я только что написал, как. Защитить «внутренности» программы от патчей? Придумать хакоустойчивое API?
    Ответ написан
    2 комментария
  • Как инициализировать строку PCHAR в с++?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Что принимает система: PCHAR или PCHAR*?
    2. Если версии Delphi достаточно новые, PCHAR — это, скорее всего, wchar_t* и надо просто передавать «широкую» строчку L"usb3000".
    3. Постарайся, чтобы reinterpret_cast не было; это признак того, что ты делаешь что-то неверно. Единственное, где он в подобных API допустим — это в callback’ах для передачи замыкания (информации о том, какая подпрограмма и при каких обстоятельствах запустила функцию, вызвавшую callback). P.S. Надумал и второе назначение reinterpret_cast — функция, которая может принимать данные разных типов (вроде SendMessage из Win32).
    Ответ написан
    Комментировать
  • Как построить произвольное дерево?

    @Mercury13
    Программист на «си с крестами» и не только
    Придумал.
    Для каждого узла делаем координату deltaX — смещение по X относительно отца.
    И динамический массив из пар (x1, x2) — границы деревьев на всех уровнях.

    алг рекурсия(узел: Узел)
      длина_мас = 0
    
      // Прогоним алгоритм для сыновей, рассчитаем длину массива
      для всех сыновей (узел) → сын
        рекурсия(сын)  // ыгы, в основе банальный обход в глубину
        длина_мас = макс(длина_мас, сын.границы.длина)
      длина_мас = длина_мас + 1
    
      разложить сыновей на плоскости, руководствуясь их массивами границ
         и вашим чувством прекрасного;  соответственно присвоить ИХ deltaX
         (оставлю это как домашнее задание)
    
      // Рассчитаем границы дли нашего узла
      границы.установить_размер(длина_мас)  
      границы.заполнить(левая=+M, правая=—M)
      полширины = узел.ширина / 2
      границы[0] = (левая = −полширины, правая = узел.ширина − полширины)
      для всех сыновей (узел) → сын
        для i = [0 .. сын.границы.длина)      
          узел.границы[i+1].левая = мин(
               узел.границы[i+1].левая, сын.границы[i].левая + сын.deltaX)
             // если сыновья идут слева направо, этого хватает!
          узел.границы[i+1].правая = сын.границы[i].правая + сын.deltaX
        сын.границы.установить_размер(0)    // массив больше не нужен
    
    // Если же нужны точные координаты каждого узла…
    
    алг уточнитьКоординаты(узел: Узел; Y: целое)
      узел.коорд.Y = Y
      Yсына = Y + высота_яруса
      для всех сыновей (узел) → сын
        сын.коорд.X = узел.коорд.X + сын.deltaX
        уточнитьКоординаты(сын, Yсына)


    +M — запредельно большое число
    −M — отрицательное число с запредельно большим модулем
    Ответ написан
    21 комментарий
  • В очередной раз графика в дельфи, как сделать поворот?

    @Mercury13
    Программист на «си с крестами» и не только
    Пока без возможности запустить программу вижу у тебя две проблемы.
    1. Две ошибки в повороте. а) неверная матрица вращения; б) во второй строке поворота имеет дело с новым X, а не старым.
    2. Подобные операции с целыми числами приводят к накоплению погрешностей; через несколько итераций кораблик быстро станет кособоким. С дробными, вообще-то, тоже, только не так быстро и есть шансы, что задачу выполним раньше, чем проблемы будут мало-мальски заметны.

    По поводу качества кода — я бы сделал функцию
    function RotateAround(const source, pivot : TPoint) : TPoint;
    Ответ написан
    Комментировать
  • Проблема с переменной в Delphi. Что делать?

    @Mercury13
    Программист на «си с крестами» и не только
    Если она так нужна — в настройках компиляции отключи оптимизацию.
    Ответ написан
    Комментировать
  • Как вывести на NES (Dendy) статическую картинку, подключив компьютер в порт картриджа?

    @Mercury13
    Программист на «си с крестами» и не только
    :) Проще уж выпотрошить «денди» и запихнуть внутрь собственную схему (да хоть Raspberry Pi).
    Ответ написан
  • Как построить N-дерево и найти самую длинную ветвь без ветвлений?

    @Mercury13
    Программист на «си с крестами» и не только
    Что-то типа

    максРазмер : целое
    началоМаксВетви: узел
    
    проц максВетвь(узел : Узел, началоВетви: Узел, текРазмер: целое)
      в зависимости от степени узла «узел»
        если 0:
          если текРазмер > максРазмер
            максРазмер = текРазмер
            началоМаксВетви = началоВетви
        если 1: максВетвь(единственныйCын, началоВетви, текРазмер + 1)
        если 2+:
          для всех сыновей
            максВетвь(сын, сын, 1)
    
    максВетвь(корень, корень, 1)


    Считает макс. ветвь, кончающуюся листом; если может кончаться и развилкой — оставляю как домашнее задание.
    Ответ написан
    Комментировать
  • Как устранить коллизии?

    @Mercury13
    Программист на «си с крестами» и не только
    Первое. Заводи массив, в простейшем случае (таблица ограниченного размера) — как минимум вдвое больше, чем желаемая ёмкость. В каждом гнезде или пара (ключ, значение), или «ничего». То ли какое-то спец.значение ключа отведи на «ничего», то ли храни указатели на элементы (не забудь наладить управление памятью), то ли сделай два параллельных массива, один Entry[], второй bool[] (можно добавить bool в Entry, так лучше с прогерской точки зрения, но перерасход памяти).

    Второе. Вычисляем хэш, берём остаток от деления на n, заглядываем в таблицу. Если там что-то есть, но у этого «чего-то» другой ключ, перескакиваем на 1 вперёд. Если снова неправильный ключ — то ещё на два, если снова — то ещё на три… Надеюсь, поймёшь, как делать цикл…

    Третье. Зачем тебе map, если задача — сделать свою хэш-таблицу, а не пользоваться чужим самобалансирующимся деревом.

    Такая таблица может только расширяться, удаление если и можно наладить, то тяжело. Википедия рекомендует второе спец.значение (кроме «ничего») — «тут когда-то что-то было». При поиске «тут когда-то что-то было» считаются занятыми, а при добавлении — свободными. Дурость в общем — удаление не упрощает поиск.
    Ответ написан
    Комментировать
  • Для чего в игры вводят свитки идентификации (Diablo2, PoE)?

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

    @Mercury13
    Программист на «си с крестами» и не только
    Если я не ошибаюсь, особенность системы безопасности Windows Vista+. Так что никак.
    Ответ написан
    Комментировать
  • Как изменить приоритет символов на клавиатуре?

    @Mercury13
    Программист на «си с крестами» и не только
    Если всё-таки хочешь по пути изменения раскладки, гугли Microsoft Keyboard Layout Creator.
    Ответ написан
    1 комментарий
  • Как открыть программу Power Point внутри формы на Delphi 7?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Нужен ActiveX-компонент PowerPoint.
    Как-то не доводилось делать, поэтому точный рецепт сказать не могу.
    2. WinExec — разве эта функция не deprecated в пользу CreateProcess и ShellExecuteEx?
    Ответ написан
    Комментировать
  • PHP. ООП. Сухие примеры с книг, а применять на проектах не получается, как быть?

    @Mercury13
    Программист на «си с крестами» и не только
    В ≈90% веб-работ ООП либо вообще не нужно, либо используется какой-то чужой объект как чёрный ящик. В чём дело? А в том, что сессия PHP недолговечна. Отдал пользователю страничку — и кирдык. А всё, что нужно припрятать до новой встречи, рассовываешь по кукам, сессиям и БД.

    Я бы посоветовал: а) экспериментировать с чем угодно другим, кроме веба; б) если есть возможность, писать в более-менее объектном стиле на JavaScript.

    P.S. И вторая причина — почти всё, что нужно вебисту, уже кем-то написано, остаётся только собрать всё это в единый сайт. И третий совет: где в серверном вебе легко найти применение ООП, так это в поддержке сложных форматов (вики-разметка, например) и сложных протоколов.
    Ответ написан
    2 комментария
  • Почему не работает мой mergesort?

    @Mercury13
    Программист на «си с крестами» и не только
    int left[leftLen]

    Будь осторожен, на «боевых» задачах чревато переполнением стека. Стек вызовов невелик, всего ничего единицы мегабайт.
    Ответ написан
  • Какую библиотеку по работе с POP/IMAP можно выбрать?

    @Mercury13
    Программист на «си с крестами» и не только
    cURL?
    Кроссплатформенная, кстати.
    Ответ написан