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

    @res2001
    Developer, ex-admin
    Идите либо работать с тем, что умеете, там вам дадут задачи, либо учиться в универ, если еще там не были, там то же чем-нибудь нагрузят мозг.

    PS: на плюсах можно выполнять практически все прикладные задачи, гораздо больше, чем на питоне или java. Но часто трудозатраты будут выше, чем с использованием специализированных языков.
    С/С++ обычно используются там где нужна скорость, недостижимая на других ЯП, или для работы с оборудованием на низком уровне.
    Ответ написан
    Комментировать
  • Как сделать ввод русского текста через оператор std::cin нормальным и без крякозябр?

    @res2001
    Developer, ex-admin
    Если делать по уму, то вам нужно:
    1.Исходники сохранять в UTF8. Для строк и строковых констант использовать wchar_t или wstring.
    2.При старте программы узнайте кодировку консоли
    3.Перед выводом строк на экран преобразуйте ваши широкие строки в кодировку консоли и только после этого выводите. Для

    В винде 2 русских кодировки консоли: cp1251 и cp866, при чем cp866 используется по умолчанию. Менять кодировку консоли можно из самой консоли командой chcp. Менять кодировку консоли из программы - дурной тон.
    Пример конвертации с помощью WinAPI можете посмотреть тут.
    Ответ написан
    3 комментария
  • Как определить, что утекает память? Как получить размер памяти, занимаемой экземпляром класса?

    @res2001
    Developer, ex-admin
    1.Кроме бесплатного valgrind, есть еще intel vtune работает на порядок быстрее, но стоит денег.
    2.sizeof(). Но он выдаст размер только внутренних членов данных класса. Если у вас в классе дополнительно выделяется динамическая память, то sizeof это не учтет. Кроме вас никто не знает сколько памяти жрет класс и как ее правильно посчитать.
    Ответ написан
  • C++ ошибка при выполнении программы, как ее исправить?

    @res2001
    Developer, ex-admin
    Из-за того что в первом и втором цикле условия разные, у вас выделяется массив строк (a[]) меньшего размера, чем происходит к нему обращений во втором цикле. Отсюда - выход за границы массива и сбой программы.
    Ответ написан
    Комментировать
  • Почему я не могу обработать ответ сервера?

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

    Если tcpReply() возвращает строку с завершающим нулем, то преобразовать ее в String можно просто передав ее в конструктор:
    String data(reply);
    Ответ написан
    Комментировать
  • Как sizeof вычисляет размер массива?

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

    Статический массив - это не указатель. Указатель - на этапе выполнения занимает в памяти место для хранения адреса. Статический массив занимает в памяти место для хранения данных массива.
    Поэтому статический массив - это не указатель. Хотя часто компилятор работает с именем статического массива как с указателем.
    Ответ написан
    8 комментариев
  • Как непрерывно читать данные по Serial Port?

    @res2001
    Developer, ex-admin
    Видимо нужно, что бы this->serialPort1->IsOpen постоянно была true, либо изменить условие в while().
    Ответ написан
  • Libxl: Как запустить на windows 7?

    @res2001
    Developer, ex-admin
    Укажите компилятору соответствующей опцией где искать h файлы.
    make, gcc и прочие линуксовые утилиты сборки есть в msys2/mingw.
    Ответ написан
  • В чём преимущество функций над методами контейнеров?

    @res2001
    Developer, ex-admin
    Каких-то особых преимуществ нет. Просто альтернативный вариант.
    Это шаблонная функция, может принимать любой из стандартных контейнеров std, она просто вызывает obj.size() внутри.
    Чем хотите, тем и пользуйтесь.
    https://en.cppreference.com/w/cpp/iterator/size
    Ответ написан
    Комментировать
  • Как динамически указать длину поля для вывода в printf?

    @res2001
    Developer, ex-admin
    1.Можете просто сформировать правильную Си строку, добавив в конце нулевой символ, тогда printf правильно сработает при спецификаторе формата %s.
    2.Если у вас не строка, а байтовый массив (т.е. нет завершающего нулевого символа), тогда можно следующим образом: printf("%.*s", (int)len, str)
    Ответ написан
    2 комментария
  • C++ при вводе в одно переменную меняеться вторая?

    @res2001
    Developer, ex-admin
    Похоже, что на данной платформе стек растет вниз (в сторону уменьшения адресов), поэтому введя в word
    6 символов (размер word - 5), произошел выход за пределы массива и последние 2 байта (не забываем, что строки в Си имеют еще дополнительный нулевой символ в конце) записались на соседние переменные, т.е. повредили содержащиеся в них значения.
    При этом не произошло никакого сбоя, потому что все переменные в стеке (а все пространство в стеке изначально уже выделено и к нему можно свободно обращаться). Если бы word был динамическим массивом, то скорее всего произошел бы seg fault. В отладочной версии возможно и не произошел бы.
    Си и С++ оставляет за программистом возможность управлять памятью, поэтому компилятор такие вещи не отслеживает.
    Если хотите избавиться от ошибки, используйте класс string или перепишите код так что бы не было возможности выхода за границы массива.
    Ответ написан
    5 комментариев
  • Какие макросы у линухи и винды?

    @res2001
    Developer, ex-admin
    Смотри тут.
    Ответ написан
    Комментировать
  • Как получить ссылку на объект?

    @res2001
    Developer, ex-admin
    Правильно:
    const C& c

    объект создавался оператором new, то передаётся значение указателя, а если статически то ссылка

    Нет - в любом случае передается ссылка. Если у вас есть указатель, а передать надо ссылку, то вы должны разыменовать указатель.
    Внутри функции это просто число-адрес памяти, где расположен объект?

    Лучше не заморачиваться этим вопросом. На уровне ассемблера нет никаких ссылок, поэтому по факту ссылки - это те же завуалированные указатели, у которых на уровне компилятора ограничен функционал для более безопасного использования.
    Указатель - это целое число. Размер указателя не зависит от типа, на который он указывает, зависит только от платформы (в х64 указатели 64 битные, а в х32 - 32 битные).
    Ответ написан
    Комментировать
  • Несколько вопросов по сетевому программированию в C++?

    @res2001
    Developer, ex-admin
    1. Используйте openssl, там уже все придумано за вас. Если делаете финансовое ПО для работы в РФ, то видимо потребуется ГОСТовое шифрование. Такие варианты openssl то же есть, с сертификацией и прочими плюшками, конечно не бесплатно.
    2.Тут трудно что-то сказать не зная специфики задач, которые вы будете решать.
    В общем случае, поток на соединение - если соединений относительно не много; иначе - асинхронный ввод/вывод. Но могут быть и другие факторы, влияющие на выбор архитектуры.
    В асинхронном варианте сам ввод/вывод можно делать в одном потоке, а для обработки держать пул потоков обработчиков. Задания от потока ввода/вывода к обработчикам передавать через очередь, результаты аналогично.
    Ответ написан
    Комментировать
  • Как убрать ошибку с загрузкой компонентов Visual C++ VCBuild.exe?

    @res2001
    Developer, ex-admin
    Установите VS2005 и запускайте сборку из консоли студии, а не из обычного cmd: ссылка на консоль должна быть в меню Пуск в папке со студией.
    Ответ написан
  • Как получить hmodule ресурса?

    @res2001
    Developer, ex-admin
    Надергал из своего старого проекта вызовов для чтения ресурса.
    Правда у меня ресурсы были текстовые, но суть от этого не меняется.
    HMODULE hModule = GetModuleHandle(NULL);
    HRSRC hResInfo = FindResourceA(hModule, MAKEINTRESOURCEA(IDR_README1), MAKEINTRESOURCEA(READMETXT));
    HGLOBAL hResource = LoadResource(hModule, hResInfo);
    DWORD nSize = SizeofResource(hModule, hResInfo);
    LPVOID resource = LockResource(hResource);

    После LockResource получаете указатель на байтовый массив вашего ресурса, дальше делайте с ним что хотите.
    В примере IDR_README1 и READMETXT - идентификатор ресурса из rc файла.
    Вызовы расположены в реальном порядке, как есть в проекте.
    Ответ написан
    Комментировать
  • Можете посоветовать IDE под C/C++ как CLion (с возможностью подключения MinGW) под 32 бита (x86)?

    @res2001
    Developer, ex-admin
    Eclipse CDT
    Ответ написан
    Комментировать
  • Как найти пустые(не занятые) элементы в char массиве?

    @res2001
    Developer, ex-admin
    Копировать Си строки можно с помощью strcpy() или других аналогичных функций - она скопирует только значимые элементы строкового буфера, включая завершающий символ '\0'.
    Ответ написан