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

    @res2001
    Developer, ex-admin
    Объявите массив
    WCHAR targetWindowName[]
    и скопируйте туда свою константу используя, например, std::wcsncpy
    Ответ написан
    Комментировать
  • Где хранится nullptr? Для разных программ она разная?

    @res2001
    Developer, ex-admin
    nullptr - сам по себе это константа (сейчас не важно ее реальное значение). Где хранится, например, 2 или 100500?
    Вот когда вы сделаете присваивание:
    void *ptr = nullptr;
    То в указателе ptr будет хранится значение nullptr.
    Если посмотрите асемблерный код подобного присваивания, то там будет что-то вроде:
    mov ax, 0;
    В данном примере считаю, что значение nullptr - это 0. Тут видно, что nullptr хранится прямо в коде и является одним из операндов ассемблерной команды mov.
    Про то что хранится в памяти, куда указывает nullptr (и ptr из примера), написал Mercury13
    Ответ написан
    Комментировать
  • Есть ли механизм работы с сокетами в C++?

    @res2001
    Developer, ex-admin
    Ни в одном языке нет подобных функций. Просто потому, что это API операционной системы, а ОС, обычно пишут на Си. Но даже в Си их нет - это функции ОС.
    Но полно библиотек, которые оборачивают ОС API в классы. Пользуйтесь. Их достаточно много. Хорошие варианты привел @gbg

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

    @res2001
    Developer, ex-admin
    Числа с плавающей точкой по определению приближенные. Каждая операция над подобными числами вносит свою погрешность в результат. Так что не стоит удивляться. В какую сторону и на сколько будет погрешность, думаю, это можно посчитать, но для этого надо копнуть глубже.
    Для проверки можете просто вывести результат 2 сложений, потом трех, ... А так же проверьте результат умножения.
    Тут много интересного можно для себя открыть.
    Так же небезъинтересно сравнить результат одних и тех же вычислений над double и float.
    Даже и не надейтесь в плавающей точке получить какой-то точный результат. Если нужна точность, то надо использовать фиксированную точку.
    Ответ написан
    Комментировать
  • Где то слышал что префиксный инкремент работает быстрее чем постфиксный. Это так?

    @res2001
    Developer, ex-admin
    Не замерял скорость. И даже не смотрел в дизасемблере реализацию.
    Но предлагаю просто разложить обе операции на примитивные ассемблерные инструкции (где нет инкремента, данные хранятся в памяти, а считаются в регистрах). Примерно так будет в псевдокоде:
    int preinc(int i) {
      mov r1, [i];
      add r1, 1;
      mov [i], r1;
      return r1;
    }
    int postinc(int i) {
      mov r1, [i];
      mov r2, r1;
      add r2, 1;
      mov [i], r2;
      return r1;
    }

    Видно, что у постфиксного варианта на одну операцию больше, чем у префиксного. А так же постфиксный использует 2 регистра, тогда как префиксный 1.
    Логика работы префиксного проще и понятней. Так что используйте по умолчанию всегда префиксный. И только тогда когда действительно необходимо постфиксный.

    А теперь представьте, что операция производится не надо встроенным типом, а надо классом. В этом случае дополнительные затраты могут быть гораздо существенней.
    Ответ написан
    2 комментария
  • В чем ошибка, если с кодом все нормально?

    @res2001
    Developer, ex-admin
    https://docs.microsoft.com/en-us/previous-versions...
    По ссылке видно, что функция URLDownloadToFileW объявлена в Urlmon.h и определена в Urlmon.dll.
    Т.к. ошибка на стадии линковки, то компиляция прошла успешно, а значит Urlmon.h так или иначе подключается в процессе компиляции. Но Urlmon.lib не добавлена в опции линковки, из-за чего и возникает ошибка.
    Ответ написан
    Комментировать
  • С++ Как замедлить выполнение цикла while?

    @res2001
    Developer, ex-admin
    Добавить внутрь цикла паузу в 1 секунду.
    Ответ написан
    Комментировать
  • Зачем при использовании библиотеки stb_image указывают #define STB_IMAGE_IMPLEMENTATION?

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

    @res2001
    Developer, ex-admin
    Показался интересным 7 вопрос.
    Дело в том, что вы можете создать экземпляр пустого объекта и можете взять его адрес.
    Но если размер объекта будет 0, то адрес будет взять не возможно (объект не занимает места в памяти, соответственно нет и адреса), что противоречит правилам языка.
    Поэтому пустые объекты на самом деле не пустые и занимают в памяти 1 байт.
    Ответ написан
    1 комментарий
  • Какие существуют средства для работы с документами Word.docs (.doc) через c++?

    @res2001
    Developer, ex-admin
    Например можно использовать для этого сам Word, если вас это устраивает. Все продукты MS Office являются COM/ActiveX объектами. Это можно использовать в своей программе на каком угодно языке, умеющем в COM/ActiveX. С++ это умеет. Из коробки это умеют еще и JacaScript и VBScript, так что может вам и плюсы не нужны.
    Ответ написан
    4 комментария
  • Как получить данные из сайта в C++?

    @res2001
    Developer, ex-admin
    Так же, как и на любом другом языке программирования - отправить HTTP запрос на сайт, получить и распарсить ответ. Для этого есть много библиотек, с помощью которых это можно сделать достаточно легко.
    Так же можно сделать и без сторонних библиотек, но это будет уже гораздо сложнее и придется во всем разбираться самому.
    В самом языке С++ встроенных средств для этого, конечно, нет.
    Ответ написан
    Комментировать
  • В каких случаях лучше использовать wchar_t, char16_t, char32_t вместо char в C++?

    @res2001
    Developer, ex-admin
    Под виндой лучше всегда использовать wchar_t, т.к. ядро винды внутри себя использует wchar_t для строк. Все функции WinAPI, принимающие строки как char* - просто конвертируют их в wchar_t и вызывают соответствующую функцию для широких символов. Так что в целях некоторой оптимизации лучше сразу использовать wchar_t.
    В линуксе сейчас уже повсеместно UTF8. Разве что вам придется писать для старых ядер/дистрибутивов.
    Другие типы - тогда когда будете работать с данными в соответствующих кодировках.
    Ответ написан
    Комментировать
  • Как реализован консольный ввод/вывод в C/C++?

    @res2001
    Developer, ex-admin
    Непосредственно вводом/выводом занимается ОС. Стандартная библиотека С/С++ использует API ОС для ввода/вывода.
    Ответ написан
    Комментировать
  • Воспроизведение звука из буфера без сохранения?

    @res2001
    Developer, ex-admin
    Если вы не программист - никак.

    Воспроизвести звук программно это несколько сложнее, чем записать данные в файл. Но принцип примерно такой же - отрыть устройство воспроизведения и писать в него данные, которые надо воспроизводить.
    Но из-за того что воспроизведение должно быть без задержек, само воспроизведение занимает время и API ОС и оборудование умеют работать только с некоторыми типами данных возникают особенности, усложняющие процесс.
    Проще всего использовать какую-либо библиотеку, которая большую часть работы возьмет на себя. Можно использовать PortAudio, например, но она на Си и достаточно низкоуровневая. Можно использовать API ОС но это совсем низкоуровнево и может быть достаточно сложно для начинающего.
    Ответ написан
    Комментировать
  • Как использовать юникод в консоли windows с wstring?

    @res2001
    Developer, ex-admin
    Аргументы командной строки не обязательно будут в 866 кодировке, могут быть и в 1251 - зависит от кодировки консоли, которую можно менять консольной командой chcp.
    Вообще не стоит использовать юникод в консоли, т.к. виндовая консоль не слишком дружит с юникодом.
    Например, если захотите обработать вывод вашей программы каким-нибудь фильтром в батнике, то при юникоде могут быть проблеммы.
    Хотя внутри программы вы можете использовать юникод, но в этом случае вы должны будете перекодировать весь ввод и вывод. Не уверен, можно ли настроить стандартную библиотеку, чтобы она сама занималась перекодировкой.
    А так в WinAPI есть целый набор консольных функций, в т.ч. можно получить текущую кодировку консоли для ввода и вывода, установить нужную кодировку, перекодировать текст.
    Ответ написан
  • Что за скобки в выражении std::true_type{}?

    @res2001
    Developer, ex-admin
    На сколько я понимаю, в вашем примере вполне можно заменить фигурные скобки на круглые и ничего не изменится.
    Но если бы в классе hello был бы конструктор, принимающий std::initializer_list, то в случае использования фигурных скобок вызвался бы именно этот конструктор, а не конструктор по умолчанию, даже если фигурные скобки пустые.
    Сделайте оба конструктора и проверьте, какой из них вызывается с фигурными скобками и с круглыми.
    Ответ написан
    Комментировать
  • No match for 'operator=' c++ ошибка?

    @res2001
    Developer, ex-admin
    Оператор присваивания должен возвращать ссылку на самого себя. У вас возвращается копия объекта.
    Ответ написан
    Комментировать
  • Как перегрузить оператор ++ для собственного класса String?

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

    @res2001
    Developer, ex-admin
    У вас маска для S не правильная (0x1F - 5 битов), судя по заданию должна быть 7 (3 бита). Но в целом это не должно влиять на результат, т.к. S последнее поле и при сдвиге свободные биты будут заполняться нулями.
    Приведите пример входное значение и что получаете на выходе.

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

    @res2001
    Developer, ex-admin
    Это скорее всего макросы, определенные где-то в заголовочных файлах. Поищите поиском по "#define _CMDINP" по исходникам библиотеки.

    Скорее всего _CMDIMP для компилятора микрософт преобразовывается в __declspec( dllimport ). Для gcc макрос не определен.
    _CMDAPI это видимо что-то вроде stdcall или cdecl, т.е. соглашения о вызовах.
    Ответ написан
    Комментировать