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

    @res2001
    Developer, ex-admin
    base[ind].birth.month
    Вообще и остальные поля нужно выводить через точку.
    Кроме того, если приведенный код ch_kol() - это реально все что есть в функции, то это не верно. Вы в ch_kol возвращаете указатель на локальную переменную, как только отработает return этот указатель станет не действиетльным, т.к. массив base перестанет существовать после выхода из функции.
    Подобное определение массива baseProgr base[max];, если max не константа приводит к объявлению массива переменной длины (VLA). Строго говоря С++ не поддерживает VLA, т.к. это фишка Си. Но некоторые компиляторы (gcc) при включенных расширениях (по умолчанию включено) позволяют их использовать. Но этот код становится не переносимым, т.к. при других опциях компилятора или на другом компиляторе код может не собраться.
    Ответ написан
    4 комментария
  • Как правильно настроить кодировку для std::ifstream и std::string?

    @res2001
    Developer, ex-admin
    Используйте wstring и широкие символы вместо string и char.
    Ответ написан
    2 комментария
  • Как вызвать класс комплексное число?

    @res2001
    Developer, ex-admin
    Для получения 9+12i надо вызвать computePolynomial(), его результат вывести на экран.
    Ответ написан
  • Как создать проект с++ на основе готового кода?

    @res2001
    Developer, ex-admin
    5000 ошибок - скорее всего вы что-то делаете не так.
    Обычно к проектам прилагается хотя бы минимальная инструкция по сборке, где, обычно пишут, какой компилятор и среду использовать для сборки.
    Даже под винду далеко не все проекты используют MS Visual Studio, поэтому sln файлы совсем не обязательный аттрибут.
    Для кросс платформенных проектов, обычно используют какие-то универсильные средства для сборки, например cmake (есть еще ряд других), у которых свои правила использования.
    Все это кажется сложным, но на самом деле это не сильно сложно, можно достаточно легко "набить руку" собирая разные проекты скажем в течение месяца :-) Так что ваши 50 часов - ни о чем.
    Ответ написан
    Комментировать
  • Инкремент и декремент?

    @res2001
    Developer, ex-admin
    Постфиксный вариант используют в основном, когда очень хочется минимизировать исходный код программы - вместо двух строчек кода, написать одну.
    Реального выигрыша (кроме количества строчек исходного кода) от этого обычно нет. Но иногда становится сложнее понимать написанное.

    Префиксный вариант проще в реализации, а значит работает чуть быстрее. При большом количестве итераций в цикле это может иметь некоторое значение. В префиксном варианте нет "отложенных эффектов", из-за которых в постфиксном варианте могут возникать ошибки.
    Ответ написан
    Комментировать
  • Безопасно использовать типы atomic из Си в динамических структурах?

    @res2001
    Developer, ex-admin
    Атомарные переменные - это такие же переменные как и остальные. Инициализировать их вы можете сколько угодно раз. Это относится только к встроенным типам. Атомарные классы - это сказка.
    Но на них накладываются некоторые ограничения:
    1. выравнивание переменной - переменная должна находится по адресу обычно кратному размеру переменной. Если не будет правильного выравнивания, то intelовские процы могут сделать 2 операции чтения, что уже не будет атомарной операцией. Другие процы могут сгенерировать какое-нибудь исключение.
    2. атомарная переменная всегда volatile - т.е. компилятор не может ее кэшировать в регистре, всегда идет обращение к памяти.
    Не все атомарные переменные в std действительно атомарны. Это проверяется с помощью atomic_is_lock_free(). Атомарность зависит от платформы. Например на x86 int64 - не атомарна из-за ограничений процессора. Тогда как на 32 битных АРМах она вполне атомарна.
    При обычном чтении/записи атомарных переменных (с упорядочиванием памяти memory_order_seq_cst) происходит синхронизация кэшей ядер - из-за чего атомарные операции "дороже" не атомарных. Но этот процесс на разных архитектурах стоит по разному. Для синхронизации кэшей есть отдельные ассемблерные инструкции.

    В целом все undefined behavior для атомарных переменных в std связаны с:
    1. возможностью объявить атомарным любой класс
    2. не для всех встроенных типов на конкретной платформе гарантируется реальная атомарность (atomic_is_lock_free).
    3. если вы не будете соблюдать ограничения, то же ничего гарантировать нельзя.
    Так что особо пугаться undefined behavior не стоит. Просто соблюдайте ограничения, не используйте атомарные классы и удостоверьтесь, что встроенные типы на вашей платформе действительно атомарны.
    Ответ написан
    1 комментарий
  • Вывести вместо пробелов введенной строки его ASCII-код?

    @res2001
    Developer, ex-admin
    Просто преобразуйте символ в int и выводите.
    char a = ' ';
    std::cout << "ASCII code: " << static_cast<int>(a) << std::endl;
    Ответ написан
    1 комментарий
  • Как комбинировать несколько значений из одного enum?

    @res2001
    Developer, ex-admin
    Битовые операции можно использовать только если ваш enum состоит из значений равных степеням двойки: 1, 2, 4, 8, ...
    Если у вас произвольные значения в enum (1, 2, 3, 105, 888, ...) то битовые операции применять нельзя.
    Если нужен какой-то универсальный вариант - сделайте массив значений.
    Ответ написан
    Комментировать
  • Как можно оптимизировать код?

    @res2001
    Developer, ex-admin
    Может быть, если конвертировать число в строку и проверять строку на палиндром, будет быстрее. Не уверен, надо проверять. Только не используйте std::string, а используйте стандартный сишный массив символов.
    Ответ написан
    Комментировать
  • Вывод без использования iostream?

    @res2001
    Developer, ex-admin
    std - это внешняя библиотека. Хоть она и "стандартная", но не является неотъемлемой частью языка. Например, можно писать программу, не используя стандартную библиотеку - довольно забавное занятие. Попробуйте вывести "Hello world" или выделить буфер в динамической памяти без std .

    Поэтому необходимы почти все стандартные действия для подключения дополнительных библиотек:
    1. Включение заголовочных файлов - первое из этих действий.
    2. Второе действие - линковка с библиотекой исполняемого файла программы - выполняется по умолчанию большинством компиляторов. Наоборот для отключения линковки с std нужно указывать дополнительные ключи. Для других библиотек этот пункт нужно выполнять разработчику явно (указывать необходимые опции компилятору).

    Кроме того std довольно большая библиотека и ее полное включение по умолчанию во все исходники сильно бы увеличило время компиляции.
    Ответ написан
    Комментировать
  • Указатель или Индекс элемента?

    @res2001
    Developer, ex-admin
    имею ввиду, зачем делают так *p+1 для доступа к следующиму элементу, а не p[1]?

    Вообще то ничего общего между приведенными операциями нет (смотрите приоритет операций):
    *p+1 == (*p) + 1
    p[1] == *(p+1)


    Но вопрос в целом понятен, не взирая на ошибку в примере.
    Надо смотреть на контекст. Часто бывает, что код не ограничивается одноразовым применением p[1], а например есть целая серия обращений к p[1], в этом случае будет экономия на операциях, если вы сначала вычислите адрес p[1], а в дальнейшем будете использовать простое разыменование этого адреса. Будет ли реально выигрыш во времени исполнения зависит от компилятора, в целом думаю, современные компиляторы в состоянии сами сделать подобную оптимизацию.
    Ответ написан
    Комментировать
  • Что же такое typedef class, typedef struct?

    @res2001
    Developer, ex-admin
    Все то же самое, что и для других типов.
    Эти записи идентичны:
    typedef class ca {
    ...
    } CA;


    class ca {
    ...
    };
    typedef ca CA;
    Ответ написан
    Комментировать
  • Как правильнее будет использовать оператор if?

    @res2001
    Developer, ex-admin
    Всегда, когда это возможно, использую второй вариант - это позволяет избежать лишних фигурных скобок, а как следствие лишней вложенности, отступов и т.п., код становится более читабельный и простой.
    Но, конечно, в этом случае, в теле if должна быть передача управления куда-то (на обработчик ошибок, return и т.п.).
    Часто делаю такую конструкцию:
    do {
    ...
    if(result == error) break;
    ...
    } while(0);
    if(result == error) {
    обработка ошибок
    }

    В этом случае обработка ошибок находится в одном месте. Кроме того do..while(0) позволяет не использовать goto - вместо него используется break. Часто видел подобную схему в около системных сервисах и утилитах, но с использованием goto. У меня аллергия на goto, поэтому предпочитаю заворачивать в do..while(0).
    Ответ написан
    Комментировать
  • Как сопоставить 2 массива в цикле по ключам?

    @res2001
    Developer, ex-admin
    В массивах С++ нет ключей, там есть числовые индексы элементов от 0 до N-1.
    Ответ написан
    Комментировать
  • Как перевести ANSI в UTF-16 LE?

    @res2001
    Developer, ex-admin
    В WinAPI MultiByteToWideChar доступна для всех языков.
    Ответ написан
  • Вопрос о использовании mutex и lock_guard?

    @res2001
    Developer, ex-admin
    И получается участок кода(с создания переменной и до вызова диструктора) код будет выполняться только одним потоком?

    Как напишете, так и будет выполнятся.
    По моему не зачем зашивать lock_guard в структуру/класс, он должен быть в функции/методе тут же создаваться и удаляться максимально быстро. Если это приведет к дополнительному коду - это небольшая расплата за потокобезопасность.
    Ответ написан
    Комментировать
  • При изучении фабричного метода, увидел странную структуру, что это?

    @res2001
    Developer, ex-admin
    Публичное наследование.
    Так же может быть и приватное наследование и защищенное наследование.
    Обычно не указывается, т.к. по умолчанию оно и так публичное.
    Ответ написан
    6 комментариев
  • Что делает эта часть кода (выделено кругом)?

    @res2001
    Developer, ex-admin
    Это конструктор копирования класса myclass, принимает в параметре константную ссылку на экземпляр класса myclass. Вызывается для того, что бы создать новый экземпляр класса на основе уже существующего экземпляра этого же класса (скопировать класс).
    Подробности и примеры смотрите тут: https://en.cppreference.com/w/cpp/language/copy_co...
    Ответ написан
  • В чем ошибка в программе?

    @res2001
    Developer, ex-admin
    Реализовано не правильно, конечно.
    Но начнем с начала:
    подстановке значений переменных выходит тот же результат, что и при обычном выполнении.

    Что вы хотите этим сказать? Смысл этого заявления не понятен.
    int X; { // ввод переменной
         cout <<"X\n"; // вывод переменной на экран
        }

    В этом куске кода ввода переменной Х нет. Есть только вывод Х. Но выводится "Х", а не значение переменной. Кроме того переменная Х только объявлена, но не проинициализирована.
    Не достаточно написать в комментарии "ввод переменной", чтоб появился ввод. Надо написать инструкции ввода.
    Ну и т.д.
    Ответ написан
  • Как решается задача?

    @res2001
    Developer, ex-admin
    Идешь в цикле по годам, начиная с 2013. В цикле:
    1. вычитаешь из текущих запасов выловленные в этом году 50 т.
    2. прибавляешь к текущим запасам воспроизводство в этом году 30 т.
    3. выводишь статистику запасов
    4. если запасов стало меньше 50 т., то завершаешь цикл.
    Ответ написан
    2 комментария