• Передача узла дерева?

    @Mercury13
    Программист на «си с крестами» и не только
    По сути. Вы забыли порядок исполнения операций.
    (*root)->next.push_back(node);

    Чем ещё можно улучшить код…
    Зачем вам указатель на указатель? Как массив указателей? Как «либо ссылка на указатель, либо ничего»? По видимому, ни то, ни другое, указатель, по сути передаётся по значению — так что стоило бы функцию переделать как…
    bool Syntax::On_BG(Node * root)
    или даже
    bool Syntax::On_BG(Node & root)

    PS. И да, указатель передаётся по значению, но то, на что он указывает, не исчезнет с выходом из функции.
    Ответ написан
  • Как расположить Timage что бы выглядели картинки как в Windows8 метро стиле?

    @Mercury13
    Программист на «си с крестами» и не только
    Простейший способ — взять несколько TPanel, которые align по вертикали, а в них TImage, которые align по горизонтали.

    Если к тому же нужно сделать правильное поведение при увеличении-уменьшении окна — надо по OnResize налаживать свою расстановку.
    Ответ написан
    Комментировать
  • Qt, Время собирать "камни" или как получить Release?

    @Mercury13
    Программист на «си с крестами» и не только
    «can't find -lQSerialPort» — это значит, не в инклудах дело, а в .lib или в .a (зависит от компилятора). Ищи, как указать путь к этому файлу. И почему в отладке работало? — там что, этот путь указан?
    Ответ написан
    4 комментария
  • Qt: как сделать невидимую горячую клавишу?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Разобрался.
    doc.qt.io/qt-5.6/qshortcut.html
    Ответ написан
    Комментировать
  • Как лечить char warning overflow при считывании с файла?

    @Mercury13
    Программист на «си с крестами» и не только
    fin.getline(pRun->sBooks.chBook, 99, static_cast<char>('»'));


    Всё у вас правильно. А в Си char почему-то (обычно) знаковый.
    Ответ написан
  • Приведение обьекта производного класса к базовому?

    @Mercury13
    Программист на «си с крестами» и не только
    Через указатели и ссылки — останется.
    По значению (как у тебя сейчас в векторе) — преобразуется в базовый.

    Главная проблема работы с указателями и ссылками — где хранить объекты и как их уничтожать. Хранят обычно в «куче», а для уничтожения используют умные указатели или что-то самописное под задачу. Вот, например, решение на умных указателях C++11:
    #include <iostream>
    #include <memory>
    #include <vector>
    
    class Base{
    public:
        // Нужен виртуальный деструктор, ведь мы будем уничтожать детей
        // через родительский ук-ль. Да и dynamic_cast требует RTTI,
        // а значит, хоть одного виртуального.
        virtual ~Base() = default;
    };
    
    class Exp: public Base
    {
    int i=0;
    public:
           int Get() const {  return i; }
           void Set(const int &num) { i=num; }
    };
    
    std::vector<std::shared_ptr<Base>> MyStack;
    Base &GetRef() { return **MyStack.begin();  }
    
    int main() {
        std::shared_ptr<Exp> a = std::make_shared<Exp>();
        a->Set(4);
        MyStack.push_back(a);
        int res=dynamic_cast<Exp&>(GetRef()).Get(); // Теперь работает
        std::cout << res << std::endl;;
    }
    Ответ написан
    Комментировать
  • Как правильно прозвонить dvi-d порт на видеокарте?

    @Mercury13
    Программист на «си с крестами» и не только
    Прозвонка может найти микронеконтакт и пробой на землю. Микронеконтакт с современными BGA-чипами найти практически невозможно, не отпаяв чип. Если же выводы доступны: находим схему, тестер в «килоомы» или «звуковой пробник», одним концом в разъём, другим — на соответствующий вывод микросхемы.

    Пробой на землю ищут так: COM на земляную шину ноутбука (например, за монтажное отверстие, удобно «крокодильчиком» кустарного изготовления), «омы» — на каждый из контактов DVI. Земляные должны контачить, остальные — не должны. Режим тот же — «килоомы» или «звуковой пробник».

    Это не единственные ошибки; оно может отгореть внутри видеочипа и «висеть в воздухе». В таком случае на ВКЛЮЧЁННОМ ноутбуке проверяют, есть ли какое-то напряжение, например, между Digital Red − и Digital Red +. Режим, понятное дело, «постоянное напряжение 20 В». Осциллограф, конечно, лучше, но какое-то представление о том, есть ли ток, даст и вольтметр. Геморрой такой ещё — тыкать в работающий полуразобранный ноут.

    А внешний монитор, вероятно, придётся подключить к HDMI через переходник. Не все работают (проверено): был случай, когда DVI-кабелем не работало, а HDMI- (через другой переходник) — работало. На видяхе HDMI, на мониторе DVI.
    Ответ написан
    6 комментариев
  • Что есть такое "встроенные вложения" в письме?

    @Mercury13
    Программист на «си с крестами» и не только
    Встроенный файл.
    Заголовок: Content-Disposition: inline;filename=somefile.ext
    Назначение: быть в тексте письма, почтовик его покажет прямо в окошке.

    Вложение.
    Заголовок:
    Content-Disposition: attachment;filename=somefile.ext

    Назначение: быть прикреплённым к письму файлом; почтовик покажет его где-то вверху или внизу, а если мэн щёлкнет на нём — предложит скачать-сохранить.

    Некоторые файлы (например, zip) почтовик показать не может, они всегда будут вести себя как вложения.

    Почтовики, конечно, ведут себя как хотят, и мой Thunderbird всегда выводит всё, что может вывести, хоть attachment, хоть inline.

    Сейчас inline не в фаворе (почтовик OSX на нём подглючивает), ни одного такого не нашёл по своей почтовой базе.
    Ответ написан
    Комментировать
  • Линия из двух точек может быть замкнутым путём?

    @Mercury13
    Программист на «си с крестами» и не только
    Я не знаком с Иллюстратором, но, очевидно, кнопка «Замкнуть путь» подводит линию Б-А. И если подтянуть ус, будет видно, что там две линии.

    То же самое повторил в Inkscape: нарисовал отрезок, переключился на редактирование кривых (Edit path by nodes), выделил оба конца, нажал «Join selected endnodes with a new segment» — линия стала двойной. Если оттянуть за линию (у отрезка в Inkscape усов нет), это будет видно.

    Точно так же можно нарисовать «двуугольник» инструментами «карандаш» и «ручка».

    Да, и «closed» здесь не «закрытый», а «замкнутый».

    P.S. Посмотрел поближе; видно, что антиалиазинг кривой — значит, там именно что две линии друг на друге.
    Ответ написан
    1 комментарий
  • Что такое normaliz.dll?

    @Mercury13
    Программист на «си с крестами» и не только
    Нормализация Юникода.
    Обычно находится в Windows\System32 (Windows\SysWOW64).
    Официальный сайт не держит библиотек cURL, он только даёт ссылки на чужие сборки. cURL (или OpenSSL) использует VC2008; вы явно скачали версию НЕ для XP. Ничего, VS2008 Redistributable можно скачать тут.
    https://www.microsoft.com/en-us/download/details.a...

    Я специально искал и нашёл сборку cURL/OpenSSL, которая не требует ничего необычного. Мы программисты, ставим кучу софта — а у одного бета-тестера не прокатило, т.к. на его рабочем ноутбуке не было VS2013, приблудил с OpenSSL.
    Ответ написан
    Комментировать
  • Как заставить сработать исключение std::bad_alloc?

    @Mercury13
    Программист на «си с крестами» и не только
    #include <iostream>
    #include <conio.h>
    
    int main()
    {
      setlocale(LC_ALL, "Russian");
      const size_t SIZE = 3000000000ul;
      char* ptr = NULL;
      try
      {
        ptr = new char[SIZE];
        std::cout << "Память используется без сбоев.\n";
      }
      catch (std::bad_alloc&)
      {
        std::cout << "Исключение bad_alloc: невозможно разместить данные в памяти.\n";
      }
      delete[] ptr;
      getch();
      return 0;
    }


    Столько кода — и столько ошибок! По пунктам.
    1. Ответ на ваш вопрос. Сделать константу побольше. Кстати, эта константа — size_t. В 64-битном коде надо ещё больше.
    2. Не проработано поведение delete[], если случится ошибка. Покатит инициализация NULL.
    3. Если случится ошибка, будут выведены оба сообщения.
    4. getch — функция из платформозависимого заголовка conio.h. Только DOS/Windows.
    5. Обработку аварий обычно делают по ссылке.
    6. Для первого параметра setlocale надо указывать ненулевую маску, на какие части ставить локаль. LC_ALL — везде. Что писать вторым параметром, зависит от библиотеки времени выполнения.
    Ответ написан
    7 комментариев
  • Undefined reference to?

    @Mercury13
    Программист на «си с крестами» и не только
    В проект не включили файл methods.cpp. Потому линкер говорит, что нет этих функций.

    Язык Си (как, впрочем, и большинство ассемблеров) собирает cpp-файлы воедино неязыковыми средствами: makefile’ами и файлами проектов. Сначала компилятор обрабатывает все единицы компиляции отдельно друг от друга, а потом линкер собирает из того, что получилось, исполняемый файл. Разумеется, если где-то какой-то функции не нашлось, это можно опознать только при линковке.
    Ответ написан
    4 комментария
  • Почему при достаточно малых значениях вещественного числа кол-во итераций при нахождении машинного эпсилон резко убывает?

    @Mercury13
    Программист на «си с крестами» и не только
    Машинный эпсилон — это минимальное число, что 1 + ε ≠ 1. Так что, в принципе, ты вычислил его правильно, хоть код и студенческий. Но есть один нюанс.

    Дело в том, что float и double бывают нормализованные и денормализованные. Что это такое?
    Любое число в двоичной системе счисления начинается с единицы. Поэтому головная единица подразумевается и не хранится — т.н. «нормализованное число». НО: когда порядок 00…00, считается, что в голове НОЛЬ, а относительная погрешность сменяется абсолютной — это денормализованное число.

    0 1010…00 00000001 = +0,11012×2−127 — нормализованное число
    0 1010…00 00000000 = +0,01012×2−127 — денормализованное
    0 0000…00 00000000 = +0,00002×2−127. Ноль — тоже денормализованное число.

    10−38 — минимальное нормализованное число. 10−45 — минимальное денормализованное, с мантиссой 0,00…001. Помнишь, я говорил, что в денормализованных числах относительная погрешность сменяется абсолютной в эти самые 10−45 — потому чем меньше число, тем больше «типа-эпсилон».

    10-байтовый extended, он же long double, насколько мне известно, не нормализован, т.е. головная единица там хранится явно. Но такая точность редко нужна, появляется перерасход памяти (2 или 6 байтов, в зависимости от процессора и его настроек), да и не слишком оптимизируют сопроцессоры под такие числа.
    Ответ написан
    Комментировать
  • Использование функций из Dll бибилеотеки?

    @Mercury13
    Программист на «си с крестами» и не только
    Возникает вопрос. Это простой DLL с торчащими наружу функциями или COM?
    • QLibrary — для DLL.
    • regsvr32 — это для COM.
    • Первый раз не загрузилось и второй раз загрузилось, потому что 32-битные программы со стандартным манифестом принимают каталог «SysWOW64» за «System32». Когда DLL не найден, программа отыскивает его в некоторых стандартных местах и таковыми, возможно, являются и активные COM-серверы.
    • OpenConnection мог не найтись по адовой куче причин. Может оказаться, что имя OpenConnection «покозявлено» и надо что-то типа «OpenConnection@4». Может оказаться, что библиотека — действительно COM-сервер и QLibrary тут бесполезен.
    Ответ написан
    9 комментариев
  • QLabel: как лучше оформлять гиперссылки?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Пока лучшим решением выходит такое…
    static const QString someCss = "<style>...</style>";
    
    lbLabel->setText(someCss + MSG_LINK)

    Конструкция MSG_LINK выходит достаточно простая, чтобы переводчик её с лёгкостью обработал, да и someCss — единое место для стилей.
    Ответ написан
  • Почему не отрабатывает перегруженный конструктор класса?

    @Mercury13
    Программист на «си с крестами» и не только
    Попробую рассказать об этом же более простыми словами.

    Текст String s3 = "Нас обманули, расходимся."; означает вот что. Мы создаёт временную строку «Нас обманули, расходимся», а затем присваиваем её нашему s3. Конечно, компилятор это потом заоптимизирует, но это семантика языка, и ей надо следовать.

    Есть два способа передать временный объект в функцию. Любую: хоть простую, хоть конструктор, хоть операцию =.
    Первый — константная ссылка: String(const String &S).
    Второй способ из C++11 — временная ссылка: String(String &&S).

    Из-за этих временных объектов конструктор копирования и операция «присвоить», по-хорошему, должны брать const-ссылку. Вот вам аналогичный пример с операцией «присвоить».

    class String
    {
    public:
        String() {}
        String& operator= (String& s) { return *this; }
    };
    String operator+ (String a, String b) { return String(); }
    
    int main()
    {
        String s1;
        String s2 = s1;
        String s4;
        s4 = s1 + s2;
    }


    Решается String& operator= (const String& s).
    Ответ написан
    Комментировать
  • У монитора Dell появляется и пропадает рябь розового цвета - что за мистика?

    @Mercury13
    Программист на «си с крестами» и не только
    Розовая рябь случается, когда помирает лампа подсветки. Правда, S2340LS загуглить не удалось, а у S2340L подсветка светодиодная и ряби в принципе быть не может. Даже странно.
    Ответ написан
  • Qt: авторесайз колонки по образцу?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Нашёл способ.

    namespace {
    
        // Пока делегат стандартный, использую шаблон «Паблик Морозов».
        // Если нет — он сам и будет Морозовым.
        class QStyledItemDelegateMorozov : public QStyledItemDelegate {
        public:
            using QStyledItemDelegate::initStyleOption;
        };
    
    }
    
    
    void SomeReport::autoResize()
    {
        QHeaderView* header = table->horizontalHeader();
        QStyledItemDelegateMorozov* delegate =
                reinterpret_cast<QStyledItemDelegateMorozov*>(
                dynamic_cast<QStyledItemDelegate*>(table->itemDelegate()));
        QStyle* style = table->style();
        QStyleOptionViewItem option;
        for (int col = 0; col < model.columnCount(); ++col) {
            QModelIndex index = model.index(0, col);
            delegate->initStyleOption(&option, index);
            option.text = "12345678901234";
            int headerSize = header->sectionSizeHint(col);
            int cellSize = style->sizeFromContents(
                    QStyle::CT_ItemViewItem, &option, QSize(), table).width();
            table->setColumnWidth(col, std::max(headerSize, cellSize));
        }
    }
    Ответ написан
    Комментировать
  • Как рассчитать длины сторон фигуры?

    @Mercury13
    Программист на «си с крестами» и не только
    Чтобы перейти от пикселей к метрам, надо вычислить площадь фигуры в квадратных пикселях. Проще всего это делать по формуле трапеций.

    Для каждой стороны надо вычислить площадь трапеции OX — x=xA — AB — x=xB, с плюсом или минусом. Насколько я помню, она равна 0,5(yA + yB)·(xA − xB). Если все сложить и взять абсолютную величину, получится площадь.

    Тогда масштабный коэффициент будет sqrt(Spx / Sм).
    Ответ написан
  • Как и где можно применить дискретную математику в программировании?

    @Mercury13
    Программист на «си с крестами» и не только
    В программу дискретной математики моего факультета входили…
    • теория множеств
    • теория графов
    • комбинаторика
    • алгебра логики, исчисление высказываний
    • теория автоматов

    Теория множеств — это основа ВСЕЙ университетской математики. Не зря её повторяли ещё и на муть-анализе.
    К тому же в теории множеств есть два классных понятия — отношение эквивалентности и отношение порядка. Операции == и <= перегружать приходилось?
    Соответствие везде определённое, функциональное, сюръективное, инъективное, биективное. Теория баз данных. Допустим у нас есть сотрудник и телефон, как они соотносятся? У всех ли сотрудников есть телефоны? Бывает ли у сотрудника два телефона? У всех ли телефонов есть сотрудники? Бывает ли у телефона два сотрудника? Ну а биективное — это соответствие «1:1».

    Теория графов — понятное дело, в алгоритмах на сетях. Создание, уничтожение, обход, поиск пути…

    Комбинаторика — это а) количество элементов в том или ином конечном множестве; б) способы перебрать их все. Например, мне реально приходилось перебирать комбинации из N элементов не более чем по M. Нерекурсивно.

    Алгебра логики — это основа работы компьютеров. Когда булевское условие многоэтажное — как записать его в понятном виде и как его упростить?

    Теория автоматов — это крайне упрощённый принцип работы процессоров. Поэтому если надо написать предельно простого вида виртуальную машину — см. конечные автоматы. А также автомат Мура — это лексический анализатор в любом языке программирования.
    Ответ написан