Ответы пользователя по тегу C++
  • Как решить переписать wtoi лучше?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    constexpr const unsigned long long int wtoi(const wchar_t* str) {
      unsigned long long int result = 0;
      for (int i = 0; str[i]; i++) {
          int digit = getIntFromWchar_t(str[i]);
          if (digit < 0 || digit > 9)
               break;
          result = result * 10 + digit;
      }
      return result;
    }

    Обычно делают как-то так, это частный случай схемы Горнера.

    constexpr const int getIntFromWchar_t(wchar_t chr) {
      switch (chr)
      {
      case L'0':
        return 0;
      case L'1':
        return 1;
      case L'2':
        return 2;
      case L'3':
        return 3;
      case L'4':
        return 4;
      case L'5':
        return 5;
      case L'6':
        return 6;
      case L'7':
        return 7;
      case L'8':
        return 8;
      case L'9':
        return 9;
      default:
        return 10;
      }
    }

    Можно переписать так:
    int getIntFromWchar_t(wchar_t chr) {
        return chr - L'0';
        static_assert(L'1' == L'0' + 1);
        static_assert(L'2' == L'1' + 1);
        static_assert(L'3' == L'2' + 1);
        static_assert(L'4' == L'3' + 1);
        static_assert(L'5' == L'4' + 1);
        static_assert(L'6' == L'5' + 1);
        static_assert(L'7' == L'6' + 1);
        static_assert(L'8' == L'7' + 1);
        static_assert(L'9' == L'8' + 1);
    }
    Ответ написан
    2 комментария
  • Возможно ли обрабатывать строки в момент компиляции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    СЛУЧАЙНАЯ СТРОКА, КОТОРАЯ ГЕНЕРИРУЕТСЯ ПРИ КОМПИЛЯЦИИ

    Сомнительно выглядит новая случайная строка которая генерируется при каждой компиляции. Но даже если так, то простым и достаточно универсальным решением будет генерировать исходник с этой строкой, например скриптом или вызовом внешней программы. Эту генерацию можно вызывать по нужному событию (например, каждую компиляцию), или вручную. И дальше использовать этот исходник как любой другой.
    Ответ написан
    2 комментария
  • Почему сворачивается окно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему сворачивается окно?

    В твоём коде не создаётся ни одного окна. О чём ты вообще?
    Ответ написан
  • Почему клиент висит на recv?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему клиент висит на recv?

    Потому что с той стороны никто не прислал данных.
    Код не читал.
    Ответ написан
    Комментировать
  • Как передать unsigned char* байты в signed char*массиве?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    не работает(данные искажены). Как это исправить?

    Нужно разбираться, как именно и какие именно данные искажены.
    Я подозреваю, что неправильно посылается или принимается.
    Что такое "Записываю char[] как uchar[]" -- вообще непонятно, покажи код.
    Ответ написан
  • Корректно ли из разных потоков вызывать одну и ту же функцию?

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

    Зависит от того как устроен и куда обращается этот метод. Если он прямо или косвенно обращается к изменяемым глобальным данным без синхронизации или использования атомарного доступа -- может быть ошибка.

    Например, обращение к любой из переменных global/class_static/function_static в следующем коде -- потенциальная ошибка:
    int global;
    
    class B
    {
        static int class_static;
    public:
        void f()
        {
            static int function_static;
        }
    };
    Ответ написан
  • Почему переменная j = 0?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ты нигде не проверяешь, что все посланные тобой данные отправились. send может возвращать не только -1 или length, но и любой размер меньше length. То же самое с recv.
    Ответ написан
    Комментировать
  • Как увеличить частоту кадров при выводе в консоль строк?

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

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    htype_t htval;
    htval.num = 10;

    А почему бы для разнообразия не писать по правилам языка, например так (если, таки, С):
    htype_t htval = {.num = 10};
    или так (если, таки, С++):
    htype_t htval = {10};
    или даже так:
    htype_t htval;
    
    int main(int argc, char* argv[]) {
        htval.num = 10;
    Ответ написан
    Комментировать
  • Где я допустил ошибку в цикле for?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    x=x1;
    for (;x <= x1;)

    Подозреваю, что должно быть
    x=x1;
    for (;x <= x2;)
    Ответ написан
    Комментировать
  • В чём причина ошибки с _Pnext в C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В чём причина ошибки с _Pnext

    Отсюда не видно, но как минимум ты нигде не проверил, что входные файлы успешно открылись.
    Ответ написан
  • Что произойдёт при попытке получить доступ к адресу 0х0 виртуальной памяти?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В контексте языка С++ будет неопределённое поведение с непредсказуемыми последствиями. Оптимизирующий компилятор может реорганизовать последовательность выполнения программы рассчитывая на то, что разыменовываемый указатель в валидной программе не может быть равен 0.

    В контексте поведения программы, если доступ по адресу 0 произойдёт, поведение зависит от ОС/среды выполнения. Варианты -- программе будет послан сигнал SIGSEGV (POSIX), в программе произойдёт исключение (windows), доступ будет выполнен как к любому другому адресу (ОС без защиты памяти).
    Ответ написан
    Комментировать
  • Как задать поведение препроцессора C в GCC?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Смысл его прост: отменить действие макроса в определенной части кода, а по ее истечении восстановить этот макрос.

    Таким образом этого сделать нельзя. Потому что в месте где написано #define temp func значение макроса func не подставляется. В temp попадает буквально слово func. После #undef func содержимое макроса func будет потеряно. Это поведение предписано стандартом, мне неизветсны опции компилятора, которыми его можно было бы изменить. См. eelis.net/c++draft/cpp.replace#10 и eelis.net/c++draft/cpp.rescan

    Но если внести ещё один уровень косвенности, то можно сделать чтобы это работало. Например:
    #define foo bar
    #define func foo
    ...
    #undef func
    ...
    #define func foo
    Ответ написан
    3 комментария
  • Как подключиться к SQLite3?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    typedef int (*function);

    Это не определение типа указателя на функцию. Это указатель на int. Указатель на функцию выглядит как-то так:
    typedef int (*function)(void);

    status = sqlite3_open_v2(TEMP_DB_PATH, &sql_db, SQLITE_OPEN_READONLY, NULL);

    Это выглядит как обычное связывание. Потому что sqlite3_open_v2 выглядит как имя функции, а не указателя, полученного через GetProcAddress. Чтобы оно работало нужно правильное объявление функции sqlite3_open_v2 во время компиляции и нужно линковаться с implib sqlite3 во время линковки.
    Но в чём смысл мешать в одном и том же коде такое связывание и LoadLibrary/GetProcAddress?

    sqlite3_close(sql_db);

    Если sqlite3_close принимает параметр, этот параметр должен быть и в typedef которым определён его тип. Например:
    typedef sqlite3;
    typedef int (*fn1) (sqlite3* db);
    Ответ написан
    Комментировать
  • Почему выбивает ошыбку Error ld returned 1 exit status?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему выбивает ошыбку Error ld returned 1 exit status?

    Потому что ты объявил

    void InitPhotoFrame(int, int, int, int);
    и вызвал
    InitPhotoFrame(200,200,0, Edge);
    функцию с четырьмя аргументами, а определил
    void InitPhotoFrame(int x1, int y1, int z1, int m, int n)

    -- с пятью.
    Ответ написан
  • Как передать управление в __asm?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как правильно передать управление в __asm?

    Проблема не в том, что ты "не смог передать управление в __asm", а в том, что внутри __asm ты перепутал порядок аргументов функции TerminateProcess: аргументы передаваемые через стек в конвенции __stdcall кладутся на него в обратном порядке. Попробуй
    __asm {
          mov eax, hProcess
          push 0
          push eax
          call TerminateProcess
        }
    Ответ написан
    Комментировать
  • Как исправить код умножения матриц?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Код умножает матрицу на эту же транспонированную матрицу.

    Приведённый код почти умножает две разные матрицы. Если перенести MulMatr[i] = new int[c2]; из цикла по j на один уровень выше в цикл по i -- будет хорошо умножать. Но к сегфолту это отношения скорее всего не имеет.
    Что вызывает вопросы -- так это то, что ты не проверяешь, что r2 == c1.

    Работает при размере матрицы n*m, n<=m, если n>m выдает System.AccessViolationException.

    Покажи весь код.
    Ответ написан
    5 комментариев
  • Можно ли создать шаблон только для одного метода класса?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Можно ли создать шаблон только для одного метода класса?

    Да, можно. В чём сложность взять и попробовать?
    class C {
    public:
        template<typename T>
        void f(T v)
        {
            ...
        }
    };
    Ответ написан
    2 комментария
  • Как присвоить пару?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему вот это не компилируется?

    Потому что первый элемент пары -- константа, присваивать ему нельзя.

    если строки не константны - то все работает

    Ну да, что тут удивительного?
    Ответ написан
    1 комментарий
  • Что не так с class Vector?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    предполагаю где-то накосячил в Vect, подскажите где именно?


    Накосячил вот здесь:
    inline void push_back(const T &elem)
        {
            capacity;
            pvector[size] = elem;
            ++size;
        }

    Ты забыл выделить память под pvector, и поэтому получил segfault.
    Ответ написан
    Комментировать