Ответы пользователя по тегу Программирование
  • Как изменить приоритет символов на клавиатуре?

    @Mercury13
    Программист на «си с крестами» и не только
    Если всё-таки хочешь по пути изменения раскладки, гугли Microsoft Keyboard Layout Creator.
    Ответ написан
    1 комментарий
  • Как убрать линию, соединяющую (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
    Программист на «си с крестами» и не только
    Дело в том, что static-член в теле класса — это только заголовок, говорящий, что такое есть, но не создающий ни кода, ни данных. Эквивалент extern. Где-то в CPP (т.е. в одной и только в одной единице компиляции — не в .h!) нужны…

    std::vector LogVoting::RegisteredDeputy;

    И так далее.

    Если этим полям нужен нестандартный конструктор — пожалуйста…
    std::vector LogVoting::RegisteredDeputy(42);
    Ответ написан
  • Как понять заголовочные файлы?

    @Mercury13
    Программист на «си с крестами» и не только
    #include — как ни странно.

    Вы так и не поняли такой вещи, как «единица компиляции». Дело в том, что в Си c-файлы компилируются независимо друг от друга (в единую программу всё собирает линкер). А чтобы сказать «оно есть, только в другой единице компиляции», используют прототипы и extern’ы.

    А если вы хотите просто внести код в ту же единицу компиляции, просто пишите его в хедере, да и всё. Только в большинстве компиляторов это исключает предкомпилированные хедеры — а ТАКИЕ хедеры вам предкомпилировать, скорее всего, и не нужно.

    <брюзга mode on>
    Не создают кода (а значит, в традиционной системе с кучей единиц компиляции находится именно в хедерах)
    • extern и прототипы
    • inline
    • не до конца специфицированные шаблоны
    • static-поля в классе (но потом это static-поле придётся повторить в какой-нибудь одной единице компиляции)
    • может, ещё что-то, только я забыл…
    <брюзга mode off>
    Ответ написан
    1 комментарий
  • Узко специализированно или широко?

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

    @Mercury13
    Программист на «си с крестами» и не только
    С двузначными метками посещения (bool used[]) — никак.

    Надо перейти на трёхзначные метки (UNVISITED, PARTLY_VISITED, VISITED).

    void dfs (int v) {
      state[v] = PARTLY_VISITED;
        .....
      state[v] = VISITED;
      ans.push_back (v);
    }


    Неплохой пример есть в вашем предыдущем вопросе.
    Ответ написан
    Комментировать
  • На каком языке писать сбор и обработку данных из web?

    @Mercury13
    Программист на «си с крестами» и не только
    Любой, в котором есть достаточная поддержка Интернета. На Delphi я бы попробовал использовать Indy (хорошей привязки cURL к Delphi нет; пробую это исправить, но дело идёт небыстро).
    Ответ написан
    Комментировать
  • Как применить топологическую сортировку?

    @Mercury13
    Программист на «си с крестами» и не только
    Нужно переписать под матрицу смежности вот этот участок кода.
    for(int i = 0;i < Edges[v].size();i ++){
              if(dfs(Edges[v].get(i)))return true;
          }

    Что-то типа этого.
    цикл (i : все вершины)
       если матрица_смежности[v, i]
             если dfs(i)
                 return true;

    Ещё мне не нравятся константы 0, 1 и 2. Объявить бы их как
    UNVISITED = 0;
    PARTLY_VISITED = 1;
    VISITED = 2;

    Или WHITE, GRAY и BLACK, если хотите — в учебниках по алгоритмам их красят в три цвета.
    Ответ написан
    Комментировать
  • С чего начинать: Спортивное программирование VS Изучение языка программирования?

    @Mercury13
    Программист на «си с крестами» и не только
    Если с твоих пальцев код слетает так легко, что можно уже в спортивное… то почему бы не заняться тем, что нужно в жизни и тем, что тебе нравится? Напиши нечто посложнее, чем арканоид или тетрис!

    Подумай, что тебе в жизни нравится. Скажем, игры. Вот берёшь и пишешь арканоид. Потом арканоид с хитрой физикой. Потом платформерный движок — пускай враги будут каляки-маляки, зато чтобы было интересно бегать-прыгать. Если любишь музыку — придумай какой-нибудь синтезатор или звукопреобразователь. Если фотографируешь — да хоть каталогизатор фотографий! И так далее.

    Если ты пока ещё туг в программировании, пиши что угодно, что пишется, но программировать научись. Спортивное, возможно, тебе и подойдёт, но, вероятно, ты будешь то ли клевать носом на непонятной лекции, то ли постоянно переспрашивать: как это? Сходи на их лекцию, посмотри, каково оно тебе?

    Прогерская работа — не олимпиада. Там много других задач: как это будет выглядеть с точки зрения пользователя? Стоит ли налаживать O(n) или обойтись O(n²)? Джонатан Блоу (автор великого Braid) говорит: 80%, что простейший алгоритм подойдёт, а в отладке он проще. Хотя и хорошие алгоритмы знать тоже надо, хотя бы на уровне теории.
    Ответ написан
    Комментировать
  • Как отлаживать программы, которые долго выполняются?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Специальные условия выполнения. Например, у меня есть свой шаблон Array1d<>, в котором есть не только проверка диапазонов, но и т.н. «канарейка» — проверка, не испортила ли его случайно «сумасшедшая» подпрограмма. Все эти изыски включаются в параметрах компиляции.
    2. Детальные логи ключевых объектов: что случилось и по какой причине.
    3. Просто чутьё. Неинициализированную переменную на стеке я долго ловил: знал, где примерно ошибка, но любая диагностика (и даже перевод компилятора в debug) — стек смещается, и ищи ветра в поле. Включал проверку диапазонов, ту самую канарейку — ничего не даёт (ну естественно, никто и не пишет в «левую» память»). Много раз затыкал ошибку, но впоследствии я её как-то сумел продиагностировать, а дальше — дело техники.
    Ответ написан
    Комментировать
  • Кнопка fn на ноутбуке работает зеркально. Можно ли как нибудь исправить?

    @Mercury13
    Программист на «си с крестами» и не только
    Если это Lenovo, там есть небольшая засада.
    1. Установите клавиатурные драйверы и делайте это в настройках «Панель управления → Клавиатура».
    2. Если оно к тому же постоянно ругается, что Fn в Legacy-режиме — найдите и удалите файл mkrmsg.exe.

    Всё это из опыта эксплуатации Lenovo E330.
    Ответ написан
    Комментировать
  • Как работать Excel-документами в Delphi?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть два варианта, автоматизация OLE и прямая поддержка XLS-файлов.

    Я сумасшедший и по спецификациям Micro$oft написал второе (всё-таки в коммерческой программе, от которой, впрочем, не требуются никакие оформительские изыски, так лучше).

    Для разовой утилиты лучше первое. Ещё можно работать через CSV.
    Ответ написан
    2 комментария
  • Какой аналог php функции is_string() в ЯП С++?

    @Mercury13
    Программист на «си с крестами» и не только
    C++ — язык со статической типизацией, и если x объявлено как string, то он всегда string. А если как int, то он никогда не string. Поэтому функция is_string в C++ просто не имеет смысла.

    Правда, существуют островки динамической типизации наподобие VARIANT из OLE — это уже смотрите по месту (msdn.microsoft.com/en-us/library/cc237865.aspx) и, скорее всего, это не ваш вопрос.

    Да, вы хотели проверять корректность ввода. Например, для проверки, будет ли строка числом, можно использовать www.cplusplus.com/reference/cstdlib/strtod (не забудьте потом проверить endptr!)
    Ответ написан
    Комментировать
  • Для чего нужны побитовые операции?

    @Mercury13
    Программист на «си с крестами» и не только
    Для чего битовые сдвиги вообще существуют? А потому, что они выполняются очень простой схемой — сдвиговым регистром. И вместо того, чтобы проводить умножение (поначалу это было десятки тактов), подключаем этот самый регистр к регистрам процессора, и выполним всё за один такт. Существовала даже программа, генерирующая быстрый код умножения на константу, например, 6 — сдвинуть, сложить и ещё раз сдвинуть. И это в своё время было быстрее, чем mul — а ведь сейчас мы без зазрения совести пишем mul eax, 6.

    Чего могут сдвиги, но со скрипом реализуется через всё остальное? Доступ к i-му биту.
    i-й бит = (x >> i) & 1

    По правилам хорошего программистского тона умножение, даже на 2 или на 4, пишется как обычное * (>> пишут, если компилятор непроходимо туп и умножение медленнее). А вот сдвиги — именно их, а не умножение — пишут, когда работают с битовыми полями.

    Есть также специальные сдвиги.
    * Арифметический сдвиг вправо (левый совпадает с обычным) — для чисел со знаком.
    * Сдвиг-вращение — в основном для криптографии.
    * Сдвиг-вращение через регистр флагов — в основном для длинной арифметики.
    Ответ написан
    Комментировать
  • Как запустить пошаговое выполнение программы в code::blocks?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Откомпилировать с отладкой.
    2. Либо наставить контрольных точек; Debug → Start/Continue;
    либо поставить курсор куда надо; Debug → Run to cursor
    Ответ написан
    Комментировать
  • Вопрос специалистам по GCC и темплейтам C++

    @Mercury13
    Программист на «си с крестами» и не только
    Всё, что я знаю: GCC — самый «въедливый» компилятор. После Intel и Embarcadero (про M$ не знаю) на «зашаблоненном» коде GCC найдёт ещё два десятка ошибок.
    Ответ написан
    Комментировать