Ответы пользователя по тегу C++
  • Функция не работает, не понимаю почему, как можно исправить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    что я сделал не так, подскажите пожалуйста
    if (b[i] >= x || b[i] <= y) {
      a[j] = b[i];
      j++;
    }
    ...
    if (b[i] < x || b[i] > y) {
      a[j] = b[i];
      j++;
    }

    Условия в операторах if не являются взаимоисключающими, а значит j может стать больше чем n и запись в a[j] вылезет за границу массива.
    Я не уверен в правильности первого условия, но особо не задумываясь можно второе условие переписать как прямое отрицание первого: if (!(b[i] >= x || b[i] <= y)) и это гарантирует, что индекс не выйдет за пределы массива, вне зависимости от правильности первого условия.
    Ответ написан
    Комментировать
  • Ошибка С2360, initialization of 'hInstanse' is skipped by 'case' label, почему?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    initialization of 'hInstanse' is skipped by 'case' label, почему?
    switch (uMsg)
    {
    ...
    case WM_CREATE:
    //получаем дескриптор приложения
    HINSTANCE hInstance = GetModuleHandle(0);
    ...
    break;
    
    case WM_MOUSEMOVE:
    //устанавливаем тот или иной курсор в зависимости от местонахождения мыши
    ...

    Потому что -- посмотри в этот код -- это фактически так: перейдя на метку WM_MOUSEMOVE код попадёт в область где hInstance определён, но минует его инициализацию. Компилятор туповат, чтобы понять, что hInstance дальше не используется. Простейший фикс -- обернуть код обработчиков в блоки:
    switch (uMsg)
    {
    ...
    case WM_CREATE:
    {
      //получаем дескриптор приложения
      HINSTANCE hInstance = GetModuleHandle(0);
      ...
    }
    break;
    
    case WM_MOUSEMOVE:
    {
      //устанавливаем тот или иной курсор в зависимости от местонахождения мыши
      ...
    }
    ...
    Ответ написан
    1 комментарий
  • Ошибка в подсчете символов, что делать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    считать количество русских букв, однако он не правильно это делает, что не так?

    считать русские буквы сложно, твой код зависит от кодировки и в любой не-однобайтной кодировке этот код не будет работать правильно. Проще всего, мне кажется, выкинуть charVector и весь код связанный с ним, а оставшееся переписать следующим образом:
    setlocale(LC_ALL, "");
    
    const char *str = input.c_str();
    
    while (*str) {
        wchar_t c;
        int n = mbtowc(&c, str, MB_CUR_MAX);
    
        if (n < 0)
            break;
        if (wcschr(L"абвгд...юя", c))
            ++count;
        str += n;
    }
    Ответ написан
    1 комментарий
  • Как правильно вывести структуру из dll на c++ в Python?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Возврат структуры по значению при определённых условиях (связанных с размером и типами данных полей структуры) добавляет скрытый параметр (указатель на область памяти куда нужно вернуть результат), который функция будет ожидать. Это твой случай, и поэтому все остальные параметры съехали на один. Решение -- либо научить ctypes тому, что возвращается сложный тип и у функции может быть скрытый параметр (полагаю, что так: ctypes.restype(outdata), где outdata -- тип rez1, см), либо переделать функцию так, чтобы она не требовала скрытого параметра (например, добавив явный указатель на результат в список параметров, см).
    Ответ написан
    4 комментария
  • Compilation error: exit status 1?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    D:\ N E W\ 1637\ 1\Talking LED Alarm Clock Using TM1637 LED Module\Code/Code.ino:91: undefined reference to `sp3_THE'
    D:\ N E W\ 1637\ 1\Talking LED Alarm Clock Using TM1637 LED Module\Code/Code.ino:91: undefined reference to `sp3_THE'
    D:\ N E W\ 1637\ 1\Talking LED Alarm Clock Using TM1637 LED Module\Code/Code.ino:92: undefined reference to `sp3_TIME'

    В чему может быть проблема ?


    Так вот же написано: символы не определены. Поскольку компиляция прошла успешно, а проблема на этапе линковки, нужно добавить в линковку библиотеку в которой эти символы определены.
    Ответ написан
    Комментировать
  • Как можно улучшить код?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как можно улучшить код?

    - отформатировать по какому-нибудь стандарту, чтобы хотя бы строчки не гуляли влево-вправо.
    - пользоваться тернарным оператором вместо if когда это имеет смысл. На мой взгляд, d = n < 0 ? -n : n выглядит куда лучше семистрочного if/else.
    - не дублировать код когда этого легко избежать:
    if(n<0) {
        cout<<"-";
    }


    Ну и добавлю, что у этого кода есть проблема с обработкой входного значения -2147483648.
    Ответ написан
    Комментировать
  • Компиляция C++ кода на Ubuntu и Windows даёт мне разный результат, почему?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Уже не знаю что делать

    Не знаешь что делать -- включай санитайзеры:
    $ g++ -std=c++11 -g -fsanitize=undefined -fsanitize=address main.cc tools.cc -o test
    $ ./test
    ==3245365==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x606000000060 at pc 0x55b559719b47 bp 0x7ffcc39300a0 sp 0x7ffcc3930098
    READ of size 8 at 0x606000000060 thread T0
        #0 0x55b559719b46 in Processor::encode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) toster/1320980/main.cc:41


    mainc.cc:41 это std::bitset<16> KR = K_array[i];, цикл по i идёт до 9, а в массиве K_array 8 элементов.
    Ответ написан
  • Как хранится c++ struct в памяти и как определить размер вручную?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    поэтапаный алгоритм определения размера

    Если откинуть тонкости связанные с битовыми полями, то алгоритм простой. Обозначим выравнивание всей структуры A, размер всей структуры S, размер головы структуры из i полей Si, размер i-го поля SFi, выравнивание i-го поля AFi, операцию округления X вверх до ближайшего кратного Y R(X, Y) (т.е., например, R(4, 4) = 4, R(5, 4) = 8), количество полей структуры n. Тогда

    S0 = 0
    Si = R(Si - 1, AFi) + SFi
    A = maxi = 1..n(AFi)
    S = R(Sn, A)

    Второй и третий шаги гарантируют, что в выравненной структуре каждое поле тоже выравнено.
    Четвёртый шаг гарантирует, что если такие структуры поместить в массив, то все элементы массива будут одинаково выравнены.

    Разумеется всю эту математику имеет смысл делать если пишешь компилятор, во всех остальных случаях размеры и выравнивания структур можно узнать непосредственно у компилятора.
    Ответ написан
    Комментировать
  • Как в С++ проверить double на целочисленность?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    #include <cmath>
    int isInteger(double num)
    {
        return num == trunc(num);
    }

    Ну и нужно понимать, что с некоторого (в зависимости от конкретной разрядности double) значения порядка любой double станет целочисленным из-за ограниченности длины мантиссы.
    Ответ написан
    8 комментариев
  • Почему при запуске программы через командную строку на mac выходит segmentation fault 11?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    atoi(argv[1]) ожидает, что у программы при запуске будет как минимум один параметр командной строки. Segfault который ты видишь -- это результат запуска программы без аргументов.
    Ответ написан
    1 комментарий
  • Как склеить байты правильно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    char ... c=0xA1

    здесь нужно использовать unsigned char, иначе после знакового расширения получишь гарантированно отрицательный результат

    Как склеить байты правильно?

    чтобы склеить байты правильно, нужно знать, какой порядок байт принят в этом файле. См. big endian, little endian.
    Ответ написан
    1 комментарий
  • Почему constinit помогает решить проблему static order initialization fiasco?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Единицы трансляции ведь загружаются в произвольном порядке?

    "загружаются" -- неподходящее здесь слово. Единицы трансляции связываются в единый исполняемый образ на стадии линковки и всё что в них было загружается одновременно.

    Каким образом наличие слова constinit в одной из единиц трансляции гарантирует, что она загрузится раньше?

    Это слово гарантирует, что такой объект будет инициализирован до начала динамической инициализации, см, а это всё, что требуется для решения проблемы static order initialization fiasco.
    Ответ написан
    Комментировать
  • Почему не выводятся данные в консоль?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как только я ввожу число литров и нажимаю энтер все сбрасывается и ничего не выводится. Код пишется в vscode, код пытаюсь запустить в самой консоли vscode. В чем может быть проблема?

    В том, что консоль с выводом программы закрывается сразу после того как программа заканчивается, а заканчивается она сразу после вывода. Одно из возможных решений -- запускать программу в отдельной консоли.

    Может с кодом что-то не то

    С кодом всё ок.
    Ответ написан
    1 комментарий
  • C++ CMake Как исправить ошибку?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Не могу понять в чем дело

    Судя по всему в макросе assert использован текст с какими-то забавными символами. Два очевидных способа решения:
    - можно эти строки удалить, в корректно написанной программе они ни на что не влияют.
    - можно разобраться с тем, что не так внутри assert. Начать можно, например, выполнив вместо компиляции препроцессирование (заменив в командной строке вызова gcc -c на -E) и почитав внимательно препроцессированный код в местах на которые ругается компилятор.
    Ответ написан
    Комментировать
  • Как исправить проблему с шаблонами?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ошибки вылезают в месте оператора перегрузки () и Image operator!() возникает ошибка.

    Это правильно. Нельзя перегрузить функцию (или оператор) только типом возвращаемого значения.

    Если убрать Image operator!(), то только одна ошибка ("невозможно преобразовать const_Ty в T&")

    Приведённый код эту ошибку не воспроизводит. Но вообще ничто не мешает добавить const в определение оператора !(), поскольку ему не требуется менять исходный объект:
    Image<T> operator!() const

    Но я вижу другую ошибку: оператор вызова функции определён как константный: T& operator()(int i, int j) const, но возвращает потенциально неконстантную ссылку на внутренности объёкта -- T&. Следующий код поэтому не будет работать: result(i, j) = -_data[i][j];. Нужно либо выбросить ссылку из возвращаемого значения оператора T& operator()(int i, int j) const и переписать реализацию оператора !(), либо добавить неконстантную реализацию оператора вызова функции.
    Ответ написан
    Комментировать
  • Реализую свойства, но почему у string требует перегрузку для cout?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Property<std::string> Name = Property<std::string>(_name);
    …
    std::cout << person.Name << std::endl;  // тут ошибки

    почему у string требует перегрузку для cout?

    Потому что Property<std::string> -- это не string. Хоть у тебя и есть Property<T>::operator T() const ничто в твоём коде не говорит о том, что Property<std::string> нужно пытаться приводить к string а не к какому-нибудь другому типу.
    Ответ написан
    1 комментарий
  • Почему SFML не линкуется к проекту?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Собрал SFML из исходников…
    main.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl sf::VideoMode::VideoMode(unsigned int,unsigned int,unsigned int)" (__imp_??0VideoMode@sf@@QEAA@III@Z) referenced in function main
    main.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: bool __cdecl sf::WindowBase::isOpen(void)const " (__imp_?isOpen@WindowBase@sf@@QEBA_NXZ) referenced in function main
    main.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: bool __cdecl sf::WindowBase::pollEvent(class sf::Event &)" (__imp_?pollEvent@WindowBase@sf@@QEAA_NAEAVEvent@2@@Z) referenced in function main
    main.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl sf::Window::Window(class sf::VideoMode,class sf::String const &,unsigned int,struct sf::ContextSettings const &)" (__imp_??0Window@sf@@QEAA@VVideoMode@1@AEBVString@1@IAEBUContextSettings@1@@Z) referenced in function main
    main.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __cdecl sf::Window::~Window(void)" (__imp_??1Window@sf@@UEAA@XZ) referenced in function main
    main.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual void __cdecl sf::Window::close(void)" (__imp_?close@Window@sf@@UEAAXXZ) referenced in function main

    В моей версии sfml эти символы определены в библиотеке sfml-window, которой у вас нет.
    Ответ написан
  • Утечка памяти gdiplus?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    что я должен удалять или очищать и как я должен это делать?

    MSDN говорит, что у каждого GdiplusStartup должен быть парный вызов GdiplusShutdown.
    Ответ написан
    1 комментарий
  • Где найти такую CLI?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Хочется как-то отойти от указания всех параметров а считать что есть некий контекст.

    Я вот так делаю в подобных случаях. Т.е. загружаю конфигурацию из конфиг-файла если он есть, а потом поверх неё -- из параметров командной строки. Среди которых могут быть другие конфиг-файлы.
    Ответ написан
    Комментировать
  • Пробую собрать bmminer-cgminer492, ошибка при сборке. Каких зависимостей не хватает?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    получаю следующую ошибку

    судя по тексту ошибок, всего хватает, но ошибки в коде. Я бы в cgminer.c добавил #include <inttypes.h>
    Ответ написан
    Комментировать