• Как создать новый поток внутри метода класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В документации есть пример:
    std::thread t5(&foo::bar, &f); // t5 runs foo::bar() on object f


    У вас надо cделать: std::thread t5(&A::Zoom, this);
    Ответ написан
    Комментировать
  • Почему появляется такая ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    что тут неправильно?

    для однозначного ответа на этот вопрос не хватает определения типа Student.
    Но судя по тому как всё падает, в Student есть не-POD поля, выделяющие и освобождающие память, например std::string или что-то типа того. Загружать их из файла просто читая записанное ранее содержимое памяти нельзя, потому что загруженные указатели будут ссылаться на невыделенную память, такие типы данных нужно по-честному сериализовывать.
    Ответ написан
    Комментировать
  • Как исправить ошибочную генерацию чисел?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    int a[10];
    12 -ввел пользователь
    Ответ написан
    Комментировать
  • Можно ли в приложении создать кнопку выбора последнего выбранного файла?

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

    sheerluck
    @sheerluck
    Ну есть несколько способов.
    Первый способ: считать эту строку набором байт и получится громадное целое число.
    Второй способ: прочитать английский текст и уловить, что там написано "7 October 2005" и можно считать это датой. Дату в целое можно десятью способами перевести.
    Ответ написан
    Комментировать
  • Как можно генерировать рандомные числа в диапазоне от 0 до 20 заданное количество раз от пользователя? И возможно ли записать результат в файл?

    sheerluck
    @sheerluck
    #include <random>
    #include <iostream>
    
    int GetRandomNumber(int min, int max)
    {
        auto rnd = std::random_device{};
        auto gen = std::mt19937_64{rnd()};
        auto dis = std::uniform_int_distribution<int>{min, max};
        return dis(gen);
    }
    
    int main()
    {
        auto number = GetRandomNumber(0, 20);
        std::cout << "number = " << number << '\n';
    }
    Ответ написан
    3 комментария
  • Как переделать код под ООП?

    mayton2019
    @mayton2019
    Bigdata Engineer
    ООП предполагает что в задаче есть некая сущность. Объект. И у него должны быть методы. Что происходит в данной задаче? Пользователь вводит x, потом размер массива. Потом сам массив. После этого делаются какие-то манипуляции с массивом. И после этого массив распечатывается на экран. Где тут ООП? Я не знаю! Я чорт возьми не пойму где здесь ООП.

    Вобщем скажи своему преподавателю что здесь нет смысла вводить ООП. Код достаточно хорош и концептуален в том виде как он записан. И надо не забывать про принципы KISS/YAGNI которые никто не отменял.
    Ответ написан
    Комментировать
  • Как создать диапазон чисел в массиве от -0.1 к 0.2,используя float и после ShellSort?

    sheerluck
    @sheerluck
    #include <random>
    #include <iostream>
    
    int main()
    {
        auto n = 9;
        auto rnd = std::random_device{};
        auto gen = std::mt19937_64{rnd()};
        auto dis = std::uniform_real_distribution<double>{-0.1, 0.2};
        auto res = std::vector<double>{};
        std::generate_n(
            std::inserter(res, std::end(res)),
            n,
            [&](){ return dis(gen); }); 
    
        for (const auto& elem: res)
        {
            std::cout << elem << '\n';
        }
    }
    Ответ написан
    Комментировать
  • Как исправить ошибку error: invalid type argument of unary ‘*’?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Если вы разыменовываете указатель, то там должна быть точка вместо стрелочки (и скобки вокруг *s). Если вы хотите использовать ->, то вам не надо разыменовывать указатель.
    Ответ написан
    Комментировать
  • Как узнать место пересечения луча со сферой?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Тривиально: парметризуйте луч, подставьте в уравнение сферы, решите получившееся квадратное уравнение.

    Луч:
    x = x0 + t*vx
    y = y0 + t*vy    (1)
    z = z0 + t*zy

    Где (x0,y0,z0) - начало луча (камера?), (vx, vy, vz) - направление луча.

    Уравнение сферы:
    (x-xs)**2 + (y-ys)**2 + (z-zs)**2 = R**2 (2)

    Где (xs, ys, zs) -центр сферы, R - радиус.

    Подставьте (1) в (2) - получите квадратное уравнение на t. Решите его по школьной формуле и возьмите минимальное положительное t. Подставьте в (1) и получите координаты точки пересечения (и заодно длину луча, если вектор направления нормализован).
    Ответ написан
    7 комментариев
  • Почему delete вызывает ошибку?

    Adamos
    @Adamos
    Главная ошибка - в нашей системе образования,где одни мудаки накропали методичек с использованием массивов и сишных строк в С++, а другие учат по ним третьих, и конца этому не видно.
    Хотя в этом коде достаточно было бы использовать string везде вместо char* - и при этом всем было бы легче: и ТС, и проверяющему, и компилятору... и никаких утечек с UB.
    Ответ написан
    Комментировать
  • Как работает определение дружественной функции внутри класса?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Перегрузка большинства операторов может быть произведена любым из двух способов: внешней функцией или методом класса. Лишь некоторые операторы невозможно перегрузить в виде внешней функции, их перегрузка осуществляется только в виде метода класса.
    Иными словами, все операторы можно перегрузить в виде метода и только некоторые - в виде внешней функции.
    Разница между перегрузкой в виде внешней функции и перегрузкой в виде метода состоит в том, что метод является частью интерфейса класса и имеет доступ к его непубличным объявлениям, а внешняя функция частью интерфейса не является и доступ имеет только к публичным объявлениям класса.

    Дружественность к перегрузке операторов не имеет никакого отношения. Перегрузка оператора в виде внешней функции и добавление дружественности для этой перегрузки выглядит как признак незнания стандарта в плане перегрузки операторов. Потому что в этом случае перегрузку нужно проводить в виде метода.
    Исключением являться может только определение перегрузки оператора по месту объявления дружественности. Я уже объяснял почему это может быть удобно.
    Такая перегрузка становится только ADL-доступной и не может быть вызвана через полную квалификацию имени.

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

    Это не так. У тебя неверное понимание. Наверное ты уже подзабыл мое прошлое объяснение по этому вопросу. Я рекомендую повторно обратиться к тому вопросу и ответу.
    friend std::ostream& operator<<(std::ostream& os, const Object & r) {/**/ return os;}

    Тут operator << все так же остается глобальной функцией, определенной в том же пространстве имен, где определен и тип Object, но не в пространстве имен типа Object. Но, будучи определенным по месту объявления дружественности, оператор стал только ADL-доступным. Обращение к этому оператору может быть найдено только тогда, когда в конструкции std::cout << obj; этот obj имеет тип Object.

    Но почему такая же логика не работает с обычной функцией?

    Минимально, потому что операторы никак нельзя сравнивать ни с глобальными функциями, ни с методами. У операторов своя отдельная методика вызова, отличная от функций.
    friend void fOUT (void) { }, опять же, является определением по месту объявления дружественности и доступна только через ADL. Но у нее нет аргументов чтобы ADL смог найти ее при обращении. Поэтому такая конструкция является бесполезной.
    Ответ написан
    Комментировать
  • Зачем нужен отдельный синтаксис для препроцессора?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Зачем нужен отдельный синтаксис для препроцессора

    Затем, что препроцессор -- это отдельная программа с отдельным языком? Внутри препроцессируемого файла может быть что угодно, не обязательно код на С или С++. Так, например, linux препроцессирует скрипты линковщика перед тем как использовать их. И исходники написанные на ассемблере, хотя у ассемблера есть собственные макросы, директивы для включения файлов и условной компиляции.
    Ответ написан
    4 комментария
  • Как сделать простое окно Vulkan с отображением какого либо примитива?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    На gamedev.ru есть статьи по вулкану. В частности, там есть демонстрация самого минимального примера.
    На хабре есть много статей по вулкану. Среди них есть и уроки от самого начала работы, и некоторые минимальные примеры.
    У GLFW есть свои собственные материалы по работе с вулканом. А на их гитхабе есть прямо готовый пример для треугольника.
    Ответ написан
    5 комментариев
  • Как записать массив пикселей в изображение?

    15432
    @15432
    Системный программист ^_^
    Возможно, если в привычном вам формате, то следует использовать библиотеки для работы с PNG или хотя бы BMP. Создайте класс PNG картинки с нужными шириной и высотой, а затем в цикле назначьте каждому пикселю нужный цвет, после чего вызовите метод сохранения в файл.
    Конкретные имена методов будут различаться в зависимости от выбранной библиотеки для работы с изображением.
    Ответ написан
    Комментировать
  • Как отправить готовую написанную игру на другой компьютер?

    Nipheris
    @Nipheris Куратор тега C++
    Всё как и должно быть. Потому что не всегда C++ приложение можно просто так запустить на другой машине.
    На тулчейне от Microsoft (очевидно, вы используете Visual Studio для разработки, т.к. недостающие библиотеки из текста ваших ошибок - это студийный C++ рантайм) при использовании динамической линковки рантайма нужно приложить некоторые дополнительные усилия, чтобы этот рантайм появился на другой машине (т.к. его там ещё может не быть - ведь рантайм для каждой мажорной версии студийного компилятора свой). Вы можете как установить рантайм централизованно, так и положить его рядом с вашим приложением. Ну или вы можете слинковать рантайм статически.

    Задача, которую вам сейчас нужно решить, называется развёртыванием (deployment). Это абсолютно нормально, что вы столкнулись с необходимостью разобраться с этим, раз вы пользуетесь C++.

    Нет лучшего источника информации по этой задаче в рамках тулчейна Visual C++, чем вот эта страница: en/ru. Разбирайтесь, и у вас точно всё получится - абсолютно в каждом C++ проекте production-уровня эта задача решается тем или иным способом. Возможно вам потребуется дополнительно разобраться, что это вообще такое за "рантайм" и почему он требуется для работы вашего приложения.
    Ответ написан
    1 комментарий
  • Как писать код С++ на Линукс?

    @rPman
    Настоятельно рекомендую начать изучение c++ с командной строки (буквально hello world писать в текстовом редакторе и собирать, запуская вручную gcc/clang), т.е. тулчейна, затем системы сборки, make, cmake, scons (кстати это питоновские скрипты, описывающие проект) и вот после того как пощупаешь, соберешь чужие проекты, и вот тогда загляни в красивые GUI (idea/qtcreator/eclipse/...)
    Ответ написан
    Комментировать
  • Что не так с кодом,почему пишет ошибка?

    @WAR_VIK
    Вот так можно решить Вашу задачу:
    #include <iostream>
    #include <ctime>
    
    void fillRandom(int* arr, int size, int min, int max) {
        for(int i{0}; i < size; ++i) {
              arr[i] = min + (rand() % ((max - min) + 1));
        }
    }
    
    int main() {
          srand(time(NULL));
          int len{10}, min{10}, max{99};
          int array[len];
          fillRandom(array, len, min, max);
          for(int& i : array) std::cout << i <<' ';
          return 0;
    }

    Можно и по модному - через лямбду:
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <ctime>
    
    void fill_random(std::vector& v, int min, int max) {
           int i{0};
           auto lambda = [&](int index){ v[i] = min + (rand() % ((max - min) + 1)); ++i; };
           std::for_each(v.begin(), v.end(), lambda);
    }
    
    int main() {
           srand(time(NULL));
           int size{10}, min{10}, max{99};
           std::vector<int> vec(size);
           fill_random(vec, min, max);
           for(int& i : vec) std::cout << i << ' ';
           return 0;
    }
    Ответ написан
    2 комментария
  • Принёсет ли дивиденды изучение модулей С++20?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Знание определенной особенности синтаксиса языка не является основным критерием приема на работу на должность разработчика на C++, потому что оно приобретается за один (1) вечер - путем изучения учебника и реализации пары примеров из него же.
    Ответ написан
    Комментировать