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

    @res2001
    Developer, ex-admin
    Можно 2 итератора. Посмотрите пример проверки на полиндром тут. Правда там строки и нет изменений контейнера.
    Ответ написан
  • OpenSSL.exe встраивание в свою программу?

    @res2001
    Developer, ex-admin
    OpenSSL.exe это клиент для libssl. Вам нужно встраивать не exe, а использовать библиотеку.
    Ответ написан
    1 комментарий
  • Как в программе работает перегрузка?

    @res2001
    Developer, ex-admin
    У вас не верно перегружен operator* - он должен возвращать объект или ссылку на объект своего класса (т.е. он должен возвращать Kvadrat&): https://en.cppreference.com/w/cpp/language/operators

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

    Для бинарных операторов вызывается перегруженная операция для класса, стоящего слева в выражении. Например для kvad * k - вызовется kvad.operator*(k).

    Если вы напишете k * kvad, то будет ошибка компиляции, т.к. компилятор не сможет преобразовать kvad во float. Но вы можете этому помочь, перегрузив operator float() для Kvadrat.
    Ответ написан
    Комментировать
  • Настройка IPSec средствами С++?

    @res2001
    Developer, ex-admin
    Какая ОС интересует? IPSec входит в стандарт стека TCP/IP, который предоставляется ОС. Соответственно и все API ОС зависимое.
    В винде это WFP API.
    В никсах все несколько сложнее - там задействовано как ядро ОС так и стороннее ПО. Больше подробностей можете посмотреть, например тут и тут.
    Ответ написан
    2 комментария
  • Как вывести данные в таблицу с 4 столбцами?

    @res2001
    Developer, ex-admin
    for (char I = 'A', i = 'a'; I <= 'Z'; ++I, ++i) {
            cout << setw(54) << " | " << setw(4) << I << " | " << setw(13) << static_cast<int>(I) << " | ";
            cout << setw(4) << i << " | " << setw(13) << static_cast<int>(i) << " | " << endl;
    }
    Ответ написан
    Комментировать
  • Линковка с библиотекой C++?

    @res2001
    Developer, ex-admin
    mmsystem.h и winmm.lib - это стандартные виндовый заголовочный файл и библиотека, предоставляется вместе с Windows SDK, который входит в состав Visual Studio. mmsystem.h в студии доступен изначально, просто используете его в #include, копировать его в свой проект не нужно. winmm.lib то же доступен, но его надо подключить к проекту - опция -lwinmm.lib компилятора или задать в свойствах проекта как дополнительную используемую библиотеку, если используете IDE. По умолчанию она не подключена.

    Вообще для подключения сторонних библиотек к любому С/С++ проекту надо:
    1.добавить путь где лежать заголовочные файлы библиотеки опцией -I<path header files> в команду запуска компилятора.
    2.добавить путь где лежат lib файлы (lib для msvc) библиотеки в опцию -L<path to lib files>. Если библиотечный файл один, то этот пункт можно пропустить и задать полный путь в п.3. Если файлов несколько, то проще задать путь к каталогу в опции -L, а в п.3 указывать только имя конкретного файла библиотеки.
    3.добавить имя файла библиотеки (lib файла) в опцию -l<lib name> или полный путь к lib файлу.

    Если вы собираете из IDE, то те же действия надо проделать в настройках проекта. Опции компилятора практически универсальны - те же опции (и аналогичный подход) используются в msvc, gcc, clang и других компиляторах.
    По сборке библиотек с Qt проектом:
    В pro файле:
    переменная LIBS - задаются опции -L и -l компилятора (п.2 и п.3)
    переменная INCLUDEPATH - задаются опции -I компилятора (п.1)
    Например:
    INCLUDEPATH += -Ipath/to/header/files
    LIBS += -Lpath/to/lib/files -lmylibfile

    Это все легко гуглится.
    Ответ написан
    Комментировать
  • Как составить программу чтобы определить симметричность одномерного массива из k элементов?

    @res2001
    Developer, ex-admin
    Примерно так же как и определение палиндромов из этого примера (смотрите пример в конце). Нужно только заменить строки на вектора.
    Ответ написан
    Комментировать
  • Что не так с кодом? Как правильно делать?

    @res2001
    Developer, ex-admin
    Кодировка консоли в винде по умолчанию cp866 (а не 1251 как многие думают). Но можно переключить.
    Для простоты сохраните ваши исходники в 866 кодировке.
    setlocale работает только на вывод. Для ввода используйте cout.imbue.

    Переключать кодировку консоли из утилиты - дурной тон. Для студенческой лабы это еще терпимо, но нормальная русская консольная утилита должна уметь правильно выводить текст не зависимо от того какая кодировка установлена в консоли 866 или 1251. Например, почти все родные виндовые консольные утилиты с этим справляются успешно.

    По уму делать примерно по следующей схеме:
    1.Исходники в UTF8
    2.Все строковые константы с префиксом L"string"
    3.Строки хранить в wchar_t
    4.Определять кодировку консоли для ввода и вывода и перекодировать свои юникодные строки в нужную кодировку и только потом выводить или после ввода перекодировать в UTF8. Для перекодирования в WinAPI все есть, но без windows.h не обойтись.
    Ответ написан
    Комментировать
  • Что значит "написанная на чистом C++"?

    @res2001
    Developer, ex-admin
    Когда говорят подобную фразу применительно к Си, обычно имеют ввиду программу, написанную на Си без дополнительных зависимостей, в т.ч. и без зависимостей от стандартной библиотеки, т.е. Си и ОС.
    Предполагаю, что и в случае с С++ именно это имеется в виду.
    Ответ написан
    Комментировать
  • Массив не передается полностью в функцию потока. Объясните в чем проблема?

    @res2001
    Developer, ex-admin
    Выход за границу массива тут:
    for(int i=0;i<s->m;i++){
    ...
       s->secondSortedArray[i]=num;
    }

    У вас количество элементов в обоих массивах 4, а m вы инициализируете 5. При последнем присваивании secondSortedArray происходит выход за границу массива, а т.к. после secondSortedArray в структуре идет m, то m у вас заменяется последним рандомным значением.
    В firstSortedArray то же есть выход за границу массива, но это не носит деструктивных последствий.
    Подобные вещи часто приводят к краху программы. Вы могли бы это отловить в отладчике. Пользуйтесь им. Отладчик - друг программиста! :-)
    Ответ написан
    4 комментария
  • Можно ли вывести список enum?

    @res2001
    Developer, ex-admin
    Можно с помощью такого Сишного подхода:
    // .h файл
    #define ENUM_MAP(XX) \
      XX(0, laborer, Laborer help msg) \
      XX(1, secretary, Secretary help msg)\
      XX(2, manager, Manager help msg)\
      XX(3, accountant, Accountant help msg)\
      XX(4, executive, Executive help msg)\
      XX(5, researcher, Resercher help msg)
    
    enum etype
    {
    #define XX(num, name, string) name = num,
      ENUM_MAP(XX)
    #undef XX
     };
    
    // .cpp файл, включающий предыдущий .h
    #define XX(num, name, string) #string,
    const char * enum_msg[] = [
      ENUM_MAP(XX)
    ]
    #undef XX

    Такими образом имеем массив enum_msg со строками из третьего параметра XX в ENUM_MAP.
    Набор параметров в XX можно варьировать как угодно.
    Подобная техника применяется, например, тут.
    Ответ написан
    Комментировать
  • В чем ошибка (работа с памятью, деструкторы)?

    @res2001
    Developer, ex-admin
    delete[] _coords;
    В таком виде в Dist создаются копии объектов с помощью конструктора копирования по умолчанию, т.е. просто побайтовое копирование. После завершения Dist память под coords в копиях освобождается. Когда завершается main() та же самая память будет освобождена еще раз, что приведет к ошибке.
    Поэтому в Dist передавайте ссылки!
    Ответ написан
    Комментировать
  • Кто может помочь с кодом visual?

    @res2001
    Developer, ex-admin
    Возможно в CRC.h (или где-то еще) объявлены функции возвращающими int, а в реализации они возвращают DWORD.
    Ответ написан
    Комментировать
  • Как сделать грамотную декомпозицию ООП?

    @res2001
    Developer, ex-admin
    Стек, конечно, можно делать и на массиве, но обычно его делают на списке.
    Для самого стека обычно хватает 1-2 структур/классов: Класс стека и класс узла стека.
    Для остальных можете придумать произвольную простейшую иерархию наследования, что бы объекты этих классов можно было укладывать в стек по ссылке/указателю на базовый класс.
    Модули это файлы:
    1. основной код - сюда запихнете main(), возможно какие-нибудь вспомогательные функции.
    2. и 3. стандартное разбиение С++ классов на заголовок (.h) и реализацию (.cpp).
    Т.к. классов не менее 5, то и заголовков и реализаций по уму делать на каждый класс, но в вашем случае можно все сложить в 2 файла. Хотя я бы сам стек выделил в отдельные "модули".
    Ответ написан
  • Оцените код. Как можно заменить goto?

    @res2001
    Developer, ex-admin
    Почитайте что-нибудь о структурном программировании.
    Что бы лучше понять методы структурного программирования, просто запретите себе использовать goto. Вы быстро с ним освоитесь, когда будете пытаться придумать способ обойтись без goto.
    Ответ написан
    Комментировать
  • Как правильно изменить размер выделенной памяти?

    @res2001
    Developer, ex-admin
    В Cи нет строк как таковых - там строка это массив байт с завершающим нулевым байтом в конце.
    А массив в Си - это указатель.
    В С++ используйте string - его для этого и придумали, чтоб не парится в каждом приложении с подобными вещами.

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

    @res2001
    Developer, ex-admin
    Вам же элементарно нужно строку сформировать.
    В цикле по массиву koef бежим:
    1.если коэффициент не 0:
    1.1.выводим сам коэффициент из массива
    1.2.Если коэффициент не последний: выводим строку "x^" + str(degree - i)
    Ответ написан
    Комментировать
  • Как собрать на linux программу на писанную на с++ без Gcc/g++?

    @res2001
    Developer, ex-admin
    Если это нужно для дистрибуции программы, то делаете свой репозиторий куда кладете предварительно собранные пакеты для поддерживаемых платформ. Репозиторий добавляете в настройки пакетного менеджера ОС и устанавливаете штатными средствами уже из репозитория.
    Ответ написан
    4 комментария
  • String или char*?

    @res2001
    Developer, ex-admin
    И какое различие между char* и char[]?

    char* str1 = "Hello world!";
    char str2[] = "Hello world!";
    Разница между str1 и str2 в том, что str1 - это lvalue, а str2 - нет.
    Т.е. с str1 вы можете, например сделать str1 = str1 + 1; а с str2 нет.

    С точки зрения памяти:
    В случае str1 в памяти хранится 2 сущности: 1) сама строка "Hello world!" 2) указатель, которому присваивается адрес строки. Поэтому вы можете присвоить другое значение указателю.
    В случае str2 указателя в памяти нет, есть только строка. Адрес строки знает компилятор и использует его когда нужно. Но присвоить новое значение этому адресу уже не возможно.
    Можно считать, что char str[]; это то же что и char * const str;
    Ответ написан
  • Что делать если линковщик ругается на "неразрешённый внешний символ"?

    @res2001
    Developer, ex-admin
    Вы подключили x64 библиотеку, а собираете x32 проект, естественно компилятору это не нравится.
    Подключите x32 версию библиотеки, или собирайте проект как x64.
    На самом деле можно делать обе версии и в каждой задать использование правильной версии библиотеки.
    Ответ написан
    2 комментария