Задать вопрос
  • Как удалить элемент из вектора, а затем добавить несколько новых?

    @Mercury13
    Программист на «си с крестами» и не только
    У вас могут быть две проблемы.
    1. Неверно написана операция «присвоить» или «переместить».
    2. Забыл, что в std::vector при операции «добавить» или «удалить» возможно физическое перемещение объекта и ссылки на него больше недействительны.

    Ну и IsEnded лучше писать вот так.
    bool IsEnded(const Query &aVar) { return (aVar.id == NO_ID); }
    Ответ написан
    2 комментария
  • Что будет содержать абстрактный класс?

    @Mercury13
    Программист на «си с крестами» и не только
    Вариант один вы предложили. Всё пишу на C++03, без шаблонов. C++11 и шаблоны, разумеется, дадут больше вариантов.
    class Object {
    public:
        virtual ~Object() {}
    };
    
    class List {    // interface
    protected:
        virtual Object& getAt(size_t i) = 0;
    public:
        virtual size_t size() const = 0;
        inline Object& at(size_t i) { return getAt(i); }
        inline const Object& at(size_t i) const
            { return const_cast<List*>(this)->getAt(i); }
        virtual ~List() {}
    };

    Вариант 2. С ним пользователю не так просто, но если к нему ещё добавить лямбда-функции C++11 — вообще бомба будет!
    class ListCallback {    // interface
    public:
        virtual void act(size_t index, Object& object) = 0;
        virtual ~ListCallback() {}
    };
    
    class ListConstCallback {   // interface
    public:
        virtual void act(size_t index, const Object& object) = 0;
        virtual ~ListConstCallback() {}
    };
    
    class List2 {   // interface
    public:
        virtual size_t size() const = 0;
        virtual void enumerate(ListCallback& body) = 0;
        virtual void enumerate(ListConstCallback& body) const = 0;
    };

    Например, для динамического массива, у которого быстрый доступ по номеру, будет такое тело
    void DynArray::enumerate(ListConstCallback& body) const {
       size_t sz = size();
       for (size_t i = 0; i < sz; ++i)
           body(i, operator[](i));
    }

    Разумеется, если вы нагрузкой сделаете не абстрактный Object, а что-то окончательное, dynamic_cast не нужен будет.

    Вариант 3 принят в Java. Один недостаток — мого кода писать для const-корректности, так что с вашего позволения опущу.
    class VirtualListIterator { // interface
    public:
        virtual bool next() = 0;
        virtual Object& value() = 0;
        virtual ~VirtualListIterator() {}
    };
    
    class ListIterator {   // Назван так для красоты, по сути это умный указатель
    private:
        VirtualListIterator* ptr;
        // Запретим копирование и op=, но при желании можно реализовать и их
        ListIterator(ListIterator&) {}
        void operator=(const ListIterator&) {}
    public:
        ListIterator() : ptr(NULL) {}
        ListIterator(VirtualListIterator* value) : ptr(value) {}
        ~ListIterator() { delete ptr; }
        bool next() { return ptr->next(); }
        Object* operator->() const { return &ptr->value(); }
        Object& operator*() const { return ptr->value(); }
    };
    
    class List3 {   // interface
    public:
        virtual size_t size() const = 0;
        virtual VirtualListIterator* enumerate() = 0;
    };
    
    class Number : public Object {
    public:
        int value;
    };
    
    // И пользоваться этим так...
    void doSmth(List3& aList) {
        ListIterator it(aList.enumerate());
        while (it.next()) {
            std::cout << dynamic_cast<Number&>(*it).value << std::endl;
        }
    }


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

    Да, и из вас будет хороший инженер, если вы сразу же задумываетесь о производительности.
    Ответ написан
    Комментировать
  • Как создать динамический массив из объектов класса?

    @Mercury13
    Программист на «си с крестами» и не только
    Операция присваивания или перемещения есть? Пускай даже созданная автоматически? Если есть — вот, смотрите.
    #include <iostream>
    #include <vector>
    
    class Test {
      int k;
    public:
      Test(int _i) {k = _i; }
    
      void put_k(int i) {k = i; }
      int get_k() {return k; }
    };
    
    
    struct TestWrapper {
        Test payload;
        TestWrapper() : payload(0) {}
        TestWrapper(int i) : payload(i) {}
        TestWrapper(const Test& i) : payload(i) {}
    };
    
    int main()
    {
        Test test(10);
        std::vector<TestWrapper> v;
        v.push_back(test);
        std::cout << v[0].payload.get_k() << std::endl;
        return 0;
    }


    Если нет — тогда динамический массив так просто работать не может (фишка динамического массива — заводить новый массив и копировать информацию из старого). Только использованием умных указателей.
    #include <iostream>
    #include <vector>
    #include <memory>
    
    
    class Test {
      int k;
    public:
      Test(int _i) {k = _i; }
      Test& operator=(const Test&) = delete;
      Test& operator=(Test&&) = delete;
    
      void put_k(int i) {k = i; }
      int get_k() {return k; }
    };
    
    
    int main()
    {
        std::vector<std::unique_ptr<Test>> v;
        v.push_back(std::unique_ptr<Test>(new Test(10)));
        std::cout << v[0]->get_k() << std::endl;
        return 0;
    }
    Ответ написан
  • Косое произведение в координатах для R=3?

    @Mercury13
    Программист на «си с крестами» и не только
    В 2D есть два произведения: скалярное (проекция) и косое (ориентированная площадь).
    В 3D есть три произведения: скалярное (проекция), векторное (ориентированная площадь) и смешанное (ориентированный объём).
    Думаю, в 4D уже четыре штуки.

    По поводу формулы. Почему не будет работать? Будет, однако вы неправильно написали, чему равняется [e1e2]. Оно в 3D равняется не единичке, а e3.
    Ответ написан
  • Как реализовать изменение размера файла на Си?

    @Mercury13
    Программист на «си с крестами» и не только
    Чтобы увеличить файл, надо дописать в конец.
    Libc — fopen(..., "wa");
    WinApi — CreateFile с нужными правами, затем SetFilePointer в конец и дописывай на здоровье.

    Чтобы уменьшить файл
    В Libc этого нет, есть функции POSIX truncate/ftruncate, в Win32 — _chsize.
    WinApi — SetEndOfFile.
    Ответ написан
    Комментировать
  • Что такое Stylus Bearing?

    @Mercury13
    Программист на «си с крестами» и не только
    Направление наклона пера.
    Ответ написан
    2 комментария
  • Передача узла дерева?

    @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 комментариев