Задать вопрос
Ответы пользователя по тегу C++
  • Падает тест сложения двух чисел в столбик? Почему?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Или дебаггером пройдитесь, или добавьте вывод в тест. Ошибка может быть как в сложении, так и в сравнении в вашем SimpleVector.
    Ответ написан
  • Как в c++ сделать проверку на число и чтоб например если несколько точек в числе или минус в середине была ошибка и возвращало обратно к вводу?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Читайте строку. Потом каким-нибудь stol преобразуйте в число.
    Не забудьте использовать опциональный параметр idx, чтобы проверить, что вся введенная строка была распарщена.

    Так "123-32" распарсит 123 и вернет как число, но idx укажет на -, а не на конец строки.
    Ответ написан
    Комментировать
  • Как исправить ошибку error: invalid type argument of unary ‘*’?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Если вы разыменовываете указатель, то там должна быть точка вместо стрелочки (и скобки вокруг *s). Если вы хотите использовать ->, то вам не надо разыменовывать указатель.
    Ответ написан
    Комментировать
  • Как избавиться от лишнего куска фона текста, который торчит непонятно зачем, хотя я ничего лишнего не рисовал?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Выведите куда-нибудь в файл аргументы у функции outtextxy перед каждыймы вызовом.

    Я подозреваю, что черный фон - это следы кучи отрисовок текста с постеппенным сдвигов вправо.

    Но тут, я думаю, вы баг не исправите без рефакторинга кода. Его надо разбить на функции, исправиль логику, упрастить.
    Ответ написан
  • Почему здесь мемори лик, а здесь нет?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Оператор присвоения не проверяет, а были ли какие-то данные выделены уже. Когда вы используете код из вопроса в конструкторе, то numbers все равно создается и инициализируется конструктором по умолчанию, который выделяет память. Уже потом выполняется тело конструктора BigInt и вы затираете выделенный указатель другим указателем.

    Но у вас и в SimpleVector(const SimpleVector &other) ошибка - оно просто копирует указатель. После чего два экземпляра SimpleVector будут указывать на одни и те же данные. И оба попытаются удалить их в конце. Так что там у вас и доступ к удаленной памяти и двойное удалиение.
    Ответ написан
  • Как убрать залипание клавиш graphics.h?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Я так понимаю, что это проблема из-за консоли. Когда вы зажимаете клавишу, операционная система начинает спамить нажатия и посылает их все в консоль. А ваше приложение чистает по одному символу через getch и что-то делает.

    Вам надо избавиться от getch и вместо этого опрашивать систему, а не зажата ли какая-то клавиша.

    Способы сделать это платформозависимы. Например, в винде можно воспользоваться GetKeyState.
    Ответ написан
    1 комментарий
  • Как сделать словарь с кириллицей?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вам надо погуглить, что такое кодировки.

    Строка в C++ - это просто набор байт. Что они означают уже определяется кодировкой.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
  • При множественной декларации вызов через шаблон типа?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы бы хоть ошибку-то привели. У меня возникает:
    error: ISO C++ forbids declaration of 'call_func' with no type [-fpermissive]


    И чтобы ее иcправить, надо лишь дописать тип возвращаемого значения. Например:
    template<typename T>
    void call_func(T param) {sin(param);}
    Ответ написан
  • Как исправить ошибку компилятора?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Нет. Ошибка оператора. С++ компилирутется g++, а не gcc
    Ответ написан
    2 комментария
  • Равенство всех элементов в упорядоченном ассоциативном контейнере/динамическом массиве?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Самое быстрое решение - это написать свой контейнер, который будет складывать данные в обычный stl-ий контейнер, но при их изменении будет сравнивать их с заданным значением и поддерживать счетчик не равных заданному числу элементов (не нулевых в вашем примере).

    Тут все опрерации будут выполнятся за константое время. Быстрее никак. И расход памяти минимальный - один счетчик. Но придется много операторов методов реализовывать, если вы хотите эту вашу коллекцию использовать как обычные stl коллекции (итератор свой, всякие begin/end/size/operator[] etc).
    Ответ написан
    5 комментариев
  • Вывод в файл c++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Используйте std::vector. Если будет ругаться на отсутствие каких-то конструкторов, держите в векторе не сами ofstream, а указатели на них. Потом руками через new создайте классы.
    Ответ написан
    3 комментария
  • Как нарисовать ломаную линию по кликам мыши C++ WinAPI?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас каждый раз выполняется MoveToEx() в начало координат. Надо вам куда-то сохранить координаты последней точки и делать MoveToEx туда, потом LineTo в новые координаты и запомнить их.
    Ответ написан
    4 комментария
  • Как работает этот рекурсивный алгоритм разложения на слагаемые?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Функция генерирует все разбиения числа n на слагаемые не больше maxx. Ддя этого ыункуия перебирает, а какое же максимальное число будет в разбиении (цикл по i), берет это число и рекурсивно разбивает оставшуюся часть. Обратите внимание, в качестве maxx в рекурсии передается i. Ведь именно это было максимальное число в перебираемом разбиении. Значит следующее не может его превышать.

    Вся эта сложность с максимальным числом сделана, что бы не перебирать перестановки слагаемых. Ведь 4=1+2+1 можно по идее получить тремя способами, меняя порядок. Генерируя слагаемые в не возрастающем прядке, мы избавляемся от таких дубликатов.
    Ответ написан
    Комментировать
  • Почему не получается вывести из файла данные с помощью переопределенного оператора вывода?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Внимательно читайте свой код:
    std::ofstream out("/home/artem/Рабочий стол/EntryFile/NewFile");
    std::ifstream  in("/home/artem/Рабочий стол/EntryFilee/NewFile");


    Я пробелы расставил, чтобы строки выравнились. Найдите одно отличие.
    Ответ написан
    Комментировать
  • Как сделать чтоб игра продолжалась до тех пор пока все слова не будут угаданы и предлагаемые слова не повторялись?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Сначала перемешайте слова. Возьмите массив длины NUM_WORDS чисел и заполните его изначально индексами от 0 до NUM_WORDS-1. Перемешайте. Потом сделайте цикл по словам, который будет загадывать слово с индексом вот из этого массива. Внутри while(true) будет спрашивать пользователя, пока он не угадает. Т.е. вот этот ваш код весь выносится в отдельную функцию и вместо случайной генерации choice, получает его в качестве параметра. Можно через возвращаемое значение сообщать о том, что пользователь попросил выйти.

    И еще, чтобы перемешать случайно слово/массив индексов надо делать вот так (а не так, как у вас):
    for(int i = 0; i < length; ++i) //меняет буквы местами
        {
            int prev = (rand() % (i+1));
            char temp = jumble[prev];
            jumble[prev] = jumble[i];
            jumble[i] = temp;
        }


    Надо не менять местами два случайных символа, а менять i-ый со случайным предыдущим. А то у вас не все перестановки генерируются одинаково равновероятно.
    Ответ написан
    1 комментарий
  • Чем обусловлены различия в работе со строками и другими массивами?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Различия обусловнены тем, что строки - особый вид массивов. Весьма частый и использующийся повсеместно. Плюс, в отличии от обычных массивов, в строках есть нулевой завершающий байт. Поэтому некоторые вещи стандартом Си были добавлены в язык отдельно для строк. Как, например, инициализацию const char* строковым литералом, или инициализацию массива с рассчетом его размера (учитывая нулевой символ в конце). Оно же потом перекочевало в Си++.
    Ответ написан
    Комментировать
  • Как реализовать опциональные колбэки?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Тут похоже ошибка в архитектуре. Логичнее было бы сделать чтобы Lane::Place(Unit *) вызывало какие-то методы у Unit, если это надо для конкретной реализации Lane (Эта логика будет в виртуальном методе, переопределенном в конкретных реализациях интерфейса).

    Или Unit::OnPlaced(Lane*) всегда вызвает какие-то методы у Lane и вот они могут сказать, что Unit-у не надо ничего делать.

    Ну, или раз вам вот так хочется сделать, то пишите шаблонный метод Unit::OnPlaced(T*), И ручками прописывайне инстанциировки с кокретными SkyLane, GroundLane и т.д. Ну и "дефолтную" реализацию пропишите пустую - вообще ничего не делающую для типа T*
    Ответ написан
    Комментировать
  • C++ Как посчитать сколько из данных чисел кратны числу n и заканчиваются на 1?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Число кратно n, если остаток от деления на n равен 0. Получить остаток можно, воспользовавшись оператором деления по модулю: x%n. Сравнение с 0 делается оператором сравнения ==.

    Число заканчивается на 1, если последняя цифра равна 1. Цифру можно получить, взяв остаток от деления на 10 (см. оператор % выше). Надо этот результат сравнить с 1.

    Чтобы выполнялись оба условия, надо объединить их оператором логического И (&&).

    Чтобы подсчитать числа, в которых выполняются условия выше - надо пройтись по ним циклом (или 5 раз написать похожий код). Там надо через if проверить условие и, если оно выполняется, увеличить счетчик (можно вот так: ++cnt;

    В код переводите сами, это же ваше задание по изучению C++.
    Ответ написан
    Комментировать
  • Почему delete вызывает ошибку?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Первая ошибка:
    char *marka_ = new char;

    Тут вы выделяете память под ровно один символ. Строку туда читать не получится никак (не забывайте, что вам еще байт для нулевого символа в конце строки нужен).

    Вторая ошибка:
    char* m = "Renault"

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

    У вас вообще проблема тут - marka может указывать на выделенную вами в Input() память, а может указывать на переданную из вне память. Кто ее удалять должен-то? Так же в Input() вы можете переписать переданный в конструкторе указатель. А надо ли было его удалять классу?

    Я бы сделал в конструкторе всегда копирование переданной строки. Тогда можно будет передавать туда и строковые константы и использовать вот такое вот значение по умолчанию.
    Ответ написан
    Комментировать