Ответы пользователя по тегу C++
  • Какие существуют средства для работы с документами 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, т.е. соглашения о вызовах.
    Ответ написан
    Комментировать
  • Кросс-платформенное решение для вывода кириллицы. Как реализовать?

    @res2001
    Developer, ex-admin
    Для винды придется делать отдельную реализацию, т.к.
    1. В консоли винды несколько русских кодировок (cp1251 и cp866, причем по умолчанию cp866).
    2. В консоли винды кодировку можно менять командой chcp из самой консоли на лету.
    Так что нормальная реализация должна узнать текущую кодировку и перекодировать весь выводимый текст в нее. Аналогично и с консольным вводом.
    Менять кодировку из программы - плохой вариант, хотя и вполне работающий.
    Ответ написан
    Комментировать
  • Как поделить на о в С++?

    @res2001
    Developer, ex-admin
    Если вы делите целые числа (short, int, long), то на компьютере вы в принципе не можете получить число с плавающей точкой в результате, т.к. выполняете целочисленное деление.
    Кроме того в процессоре целочисленное деление на ноль обычно вызывает аппаратное исключение. Оно может передаваться в приложение, может не передаваться, тут уже особенности платформы, runtime и т.п. Можете поэкспериментировать.

    Деление на ноль чисел с плавающей точкой стандартно дает в результате NaN - это не число (Not a Number). Любые дальнейшие операции с NaN будут давать в результате NaN.
    Современная стандартная библиотека позволяет настроить поведение так, что бы при делении на ноль чисел с плавающей точкой так же выбрасывалось исключение (std::fesetexceptflag()).

    Если вы хотите получить какое-то число близкое к нулю - реализуйте деление так как считаете нужным.
    Ответ написан
    Комментировать
  • Что такое Статический и Динамический массив?

    @res2001
    Developer, ex-admin
    Память под статический массив выделяется на стеке. При выходе из области видимости стек очищается и память под массивом освобождается автоматически (не нужна операция освобождения памяти, операция есть, но о ней позаботится компилятор самостоятельно).

    Память для динамического массива выделяется в динамической памяти (в куче) (new[]). Когда массив становится не нужным память должна быть освобождена (delete[]), иначе произойдет утечка памяти.

    В связи с вышеизложенными принципиальными отличиями, есть несколько следствий:
    1. Имя статического массива это не указатель. Это можно понять например сравнив, что возвращает sizeoff() для статического массива и для динамического. Хотя в некоторых ситуациях компилятор ведет себя так, как будто имя статического массива это указатель, например: можно передать имя статического массива в функцию, принимающую указатель.
    2. У динамического массива нет имени. Операция new[] возвращает указатель. Имя есть у указателя.
    3. Внимание! Оба варианта массивов имеют фиксированный размер. Изменять его нельзя!
    То что в std::vector вы можете укладывать кучу элементов постепенно, не указывая нигде предварительного размера является следствием того, что std::vector скрывает от вас всю работу, которую он при этом делает. При добавлении нового элемента, для которого нет места, он выделяет память для нового массива большего размера, копирует старый массив в новый, удаляет старый массив, добавляет новый элемент. Если идет интенсивная работа с push_back(), то это может ОООЧЕНЬ дорого стоить. std::vector - это удобно, но необходимо всегда помнить, за счет чего достигается это удобство. std::vector - это не динамический массив - это обертка над ним для более удобной работы с динамическим массивом.

    В языке Си (C99) есть такая штука как Variable Length Array (VLA) - это статический массив с изменяемым размером. Т.е. вы можете, например, в функции объявить int arr[N], где N будет передаваться в функцию как параметр.
    В стандарте С++ VLA нет! Но, например, тот же gcc с опциями по умолчанию разрешает его использования в С++ проектах. С опциями, заставляющими gcc более жестко следовать стандарту, он может запрещать использовать VLA в С++ проектах. Но не рассчитывайте, что все компиляторы будут так делать. Например микрософтовский компилятор в принципе не умеет в VLA (хотя я уже пару лет не проверял это).
    VLA может показаться классной штукой.
    Но, например, в ядре Линукс в свое время проводили целую компанию по выпиливанию VLA из исходников. Торвальдс высказывался негативно про VLA. Все это при желании можно нагуглить.
    Стоит помнить, что размер стека ограничен, а VLA то же выделяется на стеке. Кроме того выделение памяти для обычного статического массива это просто увеличение счетчика стека на константу (и все, одна операция сложения регистра с константой, а компилятор одной операцией выделяет память для всех переменных в текущей области видимости). С VLA все сложнее с выделением и удалением. Так же sizeof() для обычного статического массива это операция времени компиляции (при выполнении будет уже заранее известная константа), для VLA - это полноценный вызов функции.
    Ответ написан
    1 комментарий
  • Заинклудить из Windows.h только Sleep()?

    @res2001
    Developer, ex-admin
    MSDN говорит, что объявление Sleep() находится в файле synchapi.h. Так что можете подключать этот файл, а не глобальный Windows.h.
    Так же можно просто выдернуть объявление этой функции из synchapi.h и вставить его в свой код:
    void Sleep(DWORD dwMilliseconds);
    После этого можно использовать функцию. Главное не забудьте подключить виндовые библиотеки при сборке. Эта функция находится в Kernel32.lib.
    Ответ написан
    5 комментариев
  • Почему при компиляции проекта console application в dev c++ большой вес файла?

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

    @res2001
    Developer, ex-admin
    Почему вы в функции с переменным количеством аргументов не используете стандартный механизм для работы с аргументами в подобных функциях (#include <cstdarg>)?

    Поставьте отладочный вывод в цикл, где выведите значение count, а заодно и *ptr и comp. То же самое можно быстро посмотреть в отладчике затратив минуты 3 на все. Выводите значение floatов с большим количество знаков после запятой (10-15).
    Вы будете удивлены тому, что во float 3.0 это не обязательно равно 3, ну и т.д. То же самое относится к любым типам с плавающей точкой.
    Передавайте первым аргументом uint32_t, вторым и следующим float. Тогда все будет нормально. Код, конечно, придется немного переделать.
    Ответ написан
    3 комментария
  • Как проверить переменную любого ссылочного типа на null?

    @res2001
    Developer, ex-admin
    По стандарту ссылка не может указывать на несуществующий объект (NULL), поэтому, если вы сделаете так:
    if (&refTypeParam == null)
    Компилятор запросто может выкинуть этот код в процессе оптимизации, т.к. условие по стандарту никогда не выполнится.
    Вещи типа этой:
    int &v = *(int*)NULL;
    это неопределенное поведение по стандарту. Но на сколько я знаю, такое вполне прокатывает.
    https://stackoverflow.com/questions/4364536/is-nul...
    Ответ написан
    1 комментарий
  • Как правильно организовать прием данных через WS?

    @res2001
    Developer, ex-admin
    или я что то не так понял

    Именно.
    Вы выбрали асинихронный инструмент, не понимая как он работает.
    ioc.run() - запускает цикл обработки асинхроных событий (event loop). Когда он завершается, то вы не сможете уже что-либо получать/передавать.
    Ваша задача добавить нужный вам код в обработчики событий (функции on_xxx()). Как это правильно делать смотрите документацию по библиотеке и возможно другие примеры использования.

    Я никогда не использовал boost.beast и WebSocket, но некоторый опыт асинхронного программирования есть, а принципы асинхронного программирования в любых библиотеках одни и те же.
    Ответ написан
    Комментировать
  • Многострочный литерал C++ u8"один"sv u8"два"sv: что можно убрать?

    @res2001
    Developer, ex-admin
    u8 говорит о том, что строка в кавычках будет в кодировке UTF8: https://en.cppreference.com/w/cpp/language/string_...
    sv - преобразует строку в string_view: https://en.cppreference.com/w/cpp/string/basic_str...
    А нужно оно или нет - решать вам, в зависимости от контекста.
    Ответ написан