Задать вопрос
  • Как работать 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!)
    Ответ написан
    Комментировать
  • Как проверить файл на пустоту в Delphi?

    @Mercury13
    Программист на «си с крестами» и не только
    type
      TFileState = ( fsMissing, fsEmpty, fsSomething );
    
    function GetFileState(s : string) : TFileState;
    var
      sr : TSearchRec;
      err : integer;
    begin
      err := FindFirst(s, faAnyFile and not faDirectory, sr);
      if err <> 0
        then Result := fsMissing
      else if sr.Size = 0
        then Result := fsEmpty
        else Result := fsSomething;
      FindClose(sr);
    end;
    Ответ написан
  • Для чего нужны побитовые операции?

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

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

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

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

    @Mercury13
    Программист на «си с крестами» и не только
    Было время, ≈2005—2007, светодиоды зверски «скакали». Сейчас у меня пучок мышек посовременнее, и не помню ни одного скачка. Условия, правда, не особо жёсткие.
    Ответ написан
    Комментировать
  • Почему цвет на сайте не соответствует цвету в Adobe Photoshop?

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

    @Mercury13
    Программист на «си с крестами» и не только
    Поскольку MAC-адрес — это 6-байтовое число, проще всего преобразовать его в 8-байтовый INTEGER. Например, 12:34:56:78:9A:BC превращается в 0x1234'5678'9ABC. Это эффективно и вопрос лишь в ручном редактировании БД.
    Ответ написан
    Комментировать
  • Как запустить пошаговое выполнение программы в code::blocks?

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

    @Mercury13
    Программист на «си с крестами» и не только
    688b4461d0a145be8f07116dcdad6612.png
    Ответ написан
    Комментировать
  • Как написать алгоритм спирали?

    @Mercury13
    Программист на «си с крестами» и не только
    И ещё одна штука. Две-семь точек надо располагать по-другому (одна в центре, остальные по кругу на расстоянии dSafe от неё; ну или на худой конец подобрать коэффициент a, чтобы спираль расходилась лишь чуть-чуть). Для восьми-одиннадцати точек надо подбирать индивидуальные a. И только для двенадцати и более подходит a = −0,3·dSafe.
    Ответ написан
    Комментировать
  • Как написать алгоритм спирали?

    @Mercury13
    Программист на «си с крестами» и не только
    Думаю, проще всего делать не спираль Архимеда, а её приближение методом Эйлера. Пусть у нас есть некое расстояние dSafe, на котором должны быть кружочки друг от друга.

    Чтобы поставить второй кружочек, отойдём от центрального на вектор (dSafe, 0). Для третьего и дальше поступим так.

    Найдём угол касательной к спирали Архимеда. Касательный вектор будет a единиц по радиус-вектору (a — коэффициент спирали r=aф) и r единиц по нормали. Таким образом, если мы в точке (x, y), у нас получается касательный вектор вот такой.
    t = (a·x + r·y; a·y − r·x), r = sqrt(x² + y²)

    Нормируем этот вектор до длины dSafe и добавляем к (x, y).
    Штука номер один. Параметр спирали прямо пропорционален безопасному расстоянию (вы это увидите ниже в коде). И штука номер два — только «бесконечно малые» шаги (при нулевом a, т. е. окружность) будут держать нас на окружности, шаги побольше будут выносить нас наружу, для компенсации сделаем a отрицательным.

    Вот действующий код (на C++ Builder’е)

    namespace {
    
    const double dSafe = 30;
    const int rSafe = dSafe / 2;
    const double a = -0.3 * dSafe;
    
    int toPixel(double x)
    {
        return floor(x + 0.5) + 200;
    }
    
    }
    
    void TfmMain::drawPoint(double x, double y)
    {
        int xx = toPixel(x);
        int yy = toPixel(y);
        Canvas->Ellipse(xx - rSafe, yy - rSafe, xx + rSafe, yy + rSafe);
    }
    
    void __fastcall TfmMain::FormPaint(TObject *Sender)
    {
        Canvas->Brush->Style = bsClear;
        Canvas->Pen->Color = clBlack;
    
        double x = 0, y = 0;
        drawPoint(x, y);
        x += dSafe;
        drawPoint(x, y);
    
        for (int i = 0; i < 120; ++i) {
            double r = sqrt(x*x + y*y);
            double tx = a*x + r*y;
            double ty = a*y - r*x;
            double tLen = sqrt(tx*tx + ty*ty);
            double k = dSafe / tLen;
            x += tx * k;
            y += ty * k;
            drawPoint(x, y);
        }
    }
    Ответ написан
    Комментировать
  • Вопрос специалистам по GCC и темплейтам C++

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

    @Mercury13
    Программист на «си с крестами» и не только
    Это к Sony или StarForce. И те, и другие делали заSHITу и прокалывались на подобном.
    Ответ написан
  • Можно ли создавать в рантайме объект в C++?

    @Mercury13
    Программист на «си с крестами» и не только
    Разрешите вставить и свои 5e−2 Р

    Известно ли что-то о том, какой тип будет иметь наш auto? Если известно, то может, сработает просто

    dynamic_cast<Type>(object).field1.field2 = NULL;
    Ответ написан
    Комментировать
  • Алгоритм поиска кратчайшего пути в графе

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

    Если подвижных мостов мало, можно каждую вершину размножить в 2b экземплярах (b — кол-во мостов). Тогда пойдёт даже не Дейкстра, а обычный поиск в ширину.

    Если два моста «сцеплены» друг с другом и наводятся/разводятся одновременно, то в b они идут одной штукой.

    А если мостов много и 2b — непозволительная трата, тогда интересно. Думаю, ничего, кроме эвристик, не поможет. Например, может случиться так, что кратчайший путь от включателя до всех мостов, которыми он управляет, посуху. Или мосты (в смысле управляемые) — это мосты (в смысле теории графов). Или что-нибудь ещё.

    Ответ написан
    1 комментарий
  • Есть ли смысл в соли из хеша пароля?

    @Mercury13
    Программист на «си с крестами» и не только
    Для чего вообще нужна соль? А для того, чтобы md5(password)+salt было достаточно длинным, чтобы его нельзя было получить из хэша по предвычисленным таблицам. Таблица-то даст что-то, но нет никакой гарантии, что в конце будет именно ваша соль.

    По-моему, криптостойкость одна и та же: тот же уровень противодействия перебору и та же защита от таблиц.
    Ответ написан
  • Любителям алгоритмов: как построить конструктивную биекцию между натуральными числами и наборами по k чисел из n?

    @Mercury13
    Программист на «си с крестами» и не только
    Это делается динамическим программированием за сложность O(nk) по процессору и памяти.
    Ответ написан
    Комментировать
  • Давно не решали занимательные задачки на Хабре?

    @Mercury13
    Программист на «си с крестами» и не только
    Меньше, чем за шесть нельзя, и вот почему.
    Задача эквивалентна такой. Поднимаем колпачок. Есть шарик — отлично; если нет — снимаем правый, и если шарик под ним, тот перекатывается под оставшийся правый. Очевидно, после четырёх проверок четыре колпачка исчезнут, а значит, как минимум два непроверенных останутся.
    Ответ написан
    Комментировать
  • Delphi - програмная эмуляция удержания кнопок клавиатуры

    @Mercury13
    Программист на «си с крестами» и не только
    Автоповтор кнопок, к сожалению, придётся реализовывать самому.
    Ответ написан
    5 комментариев
  • Есть ли здесь бывшие олимпиадники? Как олимпиады помогли Вам?

    @Mercury13
    Программист на «си с крестами» и не только
    Скажу сразу, спортивного программирования у меня было не очень много: 10 класс — сборы (подвело незнание стандартной задачи на динамическое программирование, да и в одном месте надо было не Real применить, а Extended: проверяли шесть знаков, а у меня, при формально правильном алгоритме, было три или четыре). 11-й — по своей же глупости вообще не попал в призёры. В университете с командой как-то не заладилось, но это не мешало в одиночку быть второй ACM-«командой» факультета.

    Во-первых, олимпиада позволила мне попасть в университет на собеседование. Как я его проходил — отдельная история, но всё вышло как надо.

    Во-вторых, выработались некоторые приёмы малоглючного программирования. И сейчас посторонние мне часто говорят: «Ты код как на камне высекаешь».

    В третьих, алгоритмы есть алгоритмы. Всегда думаешь: а есть ли способ «наскоком» повысить скорость того или иного метода? Можно ли тут приплести, скажем, std::map?
    Ответ написан
    Комментировать