Ответы пользователя по тегу C++
  • С++ | Есть ли возможность получить события из 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.
    Ответ написан
  • Как преобразовать массив char в массив int?

    @res2001
    Developer, ex-admin
    1. Если что char - это целый тип, можно напрямую, без явного приведения типов сравнивать с int.
    В вашем случае в нем хранится не символ, а ASCII код символа, т.е. просто целое число. Но с тем же успехом можно туда записать любое другое число входящее в диапазон возможных значений:
    char c = 10;
    2. Приведение типов в стиле Си выглядит так: (int)K[i]
    3. Для преобразования ASCII кода в число используйте вариант, предложенный sergio_nsk
    или так K[i] - '0'
    или можно массиву L присваивать непосредственно коды символов, а не числа от 0-9 (и не важно, что массив int, а не char)
    L[0] = '0';
    L[1] = '1';
    Тогда можно сравнивать без преобразований.
    Ответ написан
    Комментировать
  • Что не так в реализации моего метода?

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

    PS: Я бы рекомендовал при создании нового узла обнулять указатель на следующий элемент, тогда определить конец списка можно просто по нулевому указателю и везде перед переходом на следующий элемент проверять не пустой ли он.
    Заведите переменную для хранения предыдущего узла, тогда избавитесь от внутреннего цикла, а накладных расходов минимум.
    Ну и код я бы немного реструктурировал, а то два одинаковых if идущих друг за другом режут глаз.
    Комментарии, по большей части, "ни о чем".
    Ответ написан
    Комментировать
  • Как сформировать блоки по 32бита из произвольного объема входных данных?

    @res2001
    Developer, ex-admin
    1) узнать размер файла, выделить буфер под размер файла и прочитать файл оптом. Но могут быть проблемы, если файл очень большой.

    2)64 бит - 8 байт
    32 бит - 4 байта
    Представлять можно целыми числами, например с помощью union схематично так:
    #include <inttypes.h>
    ...
    typedef union {
      uint64_t val8;
      uint32_t val4[2];
    } block;
    ...
    uint8_t * readdata; 
    // Выделяем память под массив байт readdata и читаем в него 8 байт из файла (опущено)
    ....
    
    block * b = (block*)readdata;
    // После этого в
    // b->val8 - 64 битовый блок
    // b->val4[0] и b->val4[1] - два 32 битовых блока
    Ответ написан
    2 комментария
  • Как записать функцию макрасом?

    @res2001
    Developer, ex-admin
    #define fun(v, h) sqrt((h.x*h.x) + (h.y*h.y) + (h.z*h.z))
    Ответ написан
  • Как добавить компилятор Visual Studio C++ в powershell\cmd?

    @res2001
    Developer, ex-admin
    Со студией поставляется комплект командных сценариев, настраивающих окружение командной строки для работы компилятора. Достаточно командную строку запускать через эти сценарии. Ярлыки на эти сценарии находятся в меню Пуск в папке студии.
    Например у меня для VS2017 есть такие:
    x64 Native Tools Command Prompt for VS 2017
    x86 Native Tools Command Prompt for VS 2017
    Соответственно для 64битной и 32битной сборки приложений. В 2015 студии есть аналогичные, только название немного изменено.
    Запускайте ком.строку через этот сценарий и все будет собираться.
    Ответ написан
    2 комментария
  • Как компилировать проект на Boost.python?

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

    PS: год назад, то же делал модуль для питона, только на голом Си. Вполне успешно.
    Ответ написан
  • Почему при смене кодировки консоли затрагивается только часть текста?

    @res2001
    Developer, ex-admin
    У вас часть исходников в кодировке 1251, а часть в UTF-8.
    Проверить - откройте исходники, например в Notepad++ - он и кодировку покажет и перекодировать умеет.
    Ответ написан
    3 комментария
  • Компиляция makefile под MVS 2017?

    @res2001
    Developer, ex-admin
    Лучше скомпилируйте в mingw стандартными средствами с помощью make.
    Либо вручную сконвертируйте его в формат nmake. nmake по сути тот же make, но сильно обрезанный в плане синтаксиса. Простые make файлы могут собираться с помощью nmake напрямую.
    Запустите командную строку VC и дайте команду:
    nmake /f makefile
    Ответ написан
    Комментировать
  • Как обрабатывать все элементы макроса?

    @res2001
    Developer, ex-admin
    Универсальный вариант на макросах не сделать, имхо.
    Ответ написан
    3 комментария
  • Как вывести в XCode на C++ символы ASCII?

    @res2001
    Developer, ex-admin
    Какое-то другое число - это то же число в восьмеричной системе счисления.
    Чтоб выводились символы, а не числа, попробуйте так:
    cout << (unsigned char)218;
    Ответ написан
    3 комментария