• Как склеить прием данных через QT serialport C++?

    Zifix
    @Zifix Куратор тега Qt
    Barbatum
    Возьмите любой учебник по программированию и почитайте его. Если вы не в курсе как делать конкатенацию строк, то программировать вам рано.
    Ответ написан
    3 комментария
  • Как проверить что по serial пришел полный пакет данных?

    @Zolg
    последовательный порт не передает пакеты. последовательный порт передает поток байт (на самом деле - бит, но прием целых байт уже реализован до вас нижележащими уровнями абстракции)
    'разбиение на пакеты' - задача протокола более высокого уровня (который вам видимо и нужно реализовывать).
    если у вас 'пакет' это строка, то конец пакета маркируется символом перевода строки, не так ли ?
    Ответ написан
    2 комментария
  • Какой стандарт c++ изучать?

    Adamos
    @Adamos
    несколько месяцев изучаю
    Думаю почитать книжечку
    явно не смогу понять
    если вдруг начну читать
    придется начинать изучать
    нужно будет по сто раз переучиваться
    пугает.

    Ваш выбор - 1C. Или продажником в DNS...
    Ответ написан
    Комментировать
  • Как использовать одну переменную в разных программах?

    @res2001
    Developer, ex-admin
    К чему весь этот листинг?
    Т.е. вы хотите из разных программ (процессов) обращаться к одному участку памяти?

    Напрямую вы сможете использовать 1 переменную в разных программах только используя механизм shared memory ОС и разместив переменную в "расшаренном" участке памяти. В этом случае для синхронизации доступа к переменной в разных процессах вам необходимо будет использовать какие-либо именованные примитивы синхронизации, иначе будет состояние гонки и доверять содержимому переменной в этом случае будет нельзя.

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

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

    myjcom
    @myjcom Куратор тега C++
    Собственно
    отсюда

    #include <algorithm>
    #include <iterator>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    auto fx = [](int x){
      int r = 0;
      switch(x % 3)
      {
        case 0:
          r = x * x;
          break;
        case 1:
          r = x;
          break;
        default:
          r = x / 3;
          break;
      }
      return r;
    };
    
    auto calculate = [](const vector<int>& vx, auto fx){
      vector<int> calcValues(vx.size());
      transform(vx.begin(), vx.end(), calcValues.begin(), fx);
      return calcValues;
    };
    
    int main()
    {
      cout << "Введи кол-во чисел: ";
      int n = 0;
      cin >> n;
    
      cout << "Введи через пробел " << n << " натуральных чисел:\n" << "$: ";
      vector<int> values(n);
      copy_n(istream_iterator<int>(cin), n, values.begin());
    
      cout << "Результат твоих расчетов:\n";
      copy_n(calculate(values, fx).begin(), n, ostream_iterator<int>(cout, "\n"));
    }


    тебе нужна только fx в остальное можешь не погружаться, кроме того что
    Даны натуральные числа

    https://ru.wikipedia.org/wiki/Натуральное_число --> unsigned
    Ответ написан
    Комментировать
  • Почему printf не выводит переменные?

    myjcom
    @myjcom Куратор тега C++
    Почему printf не выводит переменные?

    printf("%s", "Znachenie", &p);
    int printf( const char* format, ... );

    выводит %s writes a character string которую вы передаете аргументом "Znachenie"
    %f converts floating-point number to the decimal notation которое вы передаете аргументом p
    printf("%s %f", "Znachenie", p);

    но так не совсем удобно
    вот так проще
    printf("Znachenie %f", p);

    оператор address-of перед именем переменной не нужен.
    Ответ написан
    Комментировать
  • Как считать вторую строку?

    myjcom
    @myjcom Куратор тега C++
    Но не таким способом

    #include <iostream>
    #include <sstream>
    #include <algorithm>
    #include <iterator>
    #include <vector>
    using namespace std;
    
    int main()
    {
      size_t n = 4;
      string s = "42 54 35 76";
      
      istringstream is(s);
      
      vector<int> v;
      copy_n(istream_iterator<int>(is), n, back_inserter(v));
    
      /*******
      ** vector<int> v2(n);
      ** copy_n(istream_iterator<int>(is), n, v.begin());
      *******/
      copy_n(v.begin(), n, ostream_iterator<int>(cout, " "));
    }

    Ответ написан
    Комментировать
  • Как хранятся числа в памяти?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    struct Data {
      short id;
      double val;
    };


    я понимаю что 32 00 11 49 - это интовское значение

    в этой структуре short int, 2 байта. 0x32 0x00 -- это оно (0x32 + 256 * 0x00 = 50), little endian.
    0x11 0x49 -- это мусор. 0x02 0x56 0x00 0x00 идущие дальше -- это тоже мусор.
    0x33 0x33 0x33 0x33 0x33 0x33 0xf3 0x3f -- это double (0x3ff -- порядок, 0x3333333333333 -- мантисса, значение = 0x1.3333333333333 * 2 ^ (0x3ff - 1023) = 1.19999999999999995559), little endian, ieee754.

    Как в данном выводе понять где выравнивание происходит?

    Можно воспользоваться макросом offsetof.
    Ответ написан
    5 комментариев
  • Соотношение многопоточности приложения c++ и многопоточности на уровне системы?

    gbg
    @gbg
    Любые ответы на любые вопросы
    У вас тотальный бардак в голове относительно терминов. Разберитесь с тем, что такое процесс, а что такое поток, что за "второй способ работы с многопоточностью при помощи мьютексов" и так далее. "Многопоточность в одной единице трансляции" - это просто шедевр. Как единицы трансляции связаны с потоками?

    Из вашего потока сознания я понял, что вам нужен QSingleApplication - Штука, которая не дает запустить программу более одного раза.
    Ответ написан
    3 комментария
  • Что здесь не правильно?

    myjcom
    @myjcom Куратор тега C++
    Можно помочь с ответом, а не включать своё остроумие, подсказка небольшая.

    Больше не могу

    #include<iostream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<memory>
    #include<sstream>
    #include<Windows.h>
    using namespace std;
    
    enum class spType {ALL, SP, TH};
    
    class Policlinic
    {
    public:
      Policlinic();
      ~Policlinic();
      // ... 
      void addSpecialists(const string& s);
      void addTherapists(const string& s);
      void printPersonnel(spType = spType::ALL);
      // ...
      // Геттеры Сеттеры сам по шаблону
      // ...
    private:
      struct Personnel;
      unique_ptr<Personnel> m_personnel;
    
      string desk;
      string type;
    
      unsigned pharmacy = 0;
    
      friend istream& operator>>(istream& is, vector<string>& values);
      friend ostream& operator<<(ostream& os, const vector<string>& values);
    };
    
    struct Policlinic::Personnel
    {
      vector<string> specialists;
      vector<string> therapists;
    };
    
    Policlinic::Policlinic() : m_personnel(make_unique<Personnel>())
    {
    }
    
    Policlinic::~Policlinic()
    {
    }
    
    istream& operator>>(istream& is, vector<string>& values)
    {
      copy(istream_iterator<string>{is}, {}, back_inserter(values));
      return is;
    }
    
    ostream& operator<<(ostream& os, const vector<string>& values)
    {
      copy(values.begin(), values.end(), ostream_iterator<string>{os, "\n"});
      return os;
    }
    
    void Policlinic::addSpecialists(const string& s)
    {
      istringstream is(s);
      is >> m_personnel->specialists;
    }
    
    void Policlinic::addTherapists(const string& s)
    {
      istringstream is(s);
      is >> m_personnel->therapists;
    }
    
    void Policlinic::printPersonnel(spType stype)
    {
      switch(stype)
      {
      case spType::SP:
        cout << "Специалисты:\n"
             << m_personnel->specialists;
        break;
    
      case spType::TH:
        cout << "Терапевты:\n" 
             << m_personnel->therapists;
        break;
    
      default:
        cout << "[Весь персонал]\n";
             printPersonnel(spType::SP);
             printPersonnel(spType::TH);
        break;
      }
    }
    
    int main()
    {
      SetConsoleCP(1251);
      SetConsoleOutputCP(1251);
      setlocale(LC_ALL, "ru");
    
      Policlinic ply;
    
      // Для простоты
      string value;
      
      cout << "Введите врачей специалистов через пробел \n$: ";
      getline(cin, value);
      ply.addSpecialists(value);
      
      cout << "\nВведите врачей терапевтов через пробел\n$: ";
      getline(cin, value);
      ply.addTherapists(value);
     
      ply.printPersonnel(spType::ALL);
    
      system("pause");
    }

    Ответ написан
    1 комментарий
  • Как сделать ввод элементов в динамический массив в классе?

    myjcom
    @myjcom Куратор тега C++
    Константин Подыганов,
    У меня при вводе ограничивается ввод до 5-ти символов, а я хочу ввести любое число, любого количества

    Допишешь сам?
    #include<iterator>
    #include<iostream>
    #include<algorithm>
    #include<memory>
    using namespace std;
    
    class Decmal
    {
    public:
      explicit Decmal(size_t size = 5);
      Decmal(const Decmal&);
      size_t get_size() const
      {
        return size;
      }
      // ...
    private:
      size_t size;
      unique_ptr<char> data;
      // ...
    private:
      void resize(size_t sz);
      friend istream& operator>>(istream& is, Decmal& dec);
      friend ostream& operator<<(ostream& os, const Decmal& dec);
    };
    
    Decmal::Decmal(size_t size) : size{ size }, data(new char[size])
    {
      fill_n(data.get(), size, '0');
    }
    
    Decmal::Decmal(const Decmal& rh)
    {
      size = rh.size;
      data.reset(new char[size]);
      copy_n(rh.data.get(), size, data.get());
    }
    
    void Decmal::resize(size_t new_size)
    {
      if(size < new_size)
      {
        data.reset(new char[new_size]);
        size = new_size;
      }
    }
    
    istream& operator>>(istream& is, Decmal& dec)
    {
      is.putback(is.get());
      size_t new_size = static_cast<size_t>(is.rdbuf()->in_avail() - 1);
    
      dec.resize(new_size);
    
      copy_n(istream_iterator<char>{is}, dec.size, dec.data.get());
      return is;
    }
    
    ostream& operator<<(ostream& os, const Decmal& dec)
    {
      copy_n(dec.data.get(), dec.size, ostream_iterator<char>{os});
      return os;
    }
    
    int main()
    {
      Decmal x;
    
      cin >> x;
    
      cout << x.get_size() << " " << x << endl;
    
      system("pause");
    }

    Константин Подыганов
    Не совсем понял принцип работы этого кода.

    Без всего

    #include<iterator>
    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    class Decmal
    {
    public:
      explicit Decmal(size_t size = 5);
      Decmal(const Decmal&);
      ~Decmal(){ delete[] data; }
    
      size_t get_size() const
      {
        return size;
      }
      // ...
    private:
      size_t size;
      unsigned char* data = nullptr;
      // ...
    private:
      void resize(size_t sz);
      friend istream& operator>>(istream& is, Decmal& dec);
      friend ostream& operator<<(ostream& os, const Decmal& dec);
    };
    
    Decmal::Decmal(size_t size) : size{ size }, data(new unsigned char[size])
    {
      fill_n(data, size, '0');
    }
    
    Decmal::Decmal(const Decmal& rh)
    {
      size = rh.size;
      delete[] data;
    
      data = new unsigned char[size];
    
      copy_n(rh.data, size, data);
    }
    
    void Decmal::resize(size_t new_size)
    {
      if(size < new_size)
      {
        delete[] data;
        data = new unsigned char[new_size];
        size = new_size;
      }
    }
    
    istream& operator>>(istream& is, Decmal& dec)
    {
      char c = 0;
      size_t sz = 0;
    
      while(is.read(&c, 1) && c != '\n') // \n == 10 \r == 13
      {
        if(sz == dec.size)
        {
          unsigned char* tmp = new unsigned char[sz + 1];
          copy_n(dec.data, dec.size, tmp);
          dec.resize(sz + 1);
          copy_n(tmp, dec.size, dec.data);
          delete[] tmp;
        }
        dec.data[sz] = c;
        ++sz;
      }
    
      return is;
    }
    
    ostream & operator<<(ostream& os, const Decmal& dec)
    {
      copy_n(dec.data, dec.size, ostream_iterator<char>{os});
      return os;
    }
    
    int main()
    {
      Decmal x;
    
      cin >> x;
    
      cout << x.get_size() << " " << x << "\n";
    
      Decmal y = x;
    
      cout << y << endl;
    
      system("pause");
    }

    Ответ написан
    7 комментариев
  • Есть ли в Си функция, читающая TCP без коллбеков?

    gbg
    @gbg
    Любые ответы на любые вопросы
    В си вообще нету функции, которая что-то там читает из сокета - это делается либо функцией из состава Berkeley sockets для UNIX или Winsock для Windows.

    И там и там имеется функция recv - она ничего циклом не нагружает, а усыпляет поток выполнения до прихода порции данных или сообщения об ошибке.
    Ответ написан
    Комментировать
  • Почему выдает ошибку: индекс за пределами массива?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Если я правильно делаю

    Нет, не правильно. Что-бы отобразить последний элемент списка нужно:
    print(some_values[-1])
    Осильте хотя-бы десяток страниц любой книги, а то подобная отсебятина ну совсем прям...
    И не называйте переменные названием встроенных функций.

    Сама ошибка из-за того, что у вас список пустой.
    Ответ написан
    2 комментария
  • Как установить количество знаков после запятой в QT?

    myjcom
    @myjcom Куратор тега C++
    double x = 12.3456789;
    double y = 98.7654321;
    QString str = QString("x: %1 y: %2").arg(x, 0, 'f', 3).arg(y, 0, 'f', 3);

    OUT:
    x: 12.346 y: 98.765

    https://doc.qt.io/qt-5/qstring.html#arg-9
    https://doc.qt.io/qt-5/qstring.html#argument-formats
    Ответ написан
    Комментировать
  • Как универсально изменить цвет слова?

    myjcom
    @myjcom Куратор тега C++
    Задаю такой вопрос ибо не нашёл универсального решения

    ----> Источник инфы
    #include<iostream>
    #include<cstdlib>
    int main()
    {
      system(" "); // пробел важен
      std::cout << "\x1b[31m" << "Hello user!";
      std::cin.get();
    }

    Linux/Win10
    Ответ написан
    Комментировать
  • Почему происходит удаление объекта при конструировании одноименных объектов?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Эквивалентная запись для присваивания:
    a = A(2);
    Тут создается временный объект, который удаляется после исполнения этой строки.
    Оператор присваивания принимает константную ссылку на этот временный объект и потенциально изменяет значения полей объекта this (в вашем случае менять нечего).
    Вывод ожидаемый. 2 и 3 строки -- содание и удаление временного объекта.
    Ответ написан
    4 комментария
  • Использование и обращение к std::pair в std::map?

    maaGames
    @maaGames
    Погроммирую программы
    it->first; // string
    it->second; // pair<int,int>
    it->second.first; // первый int
    it->second.second; //второй int
    Ответ написан
    Комментировать
  • В чем отличие полиморфизма от реализации интерфейса?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    Тут, на самом деле, необходимо чётко определить границы.

    Есть ООП как парадигма программирования. Одна из концепций ООП называется полиморфизм. Существуют различные реализации этой концепции в языках программирования.

    В C++ есть несколько реализаций полиморфизма. Вам, на данном этапе, скорее всего интересен только полиморфизм, основанный на подтипах. Это означает, что вызывающий код может работать с набором типов из определённой иерархии, без знания о том, какой это конкретно но тип: базовый или подтип.

    Касательно интерфейсов: в C++ их нет на уровне языка, как отдельной сущности. Однако же разница между интерфейсом и абстрактным классом никуда не делась.

    Пример "обычного полиморфизма":
    // Это "интерфейс", который представляет собой набор операций, которые можно произвести над объектом
    // В данном случае, по объекту можно постучать
    class IKnockable {
    public:
        virtual ~IKnockable() = 0;
    
        // Само по себе действие: "постучать"
        virtual void knock() const = 0;
    };
    
    // Реализация интерфейса классом Door
    class Door : public IKnockable {
    public:
        // ...
        void knock() const override { std::cout << "door" << std::endl; }
        // ...
    };
    
    // Реализация интерфейса классом Window
    class Window : public IKnockable {
    public:
        // ...
        void knock() const override { std::cout << "window" << std::endl; }
        // ...
    };
    
    // ...
    
    // Какая-то функция, которая может постучать  по каждому объекту из списка, 
    // не имея представления о том, что же это за объект
    void knock(const std::vector<std::shared_ptr<IKnockable>> &knockableObjects) {
        for (auto &&knockableObject : knockableObjects) {
            knockableObject->knock();
        }
    }
    
    // ...
    
    std::vector<std::shared_ptr<IKnockable>> v = {std::make_shared<Door>(), std::make_shared<Window>()};
    knock(v); // Сначала напечатает "door", потом напечатает "window"


    Ответ на ваш изначальный вопрос: это понятия из разных областей, одно из теории типов, другое из языков программирования. Интерфейс -- это одно из средств в языках программирования, для реализации определённого типа полиморфизма.
    Ответ написан
    3 комментария
  • Регулярное выражение dd.mm.yyyy на С?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    Максимально упрощённый пример с использованием библиотеки PCRE
    #include <stdio.h>
    #include <string.h>
    #include <pcre.h>
    
    #define DATE_SIZE 11
    
    int main(int argc, char* argv[]) {
      pcre *pattern;
      const char *error_str;
      int error_offset;
      int matches[1];
    
      pattern = pcre_compile("^\\d{2}\\.\\d{2}\\.\\d{4}$", 0, &error_str, &error_offset, NULL);
    
      if(pattern == NULL) {
        printf("Could not compile: %s\n", error_str);
        return 1;
      }
    
      char str[DATE_SIZE];
      fgets(str, DATE_SIZE, stdin);
    
      int r = pcre_exec(pattern, NULL, str,  strlen(str), 0, 0, matches, 1);
    
      pcre_free(pattern);
    
      if (r < 0)
        puts("Invalid date");
      else
        puts("Valid date");
    
      return EXIT_SUCCESS;
    }
    Ответ написан
    Комментировать
  • Зачем и когда нужно использовать указатели в C++?

    RabraBabr
    @RabraBabr
    Ну что же. попробуем в указатели.
    Когда то давно, когда деревья были высокими, а трава сочнее и зеленее, на одной красивой планете - да можно было и без указателей. Автоматические переменные неплохо работали в стеке (ага иди гугли про стек и какой он маленький и про знаменитый его оверфлоу). В общем ответь на вопрос, много ли этого стека? Стало все не так романтично, объемы данных росли программы усложнялись , а программист ручками в куче (ага гугли про кучу) с помощью malloc'а выделял память. А что бы он знал где он выделяет память нужны указатели (ну как адрес квартиры - где проживают переменные Ивановы?). вот указатели в общем этот адрес и хранят. Только выяснилось, что программист плохо ручками память выделяет. Например в 20 метровую однушку он может захотеть поселить табор из 300 закарпатских цыган. И согласись получится неприятность.

    Вот в c++ память выделяется new и delete - это операторы такие. Сами посчитают сколько цыган куда и адресок вернут, а когда надо всех ненужных выселят. Только лучше и веселее не стало, память всегда течет, а указатели всегда висят. А где там в какой квартире Ивановы, а где Петровы вообще не понять И куда тот табор делся? А может и не делся.

    Оппа у нас же в c++ парадигма ООП и классы (гуглим классы). А в классах всегда конструктор и деструктор (гуглим), и они вызываются автоматически когда объект (экземпляр класса) создается и когда уничтожается. Так может new положим в конструктор, а delete в деструктор? И назовем все это хозяйство std::auto_ptr. И пусть он сам за памятью следит, а программиста будем бить по рукам за ручное выделение памяти

    Беда, печаль однако. Лучше жить не стало. и виной тому конструктор копирования (вот опять гуглим). Тогда придумали семантику перемещения r-value ссылки и кучу новых умных указателей вот просвещайся https://ru.cppreference.com/w/cpp/memory
    Если пройдешь по ссылке то увидишь много новых и интересных слов например аллокаторы или неинициализированные хранилища.

    И я надеюсь мой юный друг, что ты уже понял, что до джуна тебе еще очень и очень много непонятных слов. Вот когда сможешь shared_ptr свелосипедить, тогда свелосипедь себе еще и резюме и вперед на собеседования.
    Ответ написан
    Комментировать