• Как исправить ошибку в программе на С++, чтобы не вызывалось необработанное исключение или кнопка останова?

    @dima20155
    you don't choose c++. It chooses you
    Вообще вы написали лишь часть вопроса. А как ругается? Если ругается компилятор, то это никак не необработанное исключение, которые вылетает в рантайме. Напишите как ругается компилятор, какое у вас исключение.
    1. Ошибка компилятора.
    Возможно, компилятор ругается (особенно, если включен флаг -Werror) на бессмысленность данного if потому что оно всегда ложно.

    Я бы заменил код вывода в поток чем-то таким. Текста чуть больше, зато никаких if внутри цикла:
    std::ostream& operator<<(std::ostream& os, const Vector& vec) {
        os << "(";
        if (vec.size) {
            for (int i = 0; i < vec.size - 1; i++) {
                os << vec.coord[i];
            }
            os << vec.coord[vec.size - 1]; // последний элемент
        } else {
           os << "Unfortunately I'm an empty vector";
        }
        os << ")";
        return os;
    }

    2. На счет исключений:
    Исключения нужно ловить и обрабатывать или не допускать (зависит от архитектуры). Необработанное исключение говорит о том, что ваша программа работает не отрабатывает корректно во всех возможных ситуациях, поскольку зачастую никто не хочет, чтобы программа завершалась ошибкой внезапно, в худшем случае вы должны хотя бы оповестить пользователя о том что произошло. Самый простой способ получить исключение - поделить на 0 число с фиксированной точностью.
    Ответ написан
    Комментировать
  • Как правильно округлять числа меньше нуля?

    @dima20155
    you don't choose c++. It chooses you
    Ответ написан
    Комментировать
  • Берут ли вап вап?

    @dima20155
    you don't choose c++. It chooses you
    Иногда мне кажется, что у части моих колег ОКР)
    А, если серьезно, первостепенны ваши навыки в любой компании. Если ваши заболевания не влияют на коммуникацию с коллегами и эффективное выполнение задач, то не очень то важно есть они у какие-либо заболевания или нет. Даже, если ваши навыки влияют могут повлиять, например, на работу с коллегами, но вы умеете это правильно менеджить, то шансы на успех высоки.
    К тому же IT компании, работающее на глобальный рынок хотят/вынужденны придерживаться западных ценностей с их иклюзивностью.
    Ответ написан
    2 комментария
  • Как исправить ошибку Error LNK2019 unresolved external symbol... при вызове функции из сторонней библиотеки?

    @dima20155
    you don't choose c++. It chooses you
    У вас ошибка связана и с header файлом. Добавьте и его сюда.
    Пока вы его код, полагаю у вас проблема с линковкой библиотечных файлов.
    Ответ написан
    Комментировать
  • Как исправить текст с разорванными предложениями?

    @dima20155
    you don't choose c++. It chooses you
    Было бы здорово, если бы вы распечатали строку в виде байт и приложили.
    Полагаю, что распознается текст вместе с символами переноса строки '\n'.
    А вы хотите определенным образом их удалить у части текста.

    Думаю, для вашей можно использовать следующую логику: идти по строке и удалять все символы переноса строки пока не встретите точку. или двоеточие (в вашем случае).
    Ответ написан
    Комментировать
  • Защита переменных?

    @dima20155
    you don't choose c++. It chooses you
    На английском эти ключевые слова (public, private, protected) называются Access specifiers.
    https://en.cppreference.com/w/cpp/language/access
    Думаю, становится очевидным для чего они из названия.

    Если вы хотите скрыть значения от программи по типу Art Money (которая просто сканирует RAM), то вам нужно, каким-либо образом их зашифровать воспрепятствовать простому способу чтения вашей переменной из памяти.

    Например, вы можете хранить не сами значения, а их хеш или, например, хранить их с определенным смещением (скажем, денег у вас в игре 100, а в переменной у вас хранится на 5x + 7 денег больше, просто чтобы запутать тех, кто захочет вас взломать). Можете также преобразовать число в строку и как-то хитро изменить (например реверсировать). Все эти способы несколько усложнят прямое чтение переменной из памяти, основываясь лишь на значении в GUI. Но вот ничто не мешает реверс-инженеру пойти и посмотреть что у вас сейчас на вершине стека сейчас у вашего процесса и таким образом понять где искать саму переменную, которая хранит количество денег в игре. Это, конечно же, в разы сложнее и снизит количество людей, которые смогу "взломать" вашу программу с помощью ArtMoney.

    Чтобы ещё сильнее усложнить жизнь взломщикам можно вовсе вынести значение переменной из памяти (то есть копия значения у вас в памяти все ещё есть, но вот увеличение/уменьшение значения переменной происходит через посредника, например, сервер, базу данных, файл, subprocess. Возможно, прожженные игроделы подскажут и более простые/интересные способы.
    Ответ написан
    Комментировать
  • Стоит ли идти в Embedded разработку?

    @dima20155
    you don't choose c++. It chooses you
    Диагонально прочитал статью и хочу сказать, что с частью пунктов соглашусь, но, не абсолюнто со всем.
    Прежде всего задайте себе вопрос а чего вы хотите? Что вам интересно?
    Действительно написание ПО под MCU требует понимание (в основном, цифровой) электроники. Например, классические цифровые интерфейсы передачи данных (UART, I2C, SPI) это прямой мостик между знаниями software и hardware и хороший embedder должен понимать как эти протоколы работают и куда ткнуть осцилограф/логический анализатор, чтобы понять что не так.

    Помимо описанного выше есть более hardcore уровень - программирование под embedded Linux. В ситуации, когда вам не хватает ресурсов MCU для, например, проигрывания высококачественного звука, считывания изображений с камер, а также все ещё нужно управлять сигналами на плате напрямую, то ваш выбор это embedded Linux и так далее. Тут опять же много чистого С.

    Есть и третья известная мне сфера для embedded разработчиков (которая также не лишена славы). Компании, занимающиеся разработкой CPU, MCU и иных цифровых/цифроаналоговых микросхем. Да, вам покажется, что это только про Intel, AMD, Samsung, Huawei. Но даже в РФ минимум с пол десятка компаний, которые занимаются подобными разработками и активно нанимают людей. Все это довольно сложные и, в то же время, интересные темы.

    Как вы догадываетесь, для каждого из трех пунктов нужны немного разные знания (хотя базовое образование, в основном, требуется одно и тоже). Также для 2 и 3 пункта ваше физическое присуствие на рабочем месте, вряд ли, потребуется, ровно как и лезть руками что-то паять (просто потому что руками в этих областях уже никто не паяет). Обычно, для embedded из 1 абзаца, требуется больше работы с железом, но и тут есть вариации.

    P.S. Лично мне несколько наскучило копаться с железками (а их проектирование - это моя магистерская работа)) и отлаживать низкоуровневые интерфейсы и код, поэтому я и сам немного свернул с этой embedded дорожки, но я занимался только тем, что описано в 1 пункте и совсем немного из 2 (к слову оба успел поработать и оффлайн и онлайн). Найти работу с моим опытом не было особо сложно, так что embedded не приговор: разонравилось вполне сможете перейти в С++/Rust было бы желание.
    P.S.S. Извиняюсь, что получилось немного скомкано, спрашивайте, могу рассказать про свой опыт подробнее.
    Ответ написан
    4 комментария
  • Как можно передать структуру в printf, а к переменным её обращаться из шаблона?

    @dima20155
    you don't choose c++. It chooses you
    Если вы хотите выводить элементы структуры, то пусть самурая - переопределить
    operator<<
    примерно так:
    std::ostream operator<<(std::ostream& os, const S1& s) {
        os << "s.a: " << s.a << ", s.b: " << s.b;
    }


    Шаблон вам здесь не пригодится, поскольку только ваша структура содержит поля a и b.
    Любой другой класс/структура содержит другие поля, а соответственно, данная шаблонная функция вызовет ошибку компиляции для них из-за отсутствия соответствующих полей.

    Шаблоны полезны там, где есть общий интерфейс, например, можно написать шаблонную функцию, которая проходится по контейнеру и выводит его значения (поскольку многие STL контейнеры итерируемы и этот функционал имеет единый интерфейс)
    Ответ написан
    Комментировать
  • Почему не работает метод clone для класса Test1?

    @dima20155
    you don't choose c++. It chooses you
    В почему это
    Test1 asd = v[1]->clone();
    Должно работать?
    В лучшем случае можно заставить работать такой код.
    Test asd = *v[1]->clone();

    Аналогично с shared_ptr.
    Вы фактически возвращаете указатель на Тест, а не Тест1 (в реализации Тест1 вы создайте умный указатель на Тест1, но возвращаемый тип - умный указатель на Тест, отсюда и все проблемы. Если вы уверены, что в этом векторе лежит именно Тест1, то либо dynamic каст (что лучше) либо reinterpret (что хуже, но иногда тоже можно) делайте.

    Не очень понимаю зачем вам в принципе этот метод клон нужен, чем вас не устроил копирующий конструктор?
    Ответ написан
    Комментировать
  • List убирает string значения из класса, что делать?

    @dima20155
    you don't choose c++. It chooses you
    Во-первых, зачем вы приводите целый исходник сюда. Люди куда быстрее поймут суть, если вы сократите иерархию классов до демонстративного минимума.

    Во-вторых, во всех ваших case'ах
    Создается временный объект, затем вы зачем-то создаете ещё и временную переменную-указатель и сохраняете его адрес (зачем?). А после запихиваете все это в лист. Объект создается на стеке и при выходе за границы фигурных скобок вызывается деструктор и он перестает существовать, а все его содержимое будет перезаписано любой следующей переменной, размешенной на стеке. Вот код, о котором я говорю:
    case 1: {
          cout << endl << "Введите модель:";
          cin >> model;
          cout << endl << "Введите прозводителя:";
          cin >> producer;
          cout << endl << "Введите цену:";
          cin >> price;
          cout << endl << "Введите год выхода:";
          cin >> year;
          Appliances appliances{ model,producer,price,year };
          Appliances* pb = &appliances;
          catalog.push_back(pb);
          break;
        }


    Вот наглядный пример того что у вас получается.
    https://godbolt.org/z/bx5Wbo1bG

    Как исправить? Создавайте элемент в куче (new OhMyClass()). А лучше храните в std::list, например, std::unque_ptr
    Ответ написан
    2 комментария
  • Как создать шаблон структуры, которая будет принимать базовые типы данных и класс vector?

    @dima20155
    you don't choose c++. It chooses you
    Можно использовать перегрузку оператора <<
    Можно использовать новомодный std::input_or_output_iterator или if constexpr
    или вовсе явно специализировать/перегрузить шаблон для нужного вам типа.

    Вот один из простейших вариантов. Просто добавьте перед функцией main.
    template <typename T>
    std::ostream& operator<<(std::ostream &os, const S<T>& s)
    {
        if constexpr (std::ranges::range<T>) {
            const auto& val = s.GetVal();
            for (const auto& i : s.GetVal()) {
                os << i << " ";
            }
        } else {
            os << s.GetVal();
        }
        return os;
    }


    Все ещё не универсально, поскольку работает не со всеми контейнерами, а только с теми, которые хранят значения и могут в range_base loop

    В таком случае вам больше не нужны функции (если они использовались лишь для вывода информации в консоль)

    PrintVal
    PrintVector
    GetVector

    Можно даже избавиться от GetVal, если вам не нужен этот геттер в остальном коде, тогда нужно просто подружить функцию с классом.
    Ответ написан
    4 комментария
  • Не открывается exe файл после компиляции gcc. Что делать?

    @dima20155
    you don't choose c++. It chooses you
    Что значит не открывается?
    Если у вас приложение, которое выводит "hello world", то вы просто не успеете увидеть, результат, как оно мгновенно закрывается. Если я прав, то используйте std::getchar(); (или её С аналог) в конце.
    Ответ написан
    2 комментария
  • Как получить адрес памяти переменной в массиве, а не адрес индекса массива?

    @dima20155
    you don't choose c++. It chooses you
    Вопрос а что такое Figure?
    Указатель на базовый класс? тогда у вас в массиве уже лежат указатели, посмотрите их значения.
    Массив ссылок запрещен.
    Массив объектов типа MyClass? Как и простой массив int они лежат последовательно в памяти, т.е. их адресс это адресс 0 элемента массива соответствующим с смещением.
    Ответ написан
    Комментировать
  • Как сделать динамическую подгрузку кода?

    @dima20155
    you don't choose c++. It chooses you
    Мне кажется, вам лучше сформулировать более конкретно ваши задачи, возможно, уже есть готовое решение для вас.
    Помимо перечисленного выше, есть интерпретаторы языка С++ (которые, конечно, так себе, но попробовать их можно), а возможно, вам для вашей цели может быть полезным grpc.
    Ответ написан
    2 комментария
  • Почему выдает ошибку TypeError?

    @dima20155
    you don't choose c++. It chooses you
    У вас функция принимает 1 аргумент.
    Вы вызываете ее без аргументов вот и проблема.
    Судя по вашей логике вам нужно заменить

    def make_negative( number ):
    На
    def make_negative():
    Ответ написан
    1 комментарий
  • Как работать с большими числами в C++?

    @dima20155
    you don't choose c++. It chooses you
    https://faheel.github.io/BigInt/
    https://github.com/Mariotti94/BigFloat
    и аналогичные либы.
    Для не слишком больших есть Quadruple(128) и Octuple(256) типы.
    https://en.wikipedia.org/wiki/Quadruple-precision_...
    Внутри, естественно, массивы.

    Думаю, проще брать сразу BigFloat и не мучаться с 128/256 битными float'ами
    Ответ написан
    Комментировать
  • ++i быстрее чем i++?

    @dima20155
    you don't choose c++. It chooses you
    ++i инкрементирует и возвращает ссылку на переменную i.
    i++ создает временную переменную и сохраняет в неё текущее значение, инкрементирует значение переменной i, возвращает временную переменную.

    Как видно у нас тут есть лишнее действие с переменной.
    Но если вы просто напишите
    ++i;
    i++;
    то компилятор достаточно умный, чтобы понять, что можно заменить одну инструкцию на другую.

    Написал код, который подтверждает мои слова:
    https://godbolt.org/z/GvMejj1bd
    Смотрите именно вывод ассмеблер.
    Для удобства чтения разделил все nop инструкциями
    Ответ написан
    Комментировать
  • Почему код из книги Эрика Метиза «Изучаем Python» не работает?

    @dima20155
    you don't choose c++. It chooses you
    С вашим форматированием сложно сказать что у вас происходит.

    Но код 100% рабочий
    def get_formatted_name(first_name, last_name):
        """Return a full name, neatly formatted."""
        full_name = f"{first_name} {last_name}"
        return full_name.title()
    
    while True:
        print("\nPlease tell me your name:")
        print("(enter 'q' at any time to quit)")
        f_name = input("First name: ")
        if f_name == 'q':
            break
        l_name = input("Last name: ")
        if l_name == 'q':
            break
        formatted_name = get_formatted_name(f_name, l_name)
        print(f"\nHello, {formatted_name}!")


    Output:
    Please tell me your name:
    (enter 'q' at any time to quit)
    First name: Boris
    Last name: Rad
    Hello, Boris Rad!
    
    Please tell me your name:
    (enter 'q' at any time to quit)
    First name: q


    Вероятно, вы не добавили отступы для последних двух строк:
    formatted_name = get_formatted_name(f_name, l_name)
    print(f"\nHello, {formatted_name}!")
    Ответ написан
    1 комментарий
  • Как сократить строку?

    @dima20155
    you don't choose c++. It chooses you
    Выигрыл в читаемости чуть-чуть и в скорости также должен быть прирост.

    text = "Hello world hi mir"
    new_text = ' '.join(text.split(' ')[1:]).strip()
    print(f'"{new_text}"') # "world hi mir"
    
    another_new_text = text[text.find(' ')+1:]
    print(f'"{another_new_text}"') # "world hi mir"


    А итоговый код можно записать так:
    path = glob.glob(fr'{get_script_directory()}\gifs\{msg.text[text.find(" ")+1:]}".*"')[0])
    Ответ написан