Ответы пользователя по тегу C++
  • C++ Как сделать постоянный вывод, и только тогда, пользователь что-то выполнить ввод в цикле?

    gdt
    @gdt
    Программист
    Вы не указали операционную систему. Если у вас linux (или что-то подобное) - вот тут есть решение при помощи select.

    В общем случае вы можете запустить отдельный поток, который в цикле выводит то, что вам нужно, и проверяет был ли установлен ивент (WaitForSingleObject, с таймаутом 0). В главном потоке создаёте ивент (CreateEvent), ждёте как обычно _getch, когда символ введён - используете SetEvent чтобы сигнализировать об этом второму потоку, также есть функция ResetEvent - чтобы сбросить ивент после обработки (чтобы можно было в цикле после следующего введённого символа его ещё раз установить). Это уже для windows.

    Ну и да, _getch это ни разу не C++, а голый C.
    Ответ написан
    Комментировать
  • Ссылка на неразрешённый внешний символ, что это и как исправить?

    gdt
    @gdt
    Программист
    Так в виде каких ошибок проблема? Вы приложили сам код меню в качестве ошибок :)
    Посмотрите SFML and Visual Studio, у вас правильно настроен проект? В частности, обратите внимание на Configuration Properties/Linker/Input/Additional Dependencies, у вас там должны быть указаны либы SFML. Как вариант, вместо этого в VS можно писать и так:
    #pragma comment(lib, "sfml-graphics.lib")
    #pragma comment(lib, "sfml-window.lib")
    #pragma comment(lib, "sfml-system.lib")


    Добавьте этот код между #include и main, попробуйте ещё раз.
    Ссылка на неразрешённый внешний символ означает, что вы где-то в коде используете какую-то сущность, для которой есть описание (обычно в header файле, иначе бы у вас ничего не скомпилировалось), а линкер в свою очередь не может найти, где же сама сущность (класс/функция например) с таким описанием. Эти сущности в вашем случае определены в lib-файлах, и они должны быть переданы линкеру сразу после компиляции, чтобы он мог собрать рабочую программу из тех кусков, что у него есть (ваша_программа.obj, lib-файлы из SFML, crt и так далее).
    Ответ написан
  • Как удалить объект объявленный в функции?

    gdt
    @gdt
    Программист
    В общем с ходу можно предположить два варианта, простой и правильный.
    Простой вариант - исходя из вашего когда, вам не нужно удалять output. Заведите в main новую переменную для результата, и удаляйте её в конце метода main:
    const auto* test2 = testMatrix->mulVec(test);
    delete test2;


    Правильный вариант заключается в том, чтобы по возможности вообще никогда не использовать сырые указатели. Т. е. примерно так (код не проверял, что-то может быть нужно чуть-чуть по-другому написать, но основная идея такая):
    class Matrix4x4{
    public:
      float* data = new float[16];
      std::shared_ptr<Vector> mulVec(std::shared_ptr<Vector> inp){
        const auto output = std::make_shared<Vector>(...);
        /*...*/
        return output;
      }
    }
    
    int main(){
      const auto test = std::make_shared<Vector>(1, -1, 1);
      const auto testMatrix = std::make_sharedMatrix4x4>();
      const auto mulResult = testMatrix->mulVec(test);
    }


    Умный указатель сам позаботится о том, чтобы очистить память. Вместо shared_ptr можно конечно и другие указатели использовать, возможно правильно будет значение return обернуть в std::move.
    Ответ написан
    Комментировать
  • Как найти значения отдельных составных частей?

    gdt
    @gdt
    Программист
    Какую ошибку выдаёт ваш код?
    Для удобства попробуйте сначала применять маску, а потом сдвигать (если программа выводит неправильные значения):
    s = (UnitStateWord & 0xD000) >> 13;
    d = (UnitStateWord & 0x0800) >> 11;
    f = (UnitStateWord & 0x0200) >> 9;
    b = UnitStateWord & 0x00FF;


    Также рекомендую на всякий случай сразу же после scanf вывести считанное число при помощи printf, чтобы на 100% быть уверенным что вы сдвигаете именно то что нужно.
    Ответ написан
  • Как подтянуть С++ до современного уровня?

    gdt
    @gdt
    Программист
    Найдите какой-нибудь хороший опенсорсный проект на современном C++, и попробуйте им что-нибудь законтрибьютить. Сам пару лет назад был в точно такой же ситуации, "повезло" что плюсы в проекте тоже используются, как только пришлось поддерживать - сразу научился :) Должен сказать что современный C++ это очень крутая штука.
    Книги сами по себе без практики не очень помогают.

    Вот сюда ещё загляните - https://github.com/rigtorp/awesome-modern-cpp
    Здесь можно найти такие проекты - https://awesomeopensource.com/projects/modern-cpp
    Ответ написан
    Комментировать