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

    @res2001
    Developer, ex-admin
    Сама по себе strcpy - нормальная, просто ею не умеют правильно пользоваться. И она ничего не делает для предотвращения не правильного использования. Зато она быстрее своих более безопасных аналогов.
    Улучшенная strncpy сокращает варианты не правильного использования.
    Но если тебе важна скорость выполнения, и ты уверен, что хорошо понимаешь как работает функция и предпринял все необходимое, чтоб функция не сработала не правильно, то почему бы и не пользоваться strcpy?
    Ответ написан
    Комментировать
  • Как удалить часть строки в c++?

    @res2001
    Developer, ex-admin
    Вам просто нужно скопировать остаток строки в начало найденной подстроки.
    Думаю лучше всего воспользоваться функцией стандартной Си библиотеки memmove().
    И в конце не забудьте воткнуть нулевой символ.
    Ответ написан
    Комментировать
  • Как игнорировать конкретную библиотеку?

    @res2001
    Developer, ex-admin
    не так сильно раздражать антивирусы

    Будет точно так же раздражать антивирусы.
    И вообще - причем тут wininet? Это системная библиотека, думаете антивирусы не дружат с виндой?
    Ответ написан
    Комментировать
  • Изменяю значение по ссылке, в чем моя ошибка?

    @res2001
    Developer, ex-admin
    К вашему вопросу отношения не имеет, но:
    В main вы выделяете память для массива из 0 элементов.
    int N=0;
    char str[N];
    Как думаете сколько памяти выделится под этот массив?
    Еще вы, видимо, считаете, что инкрементируя N вы увеличиваете размер массива? Это не так - увеличивая N вы никак не влияете на str.

    PS: создается впечатление, что VLA для новичков - это зло.
    Ответ написан
    5 комментариев
  • Как вытащить указатель на окно в перехваченной функции EnumWindows?

    @res2001
    Developer, ex-admin
    Нужно знать что там закодировано.
    Обычно это указатель на какую-либо структуру.

    И почему не так:
    PNT_ENUMWINDOWS TrueEnumWindows = ::EnumWindows;
    ?
    Вы не используете /DEFAULTLIB для сборки?
    Ответ написан
  • Unittests в Qt, как правильно организовать структуру проекта?

    @res2001
    Developer, ex-admin
    Вообще то юнит тесты (модульные тесты) не предназначены для встраивания в приложение. Тест это отдельное приложение, предназначенное для тестирования компонентов (функций, классов и т.п.) основного приложения. Обычно тесты не входят в состав релиза приложения (я не говорю сейчас про приложения распространяемые в исходниках, в этом случае тесты часто идут в составе).
    Что бы сделать то что вы хотите, просто пишите тест как часть приложения, без использования библиотек предназначенных для модульных тестов. Это будет быстрее.
    В принципе, что-то можно использовать из них с учетом того, что большая их часть выводит информацию на консоль, создает свою функцию main, ... Т.е. что-бы использовать их не по назначению нужно хорошо знать внутреннюю организацию и понимать как оно работает.
    Ответ написан
    1 комментарий
  • Как правильно перевести wstring в char* и обратно?

    @res2001
    Developer, ex-admin
    Если речь идет о винде, то есть функции API для конвертации: WideCharToMultiByte/MultiByteToWideChar
    Под линухом, наверное нужно использовать какую-либо библиотеки или самому конвертировать.
    Ответ написан
    Комментировать
  • Как выбрать компилятор при установки BOOST?

    @res2001
    Developer, ex-admin
    В комплект студии входят батники для настройки переменных окружения. Запустите такой батник из комплекта VS2008, потом в открывшемся окне командной строки перейдите в каталог с boost и запустите его батник для сборки. BOOST должен будет собраться компилятором и стандартной библиотекой от VS2008.
    Ответ написан
  • Ресурсы по современному C++?

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

    @res2001
    Developer, ex-admin
    new выделяет память в куче, а определение без new - на стеке, со всеми вытекающими преимуществами и недостатками. Нужно понимать когда определять объект в куче, а когда на стеке.
    Ответ написан
    Комментировать
  • С++ | Есть ли возможность получить события из WndProc в другом потоке?

    @res2001
    Developer, ex-admin
    Если речь о винде то можно: хук на создание окна и подмена WndProc своим.
    Ни линуксе - не в курсе.
    В любом случае - это не переносимое решение, если это для вас важно.
    Ответ написан
  • Как сделать перекрестные структуры?

    @res2001
    Developer, ex-admin
    Реализацию конструкторов вынесите из описания структуры, поместите под обоими описаниями и все будет норм.
    На самом деле, не понятно с какого перепуга методы first и second вы называете конструкторами? Если это должны быть конструкторы то и определяйте их как конструкторы и параметры опишите нормально, а то как-то сильно схематично получилось.
    Ответ написан
    2 комментария
  • Как устранить ошибку установки Visual C++ 2015 0x80240017?

    @res2001
    Developer, ex-admin
    Возможно не хватает места на системном диске.
    Если ставите из интернета, возможно файл скачался не корректно.
    Можно попробовать вручную установить это обновление: Windows8.1-KB2999226-x64.msu, взяв его у микрософта.
    Скачайте offline установщик студии и ставьте его.
    Ответ написан
    Комментировать
  • Как с помощью цикла выделить цифры из числа от старших разрядов к младшим?

    @res2001
    Developer, ex-admin
    С помощью операции взятия остатка от деления на 10 выделите от младших к старшим и переверните.
    Ответ написан
  • Как вызвать функции одного потока в другом?

    @res2001
    Developer, ex-admin
    В общем случае никто не мешает вызывать одну и ту же функцию из разных потоков.
    Я не в курсе реализации CALLBACK v8 JavaScript Engine. Если вы пытаетесь использовать функцию не стандартным образом, то вы должны соблюсти весь протокол ее использования.
    Если есть доступ к исходникам попробуйте отладить функцию.
    Скорее всего ошибка происходит уже внутри функции, возможно доступ за пределы выделенной памяти или по не верному указателю.
    Ответ написан
    Комментировать
  • Как правильно чистить память в c++?

    @res2001
    Developer, ex-admin
    Ошибка вылетает только при компиляции в Debug, потому что в этом режиме, скорее всего, в код включаются проверки целостности кучи. Просто в release целостность кучи не проверяется, но это не значит, что ошибки нет.

    Ошибка тут:
    for (int i = 0; i <= deg; i++) newdata[i] = data[i];
    Вместо deg нужно использовать maxdeg, имхо.

    Кроме того вы не проверяете значение deg и maxdeg до выделения памяти. Что если они содержат значения <= 0?

    Возможно, есть и другие места с присваиванием массиву data и переменной deg. Нужно искать выход за границу массива при присваивании элементам массива из-за чего повреждается куча.
    Так же настораживает new int[deg +1] и операторы >= и <= в условиях циклов обхода массива, это потенциальные места выхода за границу. Возможно, если перейти от deg к количеству элементов в массиве, то код упростится (уберете +1 при выделении и = в условии циклов) и будет легче найти ошибку.

    PS: в качестве небольшой оптимизации: для обнуления массива можно использовать функцию memset, для копирования массивов - memcpy.
    Ответ написан
    1 комментарий
  • Маленький диапазон char?

    @res2001
    Developer, ex-admin
    Так же могут быть проблемы с кодировкой: например программа скомпилирована с поддержкой Unicode и ждет на входе Unicode символы, а консоль работает в однобайтной кодировке (CP1251 или Cp866) или наоборот.
    Судя по описанию у вас как раз "наоборот", т.е. на вход вы подаете Unicode, а программа работает с однобайтной кодировкой. Правда символы из младшей половины таблицы ASCII в UTF8 так же занимают 1 байт, поэтому с цифрами и английскими буквами проблем быть не должно, а с русскими уже начнутся.
    Ответ написан
    Комментировать
  • Как повернуть матрицу на одну позицию по часовой стрелке?

    @res2001
    Developer, ex-admin
    Быстрее всего это можно сделать создав второй массив и копируя туда элементы в нужном порядке.
    Если же непременно нужно "на месте", то есть стандартный алгоритм std::rotate, или можно воспользоваться советом от сюда. Берите вариант с reversе.
    Ответ написан
  • Кто-нибудь программирует без оконной функции?

    @res2001
    Developer, ex-admin
    1 и 2. Что по вашему делает DispatchMessage? - она вызывает вашу оконную функцию где вы разместили case. Ну вызовите ее на прямую.
    А если у вас несколько окон, нужно сначала найти подходящую оконную функцию. Этим и занимается DispatchMessage.
    В том или ином виде, но оконная функция будет присутствовать в любом случае. Просто об этом уже подумали в микрософт и предусмотрели стандартный протокол работы.

    3. В main вы можете иметь инофрмацию о сообщении прочитав это сообщение с помощью GetMessage или PeekMessage. А что дальше? Вызывайте на прямую вашу оконную функцию или вызовите DispatchMessage.
    Все параметры для ручного вызова оконной процедуры у вас будут после GetMessage или PeekMessage их и передадите в оконную процедуру.

    В библиотеках асинхронного ввода/вывода типа libuv/libev, которые так же требуют событийно управляемого программирования, так же присутствует цикл обработки сообщений/событий и есть свой аналог оконной функции. Так что это вполне обычный подход для подобного класса задач.
    Ответ написан
    Комментировать
  • Выводит лишние символы в консоль C++. Что делать?

    @res2001
    Developer, ex-admin
    Видимо, лишние символы это
    cout << "Ћ";
    Исходный код, видимо, сохранен в UTF-8 и этот символ выходит двухбайтовый, а кодировка консоли, видимо, стандартная - 866 или 1251.
    Ответ написан