Задать вопрос
  • Как правильно обрабатывать изображения в стороннем потоке?

    @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?
    Кроссплатформенная, кстати.
    Ответ написан
  • Как убрать линию, соединяющую (0,0) и начало графика ln(x) Tcanvas?

    @Mercury13
    Программист на «си с крестами» и не только
    Прямые причины этого отрезка.
    1. В первом MoveTo ты спутал реальные и экранные координаты. И в первом графике, видимо, тоже, только там линия уходит влево за край.
    2. У тебя нет никакой логики поведения на разрывах. В простейшем случае — в первую точку MoveTo, а не LineTo.

    И прочие ошибки.
    3. Не инициализирован y.
    4. Ты рисуешь не на том холсте. Видимо, ты хотел забуферизировать графики — но графики не отпечатываются на картинке, а рисуются на холсте формы. Как только ты минимизируешь-восстановишь прогу, графики исчезнут. Надо рисование либо в событие OnPaint (тогда график будет перестраиваться каждый раз при перерисовке), либо отпечатать на Picture.Bitmap (график останется отпечатанным на картинке). Во втором случае не забудь image2.Invalidate (отложенно перерисовать, когда это станет возможным);
    5. Шаг слишком мал. Это должен быть эквивалент одного или двух пикселей.

    ПРИМЕЧАНИЕ ПО ПОВОДУ 4. В WinVista+ с включенным Aero может быть всё в порядке (Aero буферизирует окна, чтобы работал Aero Flip и прочее). Выключи Aero, и будет обычный «хардкор» Windows: ничего не запоминает, а когда потребуется, перерисовывает.
    Ответ написан
    9 комментариев