Задать вопрос
Ответы пользователя по тегу C++
  • Что не так с кодом на C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    for (int i = 0; i<2; i++){
        group.PutCar(i,Car(marks[i],powers[i],costs[i],displaces[i]));
      }

    -- заполняет элементы группы 0 и 1
    group[2].Print();

    -- пытается напечатать элемент группы 2, не заполненный. Думаю, что дело в этом.

    Ещё пара глюков:
    void Group::Print(){
      for (int i = 0; i<sizeof(array); i++){
        array[i].Print();
      }
    };

    sizeof работает не так и тут делает не то, что вы ожидаете. Для количества элементов в группе используйте имеющийся в классе Group size.

    operator double (){
        int summ = 0;
        for(int i = 0; i < sizeof(array); i++){
        summ += array[i].getCost();
        }

    то же самое здесь.

    Традиционно добавлю, что правильным было бы использование std::string (в Car) и std::vector (в Group), но подозреваю, что это это было такое задание.
    Ответ написан
    Комментировать
  • Можно ли записать структуру в файл используя basic_ofstream?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Можно ли записать структуру в файл используя basic_ofstream?

    Можно, но для этого не нужно делать её тип аргументом шаблона basic_ofstream.
    Ответ написан
  • Почему переопределение метода без virtual -- это не переопределение?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если в официальной доке с++ где-то написано "переопределение возможно тогда и только тогда, когда есть virtual у метода базового класса"

    Написано, ровно это: eelis.net/c++draft/class.virtual#2

    то почему именно так?

    Потому что это определение термина function override в C++. Для других вариантов взаимодействия имён функций есть другие термины.
    Ответ написан
    Комментировать
  • Почему возникает ошибка при компилации gtest?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    не могу понять в чем проблема
    ошибка: undefined reference to `CheckUP::checkUP(std::__cxx11::basic_string, std::allocator >&, float&)'

    Проблема в том, что ты не слинковал свой тест с кодом реализующим класс CheckUP.
    Ответ написан
  • Что не так с функцией на C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    error C2835: user-defined conversion 'operator`double'' takes no formal parameters

    Он говорит тебе о том, что такая перегрузка: operator double (int limit) невозможна. Вторая ошибка -- это следствие первой.

    Определим в объекте Group две функции с одинаковым именем, например double Age(); и double Age(int limit);.

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    должна возникнуть ошибка, но по факту её не возникает.

    А ты собери свою программу с санитайзером памяти (-fsanitize=address) и будет тебе ошибка.
    Обращение к памяти за пределами выделенных массивов -- это UB, отсутствие видимого эффекта -- допустимый вариант поведения при UB.
    Ответ написан
    Комментировать
  • Как исправить ошибку "invalid use of incomplete type"?

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

    Перенести определения классов A и S после определения класса M, добавить объявление класса S перед определением класса D.
    Ответ написан
  • Почему в С++ появляется Segmentation fault?

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

    Да вот же она: Tree* head{0}; -- в head у тебя NULL.
    А std::cin >> head->sizeOfChild пытается читать в поле объекта на который указывает head.
    Ответ написан
    Комментировать
  • Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Никак не пойму что за ошибка, и что она хочет от меня.

    Ошибка -- обращение к памяти, к которой нельзя обращаться, первая ссылка по запросу sigsegv в гугле.
    Хочет она от тебя чтобы ты веделил память для colonies[i].aparts перед тем как к ним обращаться.
    Ответ написан
    Комментировать
  • Как исправить проблему с неоднозначностью?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    void EcsSystems::Add(IEcsSystem* system) {
      _systems.push_back(system);
    
      if (IRunSystem* runSystem = static_cast<IRunSystem*>(system)) {
        _runSystems.push_back(runSystem);
      }
    }

    Это странное решение -- сначала потерять всю информацию о типе, а потом м помощью каста выяснять, а каким же он был. К тому же здесь очевидно имелся в виду dynamic_cast, потому что результат static_cast для не-NULL аргумента всегда будет отличным от NULL.
    Ответ написан
    Комментировать
  • Откуда здесь NAN?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Помогите, пожалуйста

    Если MultiplyMatrices переписать как три обычных вложенных цикла, всё работает нормально.

    float* vMultiplyMatrices(const float* matrix_1, const float* matrix_2)
    {
            __m128 vector_2;//переменная для хранения значения второй матрицы
            __m128 result_vector;//переменная для записи итоговой марицы
            auto* result_matrix = (float*)_mm_malloc(N * N * sizeof(float), 16);//выделение памяти с выравниванием
    (2)     //memset(result_matrix, 0, N * N * sizeof(float));
            for (int i = 0; i < N; ++i) {
                    for (int j = 0; j < N; ++j) {
                            __m128 element_vector = _mm_set1_ps(matrix_1[i * N + j]);//4 позиции в одно значение
                            for (int k = 0; k < N; k += 4) {
                                    vector_2 = _mm_load_ps(&matrix_2[j * N + k]);//4 значение по адресу
    (1)                             result_vector = _mm_load_ps(&result_matrix[i * N + k]);
                                    result_vector = _mm_add_ps(result_vector, _mm_mul_ps(element_vector, vector_2));
                                    _mm_store_ps(&result_matrix[i * N + k], result_vector);
                            }
                    }
            }
            return result_matrix;
    }


    В отмеченной (1) строке ты загружаешь в result_vector неинициализированные значения из result_matrix и дальше используешь их в арифметике. Если раскомментировать memset (2), то выполнение доходит до конца без nan.
    Короче, разбирайся со своими векторными оптимизациями.
    Ответ написан
    Комментировать
  • Почему при использовании переменной в методе, выдает ошибку Linker Tools Error LNK2001?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему при использовании переменной в методе, выдает ошибку
    class Test
    {
      static std::string question;


    Потому что статическое поле класса нужно определить, его упоминание в определении класса -- это не определение. Определить его можно например так в .cpp вне всех функций:
    std::string Test::question;
    Ответ написан
    Комментировать
  • Почему при объявлении итератора выдается ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    ListIterator - это класс итератора, который у меня определён ниже основного класса

    Шаблон класса должен быть определён до его использования.
    Ответ написан
    Комментировать
  • Как получить указатель на функцию класса?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что будет?

    В данном примере -- то же самое, как если просто написать obj->execute(), т.е. виртуальный вызов конечного переопределения для функции obj1::execute в объекте класса obj3. См. eelis.net/c++draft/expr.call#3

    Я не понимаю как это будет работать с классами наследниками и виртуальной функцией.

    Если почитать соответствующую главу стандарта, то можно заметить, что виртуальные функции там вообще не обсуждаются. Всё специфичное для виртуальных функций поведение определено в разделе о вызове функций и не зависит от того, как именно вызываемая функция указана -- явно или через указатель на функцию класса.
    Ответ написан
    2 комментария
  • Почему пишет ошибка при чтении данных?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему в 93 строке (bptr = (schoolboy*)&a1;) пишет progress=<Ошибка при чтении символов строки>

    Я уверен, что пишет он это на самом деле вот здесь: cout << *bptr;, а происходит это потому что bptr указывает на объект, конечный тип которого -- class student. У такого объекта в его представлении в памяти нет никакого поля progress, поэтому код который пытается его вывести ведёт себя таким образом. Вообще это пример неопределённого поведения.

    как это исправить?

    Тут явно какая-то проблема в логике. Для начала надо понять, что ты вообще хочешь чтобы произошло.
    Ответ написан
  • С чем связяна эта ошибка (SFML)?

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

    похоже, что не до конца подключил, потому что ошибка в том, что не найдены символы из этой библиотеки во время линковки.
    Ответ написан
    2 комментария
  • Как записать в переменную типа char строку неизвестной длины из файла?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    C++
    Нужно в двумерный массив char записать эти строки

    Если это С++, то строки -- это std::string, массив -- это std::vector, используй std::getline и например std::vector::push_back.
    Если это массив char, то это C и выделение памяти по мере надобности функцией realloc.
    Ответ написан
    3 комментария
  • Где утечка памяти?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    for (size_t i = iters.size(); i < listsize; i++) {
        iters.push_back(new iterator(typesize));
      }

    для такого кода создания код удаления должен вызывать delete а не просто деструктор, т.е.
    for (size_t i = iters.size(); i > listsize; i--) {
            delete *iters.back();
            iters.pop_back();
          }


    iterator::~iterator() {
      for (stream::stream* s : usedbystreams) {
        s->killstream(0);
      }
      free(pointer);
      usedbystreams.clear();
    }

    И опять, ты вызвал s->killstream(0), привело ли это к удалению объекта на который указывает s?

    Вообще существуют инструменты для отладки работы с памятью, для gcc это прекрасный -fsanitize=address который покажет тебе при завершении программы, где была выделена утекшая память.
    Ответ написан
    Комментировать
  • По какой причине происходит дубляж реализации?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    webderiverxx все файлы .h, видимо реализация написана на .h файлах

    В .h файлах можно написать и так, что вот этого всего не будет. Если ты нам покажешь этот webdriverxx.h мы наверно сможем подсказать, что там нужно изменить для этого.

    есть лок в виде проверки препроцессора, почему неколько реализаций возникает, не совсем понятно

    Ты если такое говоришь, то, видимо, не вполне понимаешь, для чего используется защита макросом препроцессора.
    Ответ написан
  • Как лучше сделать параллельный for?

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

    В том, что std::for_each -- это алгоритм из стандартной библиотеки C++, а tbb::parallel_for -- это часть intel Threading Building Blocks. Если проект не использует TBB, то выбор очевиден. Если использует, то у tbb::parallel_for несколько больше возможностей по управлению разбиением интервала на части и выполнением рабочих потоков.
    Ответ написан