• Какие данные приходят на устройство через COM-порт, если отправить "1"?

    Rou1997
    @Rou1997
    serialPort1.WriteLine("1");

    Это, по-вашему, единица? Это строка с символом '1', а так как WriteLine, то помимо этого символа еще второй символ - '\n' (перенос строки), чтобы назвать это "единицей" надо иметь очень поверхностные знания в программировании и электронике, такие люди потом пишут приложения WPF с системными требованиями как у "топовых" игр, пишут калькулятор который "кушает" 100 МБ ОЗУ и соответственно запускается на ноутбуке за 5 секунд и иногда еще и столько же места занимает на диске, дальше говорить о кодировании сигнала не вижу смысла, отправлять нужно байты, вручную составленные из бит, тогда и поговорим, вообще кодировки разные бывают, не всегда "бит 0 = импульса нет, бит 1 = импульс есть", часто один бит передают двумя импульсами для того чтобы не путать 0 с отсутствием каких-либо данных вообще, по факту на этом уровне получается троичная система, а не двоичная.
    Ответ написан
    Комментировать
  • Как правильно выводить информацию из QVector?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Откройте для себя Model/View в Qt. В частности, ваша задачка с каталогами описана здесь.

    Вкратце: у вас есть модель, в котором вы связываете ваш способ хранения (QVector в вашем случае) со стандарным интерфейсомQAbstractItemModel (или его потомки QAbstractListModel, QAbstractTableModel или QAbstractTreeModel), который можно передать в один из стандартных вью-виджетов (QListView, QTableView, QTreeView). Реализовав интерфейс (переопределив виртуальные методы data и setData для role==Qt::DisplayRole и Qt::EditRole), вы можете просто изменять состояние модели, а вью-виджеты подхватят изменения автоматически.

    Кроме того, есть еще такая штука - QDataWidgetMapper. Он умеет привязывать виджеты (даже обычные, не View) к определенным полям в модели.
    Пример

    Пример объемный, но минимально полный, содержащий всю необходимую инфраструктуру. Допустим, мы хотим создать редактор для некоторых статей (блога?). Нам нужен простой класс Article, чтобы собрать в кучу данные о каждой отдельной статье:

    class Article
    {
    public:
        Article(int id, const QString& title, const QString& content) 
            : _id(id), _title(title), _content(content) {}
    
        int id() const { return _id; } 
        void setId(int id) { _id = id; }
    
        QString title() const { return _title; } 
        void setTitle(const QString& title) { _title = title; }
    
        QString content() const { return _content; }
        void setContent(const QString& content) { _content = content; }
    
    private:
        int     _id;
        QString _title;
        QString _content;
    };

    Для него напишем модель хранения этих статей - ArticlesModel, содержащей массив статей и методы для их добавления/удаления. Кроме того, для нее мы реализуем стандартный интерфейс QAbstractTableModel (методы rowCount, columnCount, data и setData), чтобы виджеты знали, как оттуда брать и как обновлять данные.

    class ArticlesModel :
            public QAbstractTableModel
    {
    public:
        ArticlesModel(QObject *parent=nullptr);
    
        void addArticle(const Article& art);
        void removeArticle(int id);
    
        //QAbstractTableModel interface implamentation
        int rowCount(const QModelIndex &/*parent*/) const override;
        int columnCount(const QModelIndex &/*parent*/) const override;
    
        bool data(QModelIndex& index, const QVariant &value, int role) const override;
        QVariant setData(QModelIndex& index, int role) override;
        
    private:
        std::vector<Article> _articles;
    };
    
    // =================================================================
    
    ArticlesModel(QObject *parent/*=nullptr*/) 
        : QAbstractTableModel(parent)
    {
    }
    
    void ArticlesModel::addArticle(const Article& art) {
        _articles.push_back(art);
    }
    void ArticlesModel::removeArticle(int id) {
        auto found = std::find_if(begin(_articles), end(_articles), 
                                [id](const Article& art) {
                                    art.id() == id;
                                });
        if (found != std::end(_articles)) {
            _articles.erase(artIt);
        }
    }
    
    
    int ArticlesModel::rowCount(const QModelIndex &/*parent*/) const override {
        return _articles.size();
    }
    int ArticlesModel::columnCount(const QModelIndex &/*parent*/) const override {
        return 2;
    }
    
    bool ArticlesModel::data(QModelIndex& index, const QVariant &value, int role) const override {
        if (!index.isValid) return QVariant();
    
        if (role == Qt::EditRole) {
            switch (column) {
                case 0: 
                    QVariant(_articles[index.row()].setTitle(value.toString()));
                    return true; 
                case 1:
                    QVariant(_articles[index.row()].setContent(value.toString()));
                    return true; 
            }
        }
        return false;
    }
    
    QVariant ArticlesModel::setData(QModelIndex& index, int role) override {
        if (!index.isValid) return QVariant();
    
        if (role == Qt::DisplayRole || role == Qt::EditRole) {
            switch (column) {
                case 0: return QVariant(_articles[index.row()].title()); 
                case 1: return QVariant(_articles[index.row()].content());
            }
        }
        return QVariant();
    }


    Тогда можно сделать так:

    // this - это какой-то родительский виджет
    
    auto titleEditor = new QLineEdit(this);
    auto contentEditor = new QTextEdit(this);
    
    QAbstractTableModel *model = new ArticlesModel(this);
    model->addArticle(Article(1, "Hello title", "Hello content"));
    model->addArticle(Article(2, "Another title", "Another content"));
    
    auto mapper = new QDataWidgetMapper(this);
    mapper->setModel(model);
    mapper->addMapping(titleEditor, 0);
    mapper->addMapping(contentEditor, 1);
    mapper->toFirst(); // Переключаемся на первый элемент модели


    Теперь мы можем добавлять/удалять статьи в model->add/removeArticle(const Article&), переходить с заметки на заметку с помощью mapper->setCurrentIndex(int index), менять содержимое заметок в редакторе.

    Можно добавить QListView, так же передать туда модель через setModel() и связать сигнал изменения текущего элемента списка с тем же действием mapper, добавить пару кнопок для добавления/удаления заметок и мы получим полноценный редактор.
    Ответ написан
    Комментировать
  • Лучше ли книги онлайн - курсов?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Начну пожалуй с того, что я в большей степени согласен с предыдущим оратором, на счёт того, что индивидуальное обучение лучше любого курса, но как человек который довольно продолжительно и не безуспешно занимается обучением, добавлю, что книг такое обучение не отменяет.

    Будучи начиная учиться в эпоху, "когда не было ещё всех этих ваших интернетов" (и ютубов тоже не было), выбор был очевиден. А за хорошей книгой, приходилось ехать иногда по 40км. в одну сторону. Но, тогда энтузиазма у авторов литературы было куда больше, нежели сейчас. Отчасти по тому, что в то время книги никто не сканировал/фотографировал и не распространял по интернете "бесплатно" (мимо бюджетов издательств и авторов). Сейчас с литературой, вернее, с хорошими авторами на русском языке, всё не очень хорошо и ощутимо хуже чем раньше. Общаясь с некоторыми коллегами, которым объективно есть о чём рассказать в книге, и задавая им вопрос на тему почему бы им её (книгу) не написать, не редко получаю ответ типа "всё равно же завтра книга будет в Интернете, зачем писать?", и это ещё помимо целой эпопеи с тем, что бы эту книгу издать. Иначе говоря, мотивация авторов довольно низкая.

    С появлением интернета, появилась другая проблема - туда дорвались буквально все и из "светской беседы" получился "балаган". И очень многие нынче, рвутся вести курсы, будучи не имея ни знаний, ни опыта, ни даже плана обучения как такового. Это наверное прозвучит забавно, но однажды мне пришлось обучать преподавателей курсов, т.к. им задачу "учить народ" поставили (сверху), а самих их никто не учил теме, которую они преподавать собирались.

    К чему я это всё... Выбирая между книгой и видео-курсом, с большей вероятностью, если это книга от иностранного автора в русском переводе - она будет качественно лучше, чем большинство видео курсов. Почему? Ну, как минимум, по тому, что обычно, "абы чего" переводить не берутся, по тому, что в книге обычно информация более структурирована и взаимосвязана. По тому, что в книге не бывает таких идиотских ситуация, когда автор курса из 2-х часов обучения настройки сервера, 40 минут пытается понять, почему его собственный сервер внезапно перестал работать... Книги таким обычно не страдают.

    Безусловно, информация в видео-формате, воспринимается лучше, но найти такую информацию в должном качестве будет ну очень тяжело.

    P.S. Подводя итог, хочу вспомнить слова одного из великих (чьё имя я успешно забыл), они звучали примерно так: "Проблема книги в том, что у неё нельзя спросить" (в его времена не было видео курсов, иначе бы он сказал то же самое и про них). По этому, по возможности, дополнительно к книгам/курсам ищите наставника, который захочет с Вами заниматься, в отличии от книги и/или курса, у него можно спросить. Остальную информацию придётся "выдирать", не редко по крупице, отовсюду (книги, курсы, статьи, блоги, конференции и т.д.).
    Ответ написан
    Комментировать
  • При использовании lightmap'а откуда берется информация о положении источника света?

    @GreatRash
    Lightmap is a way of generating textures that simulate lighting of your game environment. Lightmaps are baked during compiling (when you build lights) and are overlaid on top of geometry (bsp and custom static meshes) to simulate lighting and shadows.

    Короче это тупо текстура. А источники света есть только в редакторе. После запекания лайтмапы их можно удалить.
    Ответ написан
    5 комментариев
  • Правильно ли сделаны пояснения к коду?

    1. Уже в строке char c = 518; будет записано значение 6 в переменную c. Отсечение старших байтов.
    2. На строке с printf, значение c (6) будет преобразовано к типам соответственно unsigned int и int, по соглашению вызова функций.
    Ответ написан
    Комментировать
  • Что делает "Q_DECL_OVERRIDE" в Qt?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Этот макрос раскрывается как override, если есть поддержка C++11 и как пустое место в противном случае. Что собственно и написано на сайте: "It expands to "override" if your compiler supports that C++11 contextual keyword, or to nothing otherwise".
    Что означает ключевое слово override можно легко нагуглить: en.cppreference.com/w/cpp/language/override.
    Для виртуальных функций отличная практика писать слово virtual только один раз -- в интерфейсе обычно, от этого они виртуальными быть не перестанут. В остальных случаях override.
    Ответ написан
    Комментировать
  • Почему некорректно отображается svg в браузере?

    @tnc4401
    Product-designer, UI- UX-designer.
    Попробуйте открыть в Иллюстраторе (или чем-то, использующим svg), выбрать буквы и сделать Convert to curves или convert to outlines (не помню, как называется).

    Буквы в лого сделаны текстом. Отображаются криво, т.к. шрифты на разных компьютерах разные. Обязательно надо переводить текст в кривые.
    Ответ написан
    Комментировать
  • Как вы относитесь к такому тестовому заданию?

    Ankhena
    @Ankhena
    Нежно люблю верстку
    Олег Кулаков:
    Я бы не стала делать по нескольким причинам:
    1. Слишком много для халявного задания.
    2. В "темные" игры не играю. Не делаю никаких заданий связанных с фишингом, рефератами, диполомами форексом и т.д. По логике: потом я просто не буду иметь права возмущаться откуда столько разного рода нехороших людей (назовем мягко).
    Ответ написан
    3 комментария
  • Как Работает вирус?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    Вирус ничем не отличается от любой другой программы.
    Он просто запускается, выполняется, завершается.
    Суть вируса - в его действиях а не принципе работы, а суть действия - постараться скопировать себя куда-нибудь еще, без ведома пользователя, то есть размножаться.

    Поэтому, обычно он запускается, возможно пытается определить систему, возможно проверяет заражена ли уже система, затем пытается ее заразить - скопировать сам себя куда-нибудь в скрытое место и добавить себя в автозапуск под видом программы, сервиса, драйвера или части ядра (смотря насколько крут автор).
    Затем вирус может выполнять какие-либо дополнительные действия - требовать денег, портить информацию, обращаться в интернет за дополнительными инструкциями или не делать ничего.

    А на чем вирус написан - уже не важно. Внедрение внутрь файла сейчас почти не распространено.
    Ответ написан
    Комментировать
  • Почему это моветон?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Алексей: Евгений Шатунов:
    Люди умеющие гуглить, но не понимающие, о чём речь, дают ответы! Каждый день на тостере!
    Они могут нагуглить статью, в которой говорится примерно о том же, о чём задан вопрос, но, увы, не вполне.
    И ни в статье, ни в ответах так и не появляется правильного ответа.
    А правильный ответ -- во второй, неочевидной части пункта стандарта, описывающего выражения (C89: 3.3:2, C99: 6.5:2):

    Between the previous and next sequence point an object shall have its stored value
    modified at most once by the evaluation of an expression. Furthermore, the prior value
    shall be read only to determine the value to be stored.


    Т.е. если объект модифицируется, то читать его можно с единственной целью -- для вычисления значения, которое будет в него записано. Код a[i] = i++; читает значение изменяемой переменной i с другой целью: доступ к элементу массива по индексу, результат которого не влияет на конечное значение i -- и этого достаточно, чтобы такой код попадал в категорию UB.
    Ответ написан
    7 комментариев
  • Почему это моветон?

    alsopub
    @alsopub
    "Точка следования" - alenacpp.blogspot.ru/2005/11/sequence-points.html
    Там есть почти ваш случай - x[i] = ++i;
    Значение не то чтобы не определено, компилятор в праве решить что сделать сначала - вычислить адрес x[i] или сделать ++i.
    Я так понял.
    Ответ написан
    1 комментарий
  • Что за поломка произошла с ноутбуком?

    alsopub
    @alsopub
    Скорее всего заклинило кулер, раз пластик поплавился.
    PS. Если ноутбук работает хотябы минуту - лучше отнесите в сервис, пока не сломали что-нибудь при разборке.
    Ответ написан
    9 комментариев
  • Как решить проблему с модальными окнами?

    xpert13
    @xpert13
    Full Stack Developer
    Это проблема борладовского VCL. На Delphi тоже самое (что не странно, ведь VCL используется тот же).

    Модальное окно прячется в момент сворачивания/разворачивания окна. Мне в своё время помог следующий рецепт: для модального окна добавить такой код (код на Delphi, думаю перевести сможете):

    type
      TfrmModal = class(TForm)
      private
        procedure WMSYSCOMMAND(var Msg: TWMSYSCOMMAND); message WM_SYSCOMMAND;
      end;
    
    ...
    
    procedure TfrmModal.WMSYSCOMMAND(var Msg: TWMSYSCOMMAND);
    begin
      case (Msg.CmdType and $FFF0) of
        SC_MINIMIZE:
        begin
          Msg.Result := 0;
          EnableWindow(Application.Handle, True);
          Application.Minimize;
        end;
    
        else inherited;
      end;
    end;


    Эту процедуру можно добавить в каждое модальное окно, а можно создать класс с этим методом, от которого наследовать все модальные окна (вместо TForm).

    ----

    UPD: Попробую перевести на C++, но проверить не могу:
    header:
    private: // of TForm1 class
      void __fastcall WMSysCommand(TMessage &Msg); 
    
    BEGIN_MESSAGE_MAP 
        MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, WMSysCommand) 
    END_MESSAGE_MAP(TForm)


    cpp:
    void __fastcall TForm1::WMSysCommand(TMessage &Msg)
    {
        unsigned int const sys_code = Msg.WParam & 0xFFF0;
        switch (sys_code)
        {
            case SC_MINIMIZE:
            {
                Msg.Result = 0;
                EnableWindow(Application.Handle, True);
                Application.Minimize();
                return;
            }
        }
        TForm::Dispatch(&Msg);
    }
    Ответ написан
    4 комментария
  • Как не засыпать при чтении?

    saboteur_kiev
    @saboteur_kiev Куратор тега Книги
    software engineer
    Вы пытаетесь себя обмануть, говоря что эта книга (с большим количеством информации) вам интересна.

    На самом деле нет, не интересна. Может быть полезна, может быть развивает, но неинтересна.
    + банальная усталость.
    Ответ написан
    3 комментария
  • Как посчитать дробь?

    begemot_sun
    @begemot_sun
    Программист в душе.
    Скорее всего речь идет об О-нотации. Т.о. автору что 30 сек, что 100 сек -- без разницы, ему важен лишь его порядок, соотвественно 30 округляется до 100 в большую сторону.
    Ответ написан
    Комментировать
  • Отличия абстрактного класса от интерфейса?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    В чем отличие абстрактного класса от интерфейса в Java?


    Все упирается в понятие "тип". В былые времена, то есть во времена языка Simula, из которого черпали вдохновение создатели C++, были только классы. И на классах базировалась система типов. Причем механизм наследования был реализован так, как реализован, исключительно для экономии памяти, которая в те времена была очень дорогой.

    Для того чтобы достичь полиморфизма, мы должны иметь возможность объявлять абстрактные типы. Мол "любая хрень которая имеет такой тип будет работать как надо". Потому в языках типа C++ появились абстрактные классы. Поскольку иногда нам хочется делать композицию абстрактных типов, в C++ реализовали множественное наследование.

    В Java, которая во многом черпала вдохновения из C++ и smalltalk, решили ввести еще одну сущность - интерфейсы. Это был своего рода упрощенный способ задать абстрактный базовый тип. По итогу чтобы не решать проблему бриллианта (или ромба) от множественного наследования было решено отказаться и дать возможность классам имплементить несколько интерфейсов.

    За счет этого мы получаем возможность делать композицию типов как мы захотим. То есть вся разница сводится к тому, что при наследовании от абстрактного класса, мы именно наследуем классы, в то время как интерфейсы позволяют нашим классам имплементить абстрактные типы.

    В целом абстрактные классы нужны тогда, когда вам нужно наследование. Обычно это в ситуациях, когда у вас есть несколько классов, которые должны иметь общий абстрактный тип (то есть нельзя выделить наиболее слабого по ограничениям предка). Например если мы делаем цепочку классов String <- Email, то тут нет смысла в абстрактных классах так как тип String уже включает в себе подмножество типов Email.

    В целом в java8 уже ввели возможность интерфейсам иметь базовую реализацию, так что не удивлюсь если со временем от ключевого слова extends в принципе откажутся, избавившись от лишней сущности.

    Так же рекомендую к прочтению: www.javaworld.com/article/2073649/core-java/why-ex...
    Ответ написан
    9 комментариев
  • Как раздать интернет с модема на два wi-fi роутера?

    Jump
    @Jump Куратор тега Системное администрирование
    Системный администратор со стажем.
    Можно ли как-то с одного модема (кабельный интернет) провести интернет на два wi-fi роутера?
    Зависит от того как вам раздает интернет провайдер и умеет ли модем поднимать соединение.
    Т.е если модем сам поднимает соединение(т.е фактически является роутером) - просто подключаете роутеры прямо в модем, или через свитч, в качестве шлюза указываете модем.
    Если нет - значит подключаете к модему один роутер, поднимаете на нем соединение, и уже к этому роутеру подключаете второй роутер.
    Ответ написан
    1 комментарий
  • Как написать запрос?

    romy4
    @romy4
    Exception handler
    используя хитрость
    select *,IF(not isnull(field1),1,0) + IF(not isnumm(field2,1,0) + ... AS myselector  from tablename where myselector >=2
    Ответ написан
    4 комментария
  • Инерциальная навигация и machine learning как?

    begemot_sun
    @begemot_sun
    Программист в душе.
    Блин, ну что все помешались на НС. Зачем пихать ЭТО везде.
    Почему вы не можете использовать интеграторы для своих инерциальных датчиков ?
    Ответ написан
    2 комментария