Ответы пользователя по тегу C++
  • Как передать 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.
    Ответ написан
    Комментировать
  • В чем может быть проблема при передаче контейнера "сложных" объектов по UDP?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вопрос:
    Как мне передать это по UDP пользуясь unix сокетами?

    Сериализовать в непрерывную область памяти, убедиться, что она влезет в UDP-пакет (а у него есть ограничение длины, чуть меньше 64Кб), передать, принять, де-сериализовать в свою структуру.

    это все ведь можно представить как набор данных, представить его как void * выделить под данные пол мегабайта, и отправить это все дело на сервер, а на сервере полученные данные скастовать обратно в std::unordered_map <uint64_t, Track> или нельзя так делать?

    Нельзя так делать, если не знаешь наверняка внутренней структуры того, что посылаешь. Потому что это твой std::unordered_map -- наверняка не один сплошной кусок памяти и содержит указатели. И когда ты его передашь на другую машину, указатели будут указывать неизвестно куда.
    Ответ написан
    2 комментария
  • Почему выбивает ошибку при получении объема тома?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему то при вызове GetDiskFreeSpaceEx() программа останавливается

    PULARGE_INTEGER Free;
        PULARGE_INTEGER Total;
        PULARGE_INTEGER TotalBytes;
    
      cout<<"\n\nСписок томов:";
    HANDLE search = FindFirstVolume(Volume, sizeof(Volume));
    do {
        cout <<"\n"<<Volume;
        GetDiskFreeSpaceEx(Volume, Free, Total, TotalBytes); //

    Потому что PULARGE_INTEGER -- это указатели (на что указывает P в начале имени типа согласно венгерской нотации). Ты вызываешь функцию с неинициализированными указателями, она пишет неизвестно куда, приложение падает.
    Правильно было бы сделать так:
    ULARGE_INTEGER Free;
        ULARGE_INTEGER Total;
        ULARGE_INTEGER TotalBytes;
    
      cout<<"\n\nСписок томов:";
    HANDLE search = FindFirstVolume(Volume, sizeof(Volume));
    do {
        cout <<"\n"<<Volume;
        GetDiskFreeSpaceEx(Volume, &Free, &Total, &TotalBytes); //
    Ответ написан
  • Почему не изменяются значения в Структуре?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    void CheckPressedKey(char** area, char** area_buf, int row, int col)
    {
      struct Ships ships;

    Структура ships -- автоматическая, существует на стеке только во время выполнения этой функции, создаётся (с неопределёнными значениями полей) при входе в неё и исчезает при выходе.
    Если ты хотел, чтобы она сохранялась между вызовами этой функции, нужно было добавить static: static struct Ships ships;. С этим изменением будет работать так как ты задумал, но наличие статических переменных в функциях -- не очень хорошая практика. Обычно лучшим решением является передача таких данных в функцию как параметра, например:
    void CheckPressedKey(char** area, char** area_buf, int row, int col, struct Ships *ships)
    Ответ написан
    1 комментарий
  • Не получается выводить символы в консоль с++. ?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    printf("%c", 26);
    Вместо этой записи должно вывестись
    ->

    Кто сказал?
    ASCII код 26 не имеет однозначного графического представления.
    Ответ написан
    2 комментария