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

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

    Вы не пишите сразу весь проект и 99% существующего кода вам не нужна вот прям сейчас. В текущий момент времени вы работаете над каким-то конкретным участком кода и функционалом. Удобно когда весь код находится под рукой. Да, когда код разбит на файлы, часто работая над одним функционалом, приходится держать открытыми несколько файлов, но их количество ограничено и их размер достаточно не большой.
    Если вы только начали изучать крупный проект, то в начале будет тяжело ориентироваться, но уже через несколько дней изучения кода это не будет для вас большой проблемой. Хорошая IDE то же помогает в этом случае.

    Части проекта помещенные в отдельные файлы вы можете использовать на прямую в другом проекте как есть, без копипасты и поддержания одного и того же кода в разных проектах, просто скопировав файлы в другой проект или подключив submodule в гите.
    Ответ написан
    Комментировать
  • Какие ошибки я сделал в коде?

    @res2001
    Developer, ex-admin
    С точки зрения С++ ошибок нет. Программа должна собраться и отработать.
    Но поставленную задачу она решает явно не правильно.

    Алгоритм решения задачи гуглится за 10 секунд. Так же не трудно найти условие для возможности построения треугольника по заданным сторонам.

    Судя по всему условия в if у вас записаны не верно. С точки зрения языка они правильные, но делают они, скорее всего, не то что вы хотите. А что вы хотите можно только догадываться.
    Ответ написан
    Комментировать
  • Что означает данная запись структуры?

    @res2001
    Developer, ex-admin
    Тут два в одном - одновременно и определение структуры (struct A) и определение переменной (a) типа struct A.
    Ответ написан
    Комментировать
  • Возможно ли написать юнит тест под void функцию?

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

    @res2001
    Developer, ex-admin
    1.Вместе со значением передавайте информацию о типе в каком-нибудь виде
    2.Определяйте тип по содержимому, если это возможно.
    Ответ написан
    4 комментария
  • Использована неинициализированная локальная переменная?

    @res2001
    Developer, ex-admin
    В чем вопрос?
    Да использована не инициализированная переменная r.
    Вы когда объявляете переменную внутри функции (автоматическую) без инициализатора, то ее реальное значение не определено, т.е. оно может быть любым. Любой мусор, который валяется в памяти по месту расположения переменной станет значением переменной.
    А потом вы делает r += a; Т.е. вы складываете a с мусором. Что вы хотите получить в итоге?
    Просто проинициализируйте r нулем, так же как это сделано для b.
    Ответ написан
  • Что делает этот конструктор?

    @res2001
    Developer, ex-admin
    Что делает конструктор по этому фрагменту кода сказать нельзя.
    В представленном фрагменте кода только объявление конструктора. Это значит, что определение его находится где-то в другом месте. Определение содержит весь код функции, а объявление только сигнатуру (возвращаемое значение + название + параметры).

    Учитывая, что набор параметров конструктора такой же как и набор членов данных класса, можно предположить, что конструктор просто инициализирует члены класса. Возможно, проверяет допустимость переданных параметров. Но это может быть совсем не так или только частично так. Без определения конструктора (его полного кода) нельзя в точности сказать, что он делает.
    Кстати, определение может содержать и пустое тело функции, но и в этом случае оно отличается от объявления. Пустой конструктор может быть определен например так:
    Cls::Cls(char c, double d, int i) {};
    или содержать список инициализации с пустым телом:
    Cls::Cls(char c, double d, int i): c(c), d(d), i(i) {};
    Ответ написан
  • Повреждение стека вокруг переменной - как побороть?

    @res2001
    Developer, ex-admin
    В getWindowsVersion передавайте размер буфера.
    Замените spintf на snprintf и контролируйте переполнение буфера. Да, при ошибке snprintf то же может вернуть отрицательное значение.
    Если snprintf вызвать с первыми двумя параметрами равными 0, она посчитает необходимый размер буфера для вашего шаблона и параметров и вернет его ничего реально не скопировав. Можно использовать эту возможность.
    Ответ написан
    1 комментарий
  • Как получить ip-адреса всех запущенных серверов по UDP?

    @res2001
    Developer, ex-admin
    Вы получите ответ от всех серверов, получивших широковещательный запрос.
    Ответ написан
    7 комментариев
  • В чем разница между #pragma once и стражами включений?

    @res2001
    Developer, ex-admin
    На вики пишут, что #pragma once не стандартная фича, хотя многие современные компиляторы ее знают, но не все. Так что #ifndef надежнее.
    Ответ написан
    Комментировать
  • Как подключить библиотеку?

    @res2001
    Developer, ex-admin
    libc/libcmt - это стандартная библиотека, отличаются они разным способом компоновки (libc - динамическая, libcmt - статическая). Есть еще аналогичный комплект для отладочной сборки.
    Стандартная библиотека должна быть в составе студии, причем все ее варианты. Если нет, возможно студия как-то криво поставилась. Или возможно вы ставили выборочную установку и чего-то не включили. Попробуйте переустановить студии или добавить необходимые компоненты. Возможно вы не включили в установку SDK (сейчас не могу точно посмотреть название пакета в инсталяторе, т.к. нет винды со студией под рукой).

    Компоновщик (линкер) есть по любому, просто он вызывается компилятором. Именно он собирает из объектных файлов и библиотек исполняемый файл. Компоновщик является неотъемлемой частью процесса сборки и поставляется вместе с компилятором. Опции ему передаются через опции компилятора. Например те же MT/MD, а так же -L/-l - это опции компилятора для компоновщика.
    Если собирать проект вручную (или через nmake/make), то можно вызывать компоновщик напрямую, задавая необходимые опции. Но студия делает это за вас.
    Ответ написан
  • Корректное использование poll recv?

    @res2001
    Developer, ex-admin
    Вы не правильно понимаете.
    При таком использовании как сейчас у вас смысла в poll особого нет, а так же нет особого смысла использовать его в блокирующем режиме сокета, т.к. в этом режиме recv (send) не вернет управление пока не сделает свою работу или пока не возникнет ошибка или пока не придет сигнал.

    Если вы не стремитесь сделать некоторый вариант асинхронной работы с сетью, то poll и неблокирующие сокеты можно вообще не использовать.
    В блокирующем режиме poll может быть полезен тем, что он поддерживает timeout, что может быть полезно, например для проверки флага не пора ли завершить поток или что-то в этом роде. Но и в этом случае нет гарантии, что recv (send) выполнятся без блокировки и сразу вернут управление. Поэтому timeout будет работать только в вызове poll, но не recv (send).

    poll вам возвращает признак есть ли в сокете данные для чтения (или готов ли он к записи). Если да - вызываете recv (send), если нет можно поделать что-то свое, потом снова вызвать poll.

    Кроме того имейте ввиду, что recv может получить не полный буфер, и send отправить не весь буфер.

    Всегда анализируйте возвращаемые значения системных функций, особенно когда дело касается ввода/вывода.
    Ответ написан
    4 комментария
  • Как проще в VIsual C/C++ заменить "//" на "/" в переданном аргументе командной строки?

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

    @res2001
    Developer, ex-admin
    Все более-менее нормально.
    Уберите cin.ignore();
    Замените getline(cin,FIO); на cin >> FIO;
    Ответ написан
  • Как языки получают новые возможности из библиотек?

    @res2001
    Developer, ex-admin
    Грубо говоря в компьютере взаимодействие с любыми устройствами заключается в том, что нужно записать некоторый набор байт по определенному адресу в памяти (порт). Адресные диапазоны устройств (порты) и протокол обмена заранее известны. Каждый тип устройства имеет свой собственный протокол обмена с ПК (т.е. набор и количество данных и размер адресного пространства устройства).
    Современные ОС запрещают напрямую работать с устройствами, т.к. защита и все такое. Но ОС предоставляют собственные функции, позволяющие управлять устройствами, только более высокоуровневые. Ну т.е. вы не думаете куда и что именно надо записать, чтоб на экране нарисовалась точка. Вы просто вызывавете функцию ОС с заданными координатами точки.
    Когда все работали под MS-DOS, то ОС не препятствовала низкоуровневому доступу к оборудованию и любая программа могла непосредственно взаимодействовать с устройством без посредничества ОС. Сейчас погрузиться в это можно программируя микроконтроллеры.

    Обычно ОС пишут на Си. Поэтому разработчику ОС достаточно легко предоставить библиотеку API функций для Си. С++ как потомок Си так же умеет работать с Си библиотеками. В других ЯПах приходится реализовывать механизмы, чтоб из них можно было бы вызывать библиотечные Си функции.
    Ответ написан
    Комментировать
  • Как запретить ввод букв в C++?

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

    Но по уму вам нужно переводить терминал в "сырой" (raw) режим средствами ОС, в этом режиме появляется возможность обрабатывать каждую нажатую клавишу отдельно, не требуется подтверждение ввода Enterом и т.д. Но в работе в этом режиме std и ее стандартные объекты вам не помогут никак, нужно переходить на уровень ОС.
    Можно поискать библиотеки, в которых реализован "сырой" ввод. Например в libuv это есть, но это кроме всего прочего еще и бибилотека ассинхронного ввода/вывода, что как бы добавляет сложностей.
    Ответ написан
  • Не работает код?

    @res2001
    Developer, ex-admin
    У вас GetRefStrict должна возвращать ссылку, а вы возвращаете указатель.
    return *res;
    Ответ написан
    Комментировать
  • Клиент-серверное приложение?

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

    Не стоит запускать на каждого клиента отдельный вычислительный процесс, если вычисления достаточно ресурсоемкие вы парой десятков клиентов обеспечите DDoS на свой сервер, т.е. ваш сервер может просто умрететь под нагрузкой.
    Ответ написан
  • Почему не выводятся русские символы?

    @res2001
    Developer, ex-admin
    Видимо речь идет о Винде и проекте в MSVS.
    Конретно описанная проблема, видимо, в том, что программа скомпилирована с поддержкой UTF8. Попробуйте в настройках проетка выключить поддержку UTF8 и пересобрать программу.
    Но в винде вывод русских букв в консоль достаточно не тривиальная задача. Тут эта тема уже много раз обсуждалась. Полезно хотя бы иметь представление о вопросе. Можете начать отсюда и прочитайте комменты к статье.
    Ответ написан
    Комментировать
  • Как отправить сообщение с шифрование SSL/TLS в Winsock2?

    @res2001
    Developer, ex-admin
    Используйте openssl или аналогичные библиотеки.
    Ответ написан
    4 комментария