Задать вопрос
Ответы пользователя по тегу C++
  • Почему не выводится ничего из функции?

    @res2001
    Developer, ex-admin
    Как минимум потому что у вас в примере N = 3, а в obrabotka() первый цикл объявлен так:
    for(k = 0; k < (N - 3); k++)
    т.е. ни одной итерации цикла при таких начальных условиях не будет.

    PS: Все остальное не проверял.
    Ответ написан
  • Как определить протокол без привязки к порту?

    @res2001
    Developer, ex-admin
    И FTP и POP3, а так же SMTP, IMAP и многие другие являются текстовыми протоколами, там так же можно определить протокол по содержимому пакета.
    В двоичных протоколах такой метод то же может работать, только анализировать нужно уже двоичную информацию, а не текстовую.
    В любом случае для анализа нужно знать сам протокол хоть текстовый, хоть двоичный.
    Но, конечно, не все так можно определить. Например, если любой из протоколов спрятан за SSL, то снаружи вы увидите шифрованный трафик, а что внутри без расшифровки понять уже не возможно.

    Кроме того определение протокола по номеру порта - так себе идея, т.к., наверное, любой сервер поддерживает возможность смены порта.
    Ответ написан
    Комментировать
  • Возможно ли использовать Visual Studio 2017(для c++) как portalbe?

    @res2001
    Developer, ex-admin
    Eclipse работает автономно, есть сборки со встроенной JRE, в этом случае и ява не нужна на компе.
    Но с компилятором могут быть проблемы - в эклипсе (да и в остальных IDE) нет своего компилятора.
    Обычно под виндой используется MSVC или mingw.
    MSVC скорее всего так же нельзя сделать переносимым.
    mingw - можно. Но что бы использовать его в Eclipse нужно настраивать переменные окружения винды. Это можно сделать запуская Eclipse из батника, в котором сначала устанавливаются значения для нужных переменных окружения и только потом запускается IDE.
    С другими IDE, думаю, схема будет примерно такая же.
    Ответ написан
    Комментировать
  • Как развиваться дальше и где черпать идеи/задачи?

    @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: ссылка на консоль должна быть в меню Пуск в папке со студией.
    Ответ написан