Ответы пользователя по тегу C++
  • Что делать, если появляется непонятная ошибка после запуска c++ кода?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что делать, если появляется непонятная ошибка после запуска c++ кода?

    Пытаться понять её -- универсальный рецепт.

    это исходный код.
    thread my_thread1(&connecter);
    if(connfd == true)

    В этом месте две ошибки. Первая -- ты сравниваешь int connfd с bool true, а вторая -- ты делаешь это без уважения потоконебезопасным способом. Прямо скажем, у тебя тут гонка между main и connecter. Когда ты эту гонку исправишь, жизнь твоя, скорее всего, наладится. Непонятно, правда, зачем ты вызываешь accept в параллельном потоке вместо того, чтобы сделать это синхронно, прямо в main.
    Ответ написан
    Комментировать
  • По какой причине метод не определён?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    По какой причине не видятся методы .x .y
    sqrt(x<T>()^2 + y<T>()^2);

    А почему ты думаешь, что это шаблонные методы? Вот здесь
    var_type name (var_type value = 0) { \
    определение совсем не шаблонное. Т.е. надо выкинуть <T>. А когда ты так сделаешь, x и y станут независимыми именами, и чтобы компилятор их нашёл в родительском классе надо будет либо добавить перед ними this->, либо как-нибудь ещё ему подсказать.
    Т.е. вот так должно бы работать:
    template<typename T>
    float DVector(2)<T>::length()
    {
        return sqrt(this->x()^2 + this->y()^2);
    }


    И, кстати, ^2 -- это (без дополнительных усилий) не возведение в квадрат.
    Ответ написан
  • Как исправить ошибку Memory limit?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Подозреваю, что дело в локальных переменных i и j в строках 42 и 43 и использовании какого-нибудь старого стандарта C++ продлевающего их области действия до конца охватывающего блока, из-за чего в check не отрабатывает условие в строке 30. Предлагаю убрать int в строках 42 и 43.
    Ответ написан
  • Массив указателей на функции. Почему программа не даёт результат?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Мне нужно выполнить функцию, из массива указателей на функцию, номер которой я укажу в консоли. Почему не выполняется?

    Потому что mass[0]; -- это не вызов функции, а просто указатель. Вызов функции выглядит так: mass[0]();
    Ответ написан
    Комментировать
  • Как исправить ошибку E0304?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Не понимаю, откуда эта ошибка появляется


    Здесь написано, что create_huge_matrix принимает два аргумента, и второй имеет такой же тип, как тип элементов внутреннего вектора:
    template <typename T>
    void create_huge_matrix(std::vector<std::vector<T>>& matrix, T lowerLimit);


    а здесь первый аргумент типа std::vector<std::vector<double>>, а второй -- int:
    create_huge_matrix(matrix_s, 5);

    а здесь вообще только один аргумент:
    create_huge_matrix(matrix_p);
    Ответ написан
    Комментировать
  • Как описать перегрузку оператора умножения?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    перегрузка оператора должна скалярно умножать два массива. Под этим подразумевается, например: массив1 - 3,2; массив2 - 5,1, скалярное умножение: 3*5 + 2*1 = 17

    LabArray operator* (const LabArray& other) {
          double sum = 0;
            for (int i = 0; i < size; ++i) {
              sum += Array[i] * other.Array[i];
            }
          return sum;
        }

    Если результатом должно быть число и возвращаешь ты double, то почему тип возвращаемого значения -- LabArray?
    Ответ написан
    Комментировать
  • Как проверить число ли подается на вход?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    isdigit

    проверяет, является ли символ цифрой или нет. Помогло бы вам, если бы вы получали из стандартного ввода строку и сами переводили её в число. Но нет, операция
    int count_students;
      cin >> count_students;

    вводит не строку, а число.

    Чтобы проверить, был ли ввод успешным или нет можно вызвать cin.fail(), типа того:
    cin >> count_students;
      if (cin.fail()) {
        cout << "Неправильные входные данные. Попробуйте еще раз.";
        cin.clear();
        cin.ignore();
        goto Step1;
      }
    Ответ написан
    1 комментарий
  • Как на Linux читать и изменять память процесса?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Классический способ состоит в использовании системного вызова ptrace с кодами запроса PTRACE_ATTACH для присоединения к процессу, PTRACE_PEEKTEXT и PTRACE_POKETEXT для чтения и записи его памяти и PTRACE_DETACH для отсоединения.
    Ответ написан
    Комментировать
  • Ne sovsem ponyatno kak ispravit, kto podskajet?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ne sovsem ponyatno kak ispravit

    смотреть не туда, куда ты смотришь сейчас (не на определение COMPILE_TIME_ASSERT, с ним всё ок, оно такое, чтобы генерировать ошибку компиляции, когда какое-то условие в коде не выполняется), а в строку
    ../deps/source-sdk-2013/mp/src/public/tier0/threadtools.h:1130

    где этот assert сработал, и разбираться с ней.
    Ответ написан
    6 комментариев
  • В чем заключаются ошибки и как их исправить?

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

    Когда ты на С++ пишешь строки подряд, вот так:
    "push edi"  
    "push esi"
    "mov edx,lenS"
    ...

    они склеиваются в одну строку. Когда ассемблер видит команду "push edipush esimov edx, lenS..." он резонно недоумевает.

    как их исправить

    Вставить символы конца строки \n или другие разделители инструкций в ассемблерный код.
    Ты же просил пример кода, вот же он, он компилируется и работает, воспользуйся им. Если непонятно что там написано, задавай вопросы.
    Ответ написан
  • Какие варианты есть здесь для реализации ассемблерной вставки?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    мне бы не помешали еще примеры хорошие

    вот тебе пример переставляющий первую и последнюю буквы:
    #include <iostream>
    
    int main()
    {
        char s1[] = "Hola queridos amigos";
        char tmp;
        asm ("mov (%[left]), %[tmp]\n\t"
             "xchg (%[right]), %[tmp]\n\t"
             "mov %[tmp], (%[left])\n\t"
             : [tmp] "=&q"(tmp)
             : [left] "r"(s1), [right] "r"(s1 + sizeof(s1) - 2)
             : "memory");
        std::cout<<s1<<std::endl;
        return 0;
    }
    Ответ написан
  • Ошибка с подключением к самописному ftp серверу, в чем проблема?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    в чем проблема?

    У тебя гонка между этим:
    if(pthread_create(&tid, NULL, new_connection, serv)) qDebug() << "ошибка создания потока подключения";
            server->num_of_users++;

    и этим:
    descriptor = *(server->sa[server->num_of_users-1]);


    С точки зрения работы с потоками код написан никак.
    Ответ написан
  • Как проверить, является ли файл PE? (то есть, .exe он или нет)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    не понимаю, чем в данном случае является szFile

    Судя по тому, как он используется, szFile -- указатель на буфер с содержимым файла. Почему такой странный выбор типа -- действительно непонятно, логично было бы использовать const void *.
    Ответ написан
    Комментировать
  • Корректно ли сравнивать цифры объявленные как строки, т.е объектом string?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как в ситуации ниже, поступает компилятор?

    Компилятор вставляет вызов string::operator <. Если это std::string, то оператор выполняет лексикографическое сравнение, т.е. сравнивает символы обеих строк по очереди до первой различающейся пары, меньшей будет та строка, которой принадлежит символ с меньшим кодом.
    В примере "100.05" < "100.03" результат будет false потому что 5 > 3.

    Могут ли быть какие-то проблемы

    Для такого сравнения строковые представления чисел должны начинаться разрядами одного веса. Т.е. можно сравнивать "100.05" и "099.1" (первая цифра и слева и справа -- сотни), но нельзя сравнивать "100.05" и "99.1" (слева первая цифра -- сотни, справа -- десятки).
    Ответ написан
    Комментировать
  • Инициализация объединения из двух энумераций?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Второй вариант инициализации не работает

    Ну да, не работает. Таким образом можно инициализировать только первый элемент union. Есть ещё вот такой вариант инициализации, начиная с C++20.
    Ответ написан
    Комментировать
  • Есть ли аналог std::string в драйвере уровня ядра windows?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть UNICODE_STRING: см.
    Ответ написан
    Комментировать
  • GetWindowText() записывает в массив char'ов через символ, как решить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    GetWindowText() записывает в массив char'ов через символ
    GetWindowText(obj.hEDIT,(LPWSTR)&msg, sizeof(msg));

    Если это массив char, то надо использовать GetWindowTextA и не приводить указатель на массив к типу LPWSTR.

    Последний аргумент GetWindowText, кстати, это не размер буфера, а количество символов в нём, так что туда надо (было бы) передавать не sizeof(msg) а sizeof(msg)/sizeof(*LPWSTR).
    Ответ написан
    Комментировать
  • Почему не выводится последнее значение?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    "11 22 22 33 33 33"
    Должно вывестись:
    "11 occurs 1 times
    22 occurs 2 times
    33 occurs 3 times"
    но "33 occurs 3 times" не выводится в консоль. В чем может быть причина?

    if (val == currVal) ++cnt;
                else 
                {
                    std::cout << currVal << " occurs " << cnt << " times " << std::endl;

    В том, что после 3го "33" по-прежнему выполняется ветка if (val == currVal) ++cnt;.
    Ответ написан
    3 комментария
  • Срываются ли вызовы функций выгрузки библиотек?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    При краше приложения вызывается ли функция выгрузки у библиотек?

    Если приложение валится от необработанного исключения, то, согласно описанию RaiseException, действие по умолчанию -- вызов ExitProcess. При завершении приложения через ExitProcess у загруженных библиотек будет вызван DllMain с кодом DLL_PROCESS_DETACH.
    Ответ написан
    Комментировать
  • Как правильно вывести массив символов?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    проблема в том, что вместо массива символов программа выводит просто пустую строку.

    программа выводит пустую строку, потому что в tmp -- пустая строка. Потому что i = strlen(str) помещает в i индекс 0-терминатора строки str, а не последнего символа перед ним. И в конце строки tmp сейчас нет 0-терминатора, так что puts(tmp) выведет мусор после перевёрнутой строки, если поправить инициализацию i.
    Ответ написан
    3 комментария