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

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

    @res2001
    Developer, ex-admin
    Используйте openssl или аналогичные библиотеки.
    Ответ написан
  • Как подключить стороннюю библиотеку к проекту Qt через CMake?

    @res2001
    Developer, ex-admin
    Конечно же в target_link_libraries, просто добавьте имя библиотеки в конце через пробел
    Но обычно используют find_package/find_library/pkg_check_modules для того, что бы предварительно определить установлена ли библиотека в системе. А в target_link_libraries добавляют переменные, которые инициализируются этими функциями.
    Смотрите: https://cmake.org/cmake/help/latest/genindex.html
    Ответ написан
  • Почему ругается Visual Studio c++?

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

    Вот что по поводу этой ошибки пишут в микрософте.
    Описание то же не особо помогает.
    Попробуй сделать n статической. Или определи как define.
    Ответ написан
  • Как создать свой аналог cout на голом C++?

    @res2001
    Developer, ex-admin
    Вы хотите именно самостоятельно реализовать или задача не использовать стандартную библиотеку?
    Если самостоятельно, то для начала изучите https://en.cppreference.com/w/cpp/header/cstdarg
    и все что связано с функциями с переменным числом аргументов.

    Если второе то, это значит, что вы должны использовать функции предоставляемые ОС. Для Windows это WinAPI, для Линукс - POSIX.
    В винде уже есть готовые варианты - функции семейства StringCbPrintf.
    В Линукс ... ну тут все равно от стандартной библиотеки ни куда не уйти :), т.к. это часть ОС и POSIX.
    Ответ написан
  • Правильно ли переделана abs функция в коде?

    @res2001
    Developer, ex-admin
    Ошибка компилятора говорит о том, что доступно 2 подходящих варианта функции abs и он не знает какой выбрать.
    Один вариант из стандартной библиотеки С++ другой из mpi.cxx. Т.к. в стандартной библиотеке abs существует давно, то видимо она недавно появилась в mpi.cxx. Причем в mpi.cxx она делает, что-то не то, т.к. принимает в параметре беззнаковое целое, а оно всегда положительно.

    Судя по коду вам нужен именно арифметический модуль, поэтому исправьте вызов abs так: std::abs. Будет использоваться функция abs из стандартной библиотеки.
    Так же можно изменить не вызов, а сделать явное преобразование аргумента:
    abs(static_cast<long>(MPIs[i].width)  - static_cast<long>(desiredWidth) ) * abs(static_cast<long>(MPIs[i].height) - static_cast<long>(desiredHeight))

    Этот вариант лучше, т.к. я подозреваю, что у вас MPIs.width, MPIs.height, desiredWidth, desiredHeight беззнаковые целые. При вычитании может получиться отрицательное значение, но если вычитаются беззнаковые то результат нельзя корректно интерпретировать. Поэтому перед вычитанием лучше преобразовать в знаковые значения.
    В этом случае будет выбрана более подходящая по аргументам функция из стандартной библиотеки.
    Так же можно внести оба изменения, т.к. вычитание беззнаковых явная логическая ошибка. Обычно это допустимо только тогда когда есть уверенность, что при вычитании не может быть отрицательного результата. Но в данном случае это не так, иначе не понадобился бы abs.
    Ответ написан
  • Есть ли существенная разница при вызове методов через this->method или без this->?

    @res2001
    Developer, ex-admin
    При выполнении не влияет ни на что. При компиляции конкретизирует namespace вызываемого метода, но текущий класс и так является областью поиска по умолчанию, так что явное указание излишне.
    Если вызываемого метода нет в текущем классе (или его предках), то при this-> компилятор сразу вернет ошибку, а без this-> поиск продолжится в вышележащих namespace.
    https://en.cppreference.com/w/cpp/language/lookup
    Ответ написан
  • Как передавать много сообщений через Socket?

    @res2001
    Developer, ex-admin
    Для передачи вы видимо используете TCP. В ТСР нет разделения на сообщения, все данные передаются в одном потоке в том порядке, в котором были отправлены. Т.е. вполне реальна ситуация, когда вы посылаете например 2 сообщения по 10 байт каждое, а читает 3 раза по 5, 10, 5 байт за раз. Таким образом разделять на сообщения вы должны на принимающей стороне самостоятельно.
    РОСО тут не причем - эменно так работает протокол ТРС. Вместо TCP можете использовать UDP - тут будете принимать именно сообщениями. Но есть сложность с дефрагментацией - если размер сообщения больше MTU, то сообщение будет фрагментировано при передаче и не факт, что куски дойдут и соберуться. Ну и еще UDP не гарантирует доставку, т.е. сообщения могут теряться и ни получатель ни отправитель об этом не узнает.
    Так же можно использовать протокол SCTP, он так же как UDP работает с сообщениями, но при этом гарантирует доставку. SCTP входит в стандартный стек TCP/IP. Есть ли его поддержка в POCO я не в курсе.
    Ответ написан
  • Есть ли книги по winapi / c++?

    @res2001
    Developer, ex-admin
    Внутреннее устройство Виндоуз Русиновича.
    Никакая книга не сможет вместить описание всего API. Так что документация на сайте микрософта по любому нужна.
    Ответ написан
  • Отсортировать данные о котировке акций по тикерам и по дате?

    @res2001
    Developer, ex-admin
    А что в плюсах уже стандартный std::sort перестал работать?
    Зачем вы пишете собственную сортировку пузырьком? Лучше чем в std вряд ли получится.
    Но учитывая, что
    Размер файла может быть достаточно большим для загрузки всех данных в память одновременно

    Нужно файл делить на несколько частей, помещающихся в память, каждую часть сортировать отдельно тем же std:sort, результаты сохранять в промежуточный файл. Затем результаты объединять с помощью сортировки слиянием.
    Ответ написан
  • Почему переноситься на следующую строку?

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

    @res2001
    Developer, ex-admin
    Сохрани исходники в UTF8 и пересобери. В Лине сейчас везде UTF8 по умолчанию стоит.
    В старых версиях Линукс в русской локали была кодировка KOI8-R.
    Ответ написан
  • Как работает это выражение в Си?

    @res2001
    Developer, ex-admin
    Работает в Си так же как в С++.
    Тут надо немного теории:
    Как мы обычно индексируем массив: array[2]
    Компилятор это дело приводит к виду: *(array + 2)
    А теперь, что будет если написать вот так: *(2 + array)?
    Все нормально будет, результат тот же. При этом такое выражение, если переписать в индексном виде будет иметь вид: 2[array]
    Все остальное в приведенном варианте printf - декорация для запудривания мозгов - обычная операция ,
    Ответ написан
  • Как использовать принятый двумерный массив из функции?

    @res2001
    Developer, ex-admin
    Массив Т в transposeMatric - это локальная переменная, вы пытаетесь вернуть указатель на локальную переменную. После выхода из функции все локальные переменные уничтожаются.
    На что будет указывать возвращенный указатель? - на какое-то место в стеке, где ранее была правильная переменная, а сейчас может находится все что угодно.
    В вашем случае Т надо выделять динамически или возвращать массив по значению.
    Ну и
    return *T;
    вернет T[0][0], а не то что вы, видимо, хотите.
    Крометого вы не правильно используете Т в main(). Объявив его как указатель:
    double *T;
    вы не сообщаете компилятору о размерности массива Т, поэтому индексация массива T[i][j] не может быть выполнена.
    Раз уж вы все равно пишете на С++, то используйте std::vector для передачи и возвращения массива.
    Ответ написан
  • Как можно оптимизировать?

    @res2001
    Developer, ex-admin
    Это узкое место в вашей программе? Что-то не верится. Оптимизация не нужна.
    Ответ написан
  • Как удалить и добавить элемент массива c++?

    @res2001
    Developer, ex-admin
    Какого массива?
    Если встроенный статический массив типа: int arr[100] - никак, размер массива фиксирован.
    Если массив динамический, выделенный с помощью std::malloc/std::calloc, то можно с помощью std::realloc выделить больше/меньше памяти, чтоб туда влез дополнительный элемент. В случае вставки элемента в середину придется вручную переносить нижележащие элементы, чтоб освободить место для добавляемого элемента. То же самое и с удалением элемента из середины, только порядок действий другой.

    Динамический массив реализован в std::vector. Все необходимые операции в нем есть. Им и рекомендуется пользоваться. Но имейте ввиду, что операции перераспределения памяти и копирования хвоста массива достаточно дорогие, в этом плане std::vector никаких чудес не делает.
    Ответ написан
  • VC++ 2010 не даёт описать переменную в середине блока - ограничение Express-версии?

    @res2001
    Developer, ex-admin
    Посмотрите в настройках проекта какая версия языка используется.
    Не скажу на вскидку какие версии поддерживает cl от VS2010, в VS2017 за это отвечает опция /std. В VC2017 эта опция находится в Configuration Properties -> C/C++ -> Language -> C++ Language Standard
    Поведение, которое вы описываете, характерно для лохматых версий Си.
    Микрософт официально не поддерживает стандарты языка Си в своем компиляторе (хотя стандарты частично реализуются), поэтому в опциях компилятора нельзя это задать.
    Если задать опцию /TP, то все файлы исходного кода будут компилироваться как С++ код, не зависимо от расширения файла. По умолчанию, если расширение .c - компилируется как Си код. Возможно эта опция поможет избавиться от ошибки, но есть шанс появления других ошибок. В VC2017 эта опция находится в Configuration Properties -> C/C++ -> Advanced -> Compile As

    PS: номер и текст ошибки то же было бы не плохо сюда запостить.
    Ответ написан
  • Код сравнение длительности звуков c++?

    @res2001
    Developer, ex-admin
    Нужно знать частоту дискретизации и количество отсчетов в выборке.
    Частота дискретизации - это количество отсчетов за 1 секунду. Соответственно, длительность звучания в секундах находится: количество отсчетов / частоту дискретизации.
    Ответ написан
  • Как скомпилировать и запустить файл cpp из другого файла cpp?

    @res2001
    Developer, ex-admin
    Очевидно - запускать отдельным процессом компилятор с соответствующими параметрами, анализировать ошибки функции старта процесса, ждать завершения процесса компиляции и анализировать код возврата. Так же можно (нужно) перехватывать stdout и stderr и анализировать сообщения компилятора (или просто выводить пользователю).
    Ответ написан