• Как инициализировать строку 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 комментариев
  • Как правильно переопределить оператор присваивания с инициализацией методов классов-родителей?

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

    Вариант 1. Сделать промежуточный уровень наследования, в который вносим некопируемые части.

    class LevelObject
    {
    private:
       Level& level;  // Сцылка на уровень, по определению неизменная
       int x, y;           // Присваивать.
    }


    Разбиваем на две части (внимание! — конструктор копирования для простоты не прописан, вероятно, потребуется и он):
    #include <iostream>
    
    class Level
    {
    public:
        int value;
        Level(int aValue) : value(aValue) {}
    };
    
    class LevelChild
    {
    protected:
        Level& level;  // не присваивать
    public:
        LevelChild(Level& aLevel) : level(aLevel) {}
        LevelChild operator=(LevelChild&) { return *this; }   // ничего не делающая операция «присвоить»
    };
    
    class LevelObject: public LevelChild
    {
    protected:
        int x, y;
    public:
        LevelObject(Level& aLevel, int aX, int aY) : LevelChild(aLevel), x(aX), y(aY) {}
        void print();
    };
    
    void LevelObject::print()
    {
        std::cout << "(" << x << ", " << y << ") at level " << level.value << std::endl;
    }
    
    int main()
    {
        Level l1(1);  LevelObject o1(l1, 1, 2);
        Level l2(2);  LevelObject o2(l2, 3, 4);
        o1.print();
        o2.print();
        o2 = o1;
        o2.print();
    }


    Вариант 2. Сделать маленькие объекты-функции со своими операциями присваивания.

    class LevelObject
    {
    private:
       Level* level;  // На сей раз уже копируется
       Array3 pos;    // Какой-то инкапсулированный объект-массив
       std::wstring name;   // тоже инкапсулированный объект
    }


    И всё, когда для std::wstring и Array3 корректно прописаны операции присваивания, для LevelObject всё будет работать корректно без единой строчки.

    P. S. А точно ваш объект страдает от поэлементного копирования и нужна своя операция?
    Ответ написан
    Комментировать
  • Почему срабатывает конструктор копирования?

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

    @Mercury13
    Программист на «си с крестами» и не только
    Ошибка в SQL. Обратные кавычки, ЕМНИП, расширение MySQL; на других СУБД поля «закавычиваются» квадратными скобками. Попробуй [dbt_AdmissionProduct] или вообще убери эти кавычки.

    Ну и ещё вижу ошибку — запрос не закончен, и в этом может быть дело.

    Ах да. Писать SQL вот таким образом — ад редкостный. Я бы написал так.

    const
      CRLF = #13#10;
    
    xxx.SQL.Text := 'INSERT INTO dbt_AdmissionProduct ('  + CRLF+ 
                               'p_product, p_count…' + CRLF + …
    Ответ написан
  • Как называется игра из книги "Теория игр" Авинаш Диксит?

    @Mercury13
    Программист на «си с крестами» и не только
    Обратная игра Баше, или игра Баше на мизер.
    Игра Баше в обычном её виде — с точностью до наоборот; заставить противника взять последний флажок.
    Ответ написан
    Комментировать
  • Как в CBuilder организовать объявление свойства?

    @Mercury13
    Программист на «си с крестами» и не только
    Вот, допустим, подсказка по XE2.
    Data.Win.ADODB.TADOQuery
    
    Type  | Visibility | Source             | Unit           | Parent 
    class | public     | Data.Win.ADODB.pas | Data.Win.ADODB | Data.Win.ADODB 
                       | Data.Win.ADODB.hpp |


    Вот и подключаешь <Data.Win.ADODB.hpp>. В более ранних версиях Builder придётся подключать просто <ADODB.hpp>.
    Ответ написан
    1 комментарий