Задать вопрос
Ответы пользователя по тегу C++
  • Как запустить приложение через forkpty?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    может быть так?

    #include <pty.h>
    #include <unistd.h>
    #include <thread>
    #include <future>
    #include <iostream>
    #include <string>
    
    ssize_t sz = 1;
    
    int main()
    {
      int mfd;
    
      pid_t pid_fork = forkpty(&mfd, NULL, NULL, NULL);
    
      if (!pid_fork) {
        // Дочерний процесс
        execl("/bin/sh", "-", NULL);
      } else {
        // Родительский процесс
        char buf[1024];
    
        // Async
        auto future = std::async(std::launch::async, [mfd]() {
          std::string line;
          while (sz) {
            std::getline(std::cin, line);
            line = line  + "\n";
            write(mfd, line.c_str(), line.size()); // Нужно направить в дочерний процесс как stdin
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
          }
        });
    
        while (sz = read(mfd, buf, sizeof(buf))) {
          write(STDOUT_FILENO, buf, sz); // Вывод из дочернего процесса stdout
          std::this_thread::sleep_for(std::chrono::milliseconds(100));
        }
    
        exit(0);
      }
    }

    Поскольку это теперь терминал, то имеет смысл установить размеры pty такими же, как у терминала вызывающей программы, например так:

    ...
    #include <sys/ioctl.h>
    ...
      struct winsize ws, *pws = NULL;
    
      if (ioctl(1, TIOCGWINSZ, &ws) >= 0)
        pws = &ws;
      pid_t pid_fork = forkpty(&mfd, NULL, NULL, pws);


    Кроме того, sleep_for в циклах чтения и записи не нужен, поскольку операции чтения присутствующие в обоих циклах -- блокирующие. Но нужна проверка того, что записались все прочитанные данные.
    Ответ написан
    1 комментарий
  • Как сделать массив произвольной длины?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как быть? Какой размер массива объявить?

    Не объявляй никакой. Воспользуйся вместо этого стандартным контейнером, например std::vector.
    Но если хочется помучаться -- воспользуйся указателем и выделяй память динамически, по мере поступления входных данных.
    Ответ написан
    Комментировать
  • Множественный вызов конструктора базового класса при виртуальном наследовании?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    напрашивается вопрос "Будет ли конструктор базового класса A вызываться два раза, ведь в конструкторе C тоже вызывается конструктор A?".


    Нет, не будет, потому что нет, при конструировании объекта класса D конструктор A из конструктора C не вызывается. См.:
    A mem-initializer where the mem-initializer-id denotes a virtual base class is ignored during execution of a constructor of any class that is not the most derived class.
    Ответ написан
    Комментировать
  • Почему данные не записываются в реестр?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    LONG error = RegCreateKeyEx(...);
      if (hKey) {

    Ошибок нет, но и результатов нет !

    Ошибок нет, потому что ты не проверяешь код ошибки, а вместо этого проверяешь hKey.
    Если внимательно прочитать https://docs.microsoft.com/en-us/windows/win32/sys... то можно увидеть для KEY_WOW64_32KEY, что
    This flag must be combined using the OR operator with the other flags in this table that either query or access registry values.

    Подозреваю, что там должно быть KEY_WOW64_32KEY | KEY_SET_VALUE.

    RegSetValueA(hKey, "test", REG_SZ, (LPCSTR)path.c_str(), sizeof(path.c_str()));

    Не sizeof. И код ошибки тоже не проверяешь.
    Ответ написан
  • Как хранятся числа в памяти?

    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 комментариев
  • Как понять условие задачи?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я подумал, что граф всегда можно разбить на две множества так, чтобы вершины, соединенные максимальным ребром были в одном множестве, а остальные вершины в другом, то-есть ответом всегда будет максимальное ребро. Я протестировал свое решение в яндекс.контест и получил ошибку на 8 тесте. Подскажите пожалуйста, что я не правильно понял из условия?
    Может есть контрпример?

    Контрпример: квадрат, верхнее ребро -- 2, боковые -- 1, нижнее -- 0. В терминах входных данных для задачи:
    4 4
    0 1 2
    1 2 1
    2 3 0
    3 0 1

    Если разбивать твоим алгоритмом, то в одно множество попадают две верхние вершины, во второе -- две нижние. Тогда "ребро минимального веса, соединяющее вершины из одного множества" -- это ребро соединяющее две нижние вершины (2 3), его вес -- 0.
    Но если разбить граф на две левые вершины (3 0) и две правые (1 2), то "ребро минимального веса, соединяющее вершины из одного множества" имеет вес 1, что лучше, чем 0.
    Ответ написан
    Комментировать
  • Может ли процессор изменять порядок инструкций в программе?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Насчет компиляторов поверю, но вот процессора ??? как ???

    Читать тут, лучше сразу английскую версию.
    Ответ написан
    Комментировать
  • C++. Ассоциативность перегруженных операторов?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В сети не нашёл ответа.

    В каждом из разделов стандарта касающихся операторов написано в каком порядке группируются вызовы опреаторов в однородных выражениях (например).

    Получается, что, если явно скобками не обозначить, то ассоциативность всегда будет справа налево, или я не прав?

    Почти все операторы группируются слева направо, за исключением префиксных операторов и операторов присваивания (в том числе составных).

    Пример

    #include <string>
    #include <iostream>
    
    struct A
    {
            std::string name;
    
            A(const std::string& _name): name(_name)
            {
            }
    
            A operator +(const A& other) const
            {
                    std::cerr << name << " + " << other.name << std::endl;
                    return A(std::string("{temporary from ") + name + " + " + other.name + "}");
            }
    };
    
    int main()
    {
            A first("first"), second("second"), third("third");
            A r = first + second + third;
    }

    выводит
    first + second
    {temporary from first + second} + third
    Ответ написан
    Комментировать
  • Можно ли совместить две эти реализации между собой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Возможно ли как то совместить две эти реализации что бы получать на выходе crc32 в виде const char*?

    Поменять crc32_impl(const uint8_t* p и crc32(const uint8_t* data, на crc32_impl(const char* p и crc32(const char* data и выкинуть преобразование типов из crc32((uint8_t*)str,?
    Ответ написан
  • Почему деструктор крашится на чистке и-ого элемента?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    У тебя в классе massiv нет конструктора копирования, а аргументы методам sum и multiply ты передаёшь по значению. Это значит, что при создании копий объектов класса massiv память не выделяется, но при их уничтожении она освобождается. А потом освобождается повторно при удалении оригинальных объектов. Поэтому не работает.
    Самый простой фикс -- поменять

    void massiv::sum(massiv obj1, massiv obj2)
    void massiv::multiply(massiv obj1, massiv obj2)

    на

    void massiv::sum(const massiv& obj1, const massiv& obj2)
    void massiv::multiply(const massiv& obj1, const massiv& obj2)
    Ответ написан
    2 комментария
  • Точность типов переменных с плавающей точкой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    long double a = 1.4142135623730950488;
    double b = 1.4142135623730950488;

    почему переменная типа long double хранит данные с такой же точностью, как и переменная типа double?

    Потому что ты инициализировал их одинаковыми значениями типа double. Попробуй сделать так:
    long double a = 1.4142135623730950488L;
    См:
    The type of a floating literal is double unless explicitly specified by a suffix.
    Ответ написан
    6 комментариев
  • Запись в переменную литерала не его типа?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Запись в переменную литерала

    Выглядит так: int a = 1; 1 -- это литерал. Ввод из потока к литералам отношения не имеет.

    почему если попытаться записать в переименую типа int символ, то не выдается ошибки

    Выдаётся, только ты её не проверяешь. Меняется failbit потока. Попробуй:

    #include <iostream>
    
    int main()
    {
      int a;
      
      std::cin >> a;
      std::cout << "a  = " << a << ", cin.fail() = " << std::cin.fail() << std::endl;
    }
    Ответ написан
  • Как правильно собрать gRPC?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Выдает ошибку:

    src/core/lib/iomgr/tcp_posix.cc:534:61: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]

    Сделай sed -i 's/-Werror//g' Makefile перед сборкой, чтобы она не валилась от предупреждений.
    Ответ написан
  • Почему при передаче произволного количества аргументов в функцию появляются лишние аргументы?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Написал такую функцию:
    void privet(char* name ...) {
      char** ptr = &name;
      va_list ap;
      va_start(ap,name);
      int i = 0;
      for (;;) {
        char* p = va_arg(ap,char*);
        if (p == 0) break;
        cout << ptr[i] << " " << i << endl;
        i++;
      }
      va_end(ap);
    }

    Плохо написал. Если уж ты передаёшь параметры через многоточие и получаешь их через p = va_arg(ap,char*), то и используй p, который получил, а не ptr.

    При ее вызове с тремя аргументами privet("Nagib", "Habib", "Gena")

    А NULL в конец кто добавит за тебя, раз уж ты его в функции проверяешь?
    Ответ написан
    Комментировать
  • Что не так в этой рекурсии?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что не так в этой рекурсии?

    Она выглядит непонятно. Её можно переписать понятно так:
    int mul(const int *x, int n)
    {
        assert(n > 0);
        if (n == 1)
            return x[0];
        if (n == 2)
            return x[0] * x[1];
        return mul(x, n / 2) * mul(x + n / 2, n - n / 2);
    }
    Ответ написан
    1 комментарий
  • Оправданно ли использование static в моем случае?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Подскажите, как лучше поступить в моем случае?

    Узнать чем статические методы класса отличаются от обычных методов.
    Узнать, что кроме указателей на функции бывают указатели на функции-члены.
    Понять, чем из этого лучше воспользоваться в твоём случае.
    Ответ написан
    3 комментария
  • Существует ли встроенные бинарные деревья в C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Встроена ли данная структура в язык, как, например, приоритетная очередь, heap и др?

    Нет, не встроена, так же как не встроены приоритетная очередь, heap и др.
    И в стандартной библиотеке её тоже нет.
    Ответ написан
  • Аналог среза в C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Пробовал написать собственную функцию срез(без успеха)

    Покажи, где проблема возникла.

    Есть какие либо варианты

    Вариант для С++ -- диапазон между итераторами, работает с любыми контейнерами.
    Ответ написан
    Комментировать
  • Как число с плавающей точкой преобразовать в half float в 16 формат?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как можно уместить 1.7754 в 3f 1a?

    0x3f 0x1a -- это знак == 0, порядок == 0xf, мантисса == 0x31a. Нормализованное значение мантиссы == 1 + 0x31a / 1024 = 1.7754. Порядок 0xf после вычитания bias == 15 превращается в 0, что соответствует множителю 1. Всё.

    Как число с плавающей точкой преобразовать в half float в 16 формат

    Примерно так:
    0) обработать специальные случаи (например 0 представляется как 0).
    1) взять модуль, запомнить знак исходного числа.
    2) нормализовать, т.е выделить множитель вида 2^N, чтобы осталась нормализованная мантисса в диапазоне [1, 2). К N прибавить 15 -- это значение порядка.
    3) отнять 1 от нормализованной мантиссы, результат умножить на 1024 -- это значение мантиссы float16.
    4) сдвинуть значение порядка влево на 10, сделать побитовое или с мантиссой float16, установить старший бит, если число было отрицательным.

    Для -3.4805 получаем:
    3.4805 = 2^1 * 1.7402 ; N = 1, M = 1024 * 0.7402 = 0x2f6 ;
    0x8000 | ((1 + 15) << 10) | 0x2f6 = 0x8000 | 0x4000 | 0x2f6 = 0xc2f6
    Ответ написан
    1 комментарий
  • Как отсортировать элементы структуры?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В чем ошибка?

    if (miderate[i] > miderate[i + 1]) {
            swap (records[i].name, records[i + 1].name);
            swap (records[i].group, records[i + 1].group);
            swap(records[i].marks, records[i + 1].marks);
          }

    В том что ты сравниваешь средние оценки, но не переставляешь их.

    И к тому же, можно писать просто swap(records[i], records[i + 1]).
    И к тому же, можно сортировать с помощью std::sort
    Ответ написан
    3 комментария