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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Выводится ровно то, что вы попросили выводить - неинициализированный элемент массива c.
    Подумайте, чему равно a в конце программы?
    Ответ написан
    6 комментариев
  • Почему меняется значение переменной после передачи значения в функцию (C++)?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас в input_matrix выход за границы массива: в массиве n-1 элемент, а вы читаете n.

    Массив лежит на стеке, там же где локальная переменная n. Так получилось, что n лежит сразу за matrix (или в пределах восьми байт) и оказывается испорчена. Данные кажутся вам случайными, потому что читаете вы double и какая-то его часть попадает в область памяти int n.
    Ответ написан
  • Почему дружественная функция, определённая внутри класса с первым параметром встроенного типа, недоступна вне определения класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы пытаетесь вызвать f1 и т.д., как будто это члены класса A. Но подумайте, какой смысл объявлять члены класса friend? Зачем вообще дружественность нужна? Чтобы иметь доступ к приватным членам класса, но ведь члены класса и так имеют туда доступ. Это бесмыссленная операция.

    Но так уж стандарт сделан, что вместо ошибки компиляции, определенные через friend функции становятся глобальными.

    По идее вы в классе должны их только объявлять (сигнатура без тела), а определение (тело функции) должно быть уже снаружи где-то, как вы с f1 сделали.

    Почему f5 не находится? Попробуйте передать туда, допустим a. Компилятор, внезапно, найдет функцию и ругнется, что не может преобразовать A к int. Но если передать туда int, то компилятор функцию потеряет.

    Тут хитрая магия описанная в стандарте - всякие нагромождения правил посика имен.
    В стандарте сказано, что вот при определении friend функций:
    A name first declared in a friend declaration within a class or class template X becomes a member of the innermost enclosing namespace of X, but is not visible for lookup (except argument-dependent lookup that considers X) unless a matching declaration at the namespace scope is provided - see namespaces for details.


    Я не знаю, как это внятно объяснить, вот просто не работает и все. Стандарт такой. С остальными функциями срабатывает, потому что там в аргументах есть A, поэтому объявления в классе каким-то образом попадают в область поиска имен.

    Просто не надо определять функции-друзей в классе. Это не имеет смысла. Или делайте там статичные функции, или определяйте всю функцию во внешнем пространстве имен а в классе указывайте, что она имеет доступ ко всему классу.
    Ответ написан
    1 комментарий
  • Решение задачи совсем не пойму ее?

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


    А с массивом-то сделать можете?
    Ответ написан
    Комментировать
  • Яндекс.Практикум C++ Что я делаю не так?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вся проверка должна быть query[i] == ' '

    to_string(32) - вернет вам "32" вместо пробела. Тогда уж можно делать (char)32 или static_cast<char>(32). Но ' ' - все равно лучше.

    И еще вы не выводите длину всей строки в конце - ведь там всегда заканчивается слово (может быть пустое).
    Ответ написан
  • Как посчитать количество циклов у перестановки?

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

    Поэтому, алгоритм простой - посчитать циклы по одному.
    Фактически, перестановка - это граф и вам надо подсчитать в нем количество компонент связности. Надо использовать DFS. Но граф очень простой, поэтому DFS выраждается в тупо цикл.

    Заведите массив флагов длинной с перестановку. Пройдитесь по всем позициям и, если текущая не помечена, запускайте от нее второй цикл, который пометит ее и перейдет в позицию по перестановке (row[i]) и пометит там и опять перейдет и так далее, пока не наткнется на уже помеченную позицию. Так вы побойдете один цикл и пометите все позиции в нем. Поэтому прибавьте 1 к счетчику, когда будете запускать внутренний цикл.

    В решении будет 2 вложенных цикла, внешний - удобнее всего делать for, внутренний можно тоже делать for или while, но в for будет вместо инкримента переход по перестановке. И эти 2 вложенных цикла суммарно обойдут все позиции по одному разу, поэтому время работы алгоритма - линейное.
    Ответ написан
    Комментировать
  • При запуске проекта на SFML выпадает ошибка?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Похоже какие-то ошибки работы с памятью.
    Вы где-то чего-то не так делаете: или за границы массива вылезаете, или делаете use after free, или еще какая-то ошибка.
    Если ваш код не большой, то приведите его (в тегах code!).
    Ответ написан
  • При запуске программы на sfml в release, выдает46 ошибок?

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

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

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

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

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

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

    Вместо собственных list-ов, вы храните ребра в vector. По производительности будет даже быстрее из-за локальности. А добавление в вектор один раз кучи элементов работает за линейную сложность. Но если вам надо собственную реализацию, то вы всегда добавляйте в начало списка. Потому что рекурсивный поиск конца списка и добавление туда - это квадратичный алгоритм на ровном месте.

    Опишите ваш алгоритм словами, что должна делать функция findLength? Искать позицию заданного элемента в списке?

    Похоже у вас граф взвешанный, и единственный доступный вам способ в таком графе - это поиск кратчайших путей от каждой вершины до каждой. Тут хорошо подойдет алгоритм Флойда. Или, если у вас граф разряжен - Дейкстры.
    Ответ написан
  • Переменная char. Вроде, как заменил буквы, но текст не выводится. Почему?

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

    А вообще, судя по этому коду - бросайте программирование. Не для вас это. У вас там косяк в каждой второй строчке.
    Ответ написан
    7 комментариев
  • Как решить ошибку?

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

    Кстати, у вас в stock - мешанина какая-то. Часть методов (конструкторы, например) определены прямо в хедере, часть - в cpp файле. Не надо так делать.
    Ответ написан
  • Есть ли у c++ собственные возможности работы с графикой?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Можно через системные функции что-то рисовать. Если хочется 3d графики и задействовать видеокарту, то, теоретически, можно с нуля написать свою обертку над видео драйвером. На практике - это сравнимо по сложностью с написанием собственной операционной системы.
    Ответ написан
    6 комментариев
  • Как удалить элемент вектора по индексу?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Не работает ваш код потому, что, допустим при i==3 вы удаляете элемент. Теперь элементом по индексу i будет следующий за удаленным элемент. Вы его не проверите и в конце итерации i увеличится на 1. Таким образом, следующие за удаляемым элементом вы просто пропустите.

    Есть много способов исправить эту оплошность:
    1) При удалении уменьшайте i на 1, чтобы следующее i++ от цикла for было отменено.
    2) Вместо цикла for используйте while, где вы инкрементируете i только если элемент не удаляется.
    3) Вместо if используйте цикл while, который удялял бы элемент в позиции i, пока его надо удалять (не забудьте проверить, что элемент, таки, существует - вы могли удалить последний элемент и i станет за границей массива).
    4) (лучший вариант) Используйте remove. Мало того, что вам не надо изобретать велосипед, так этот метод еще и будет на порядок быстрее удаления по одному элементу. Потому что при каждом удалении у вас сдвигается часть массива и вы получаете квадратичное время работы на ровном месте.
    Ответ написан
    Комментировать
  • Из-за чего объект regex = Ошибка при чтении символов строки?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас дла regular в программе - это и член класса Parsing и локальная переменная в функции Parse. Инициализируется чем-то только локальная переменная.

    Где конкретно и на что именно вы в дебаггере смотрите, мне не понятно, но скорее всего ошибка в том, что вы смотрите не туда.
    Ответ написан
  • Как решить проблему?

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

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

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

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

    Можно же проверить самостоятельно. Технологии нынче - все легко. Вот: https://godbolt.org/z/PKWPdY4nn

    Как видите, и то и другое компилируется в практически одинаковые инструкции:

    eax, DWORD PTR MyGlobalPool[rip+4]
    ...
    eax, DWORD PTR MyPool1::numOfAllocatedObjects[rip]


    И там и там просто загрузка какого-то статичного адреса глобальной переменной. Вообще говоря, в случае с глобальной переменной компилятор мог бы сдлеать и 2 действия: взять адрес переменной и прибавить смещение поля. Но он, как видите, достаточно умный, чтобы сделать все в одну инструкцию.
    Ответ написан
    Комментировать
  • Как удалить все объекты производных классов по общему полю в динамическом массиве?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    У вас там такая мешанина... Перепишите с использованием std::vector. Когда вы пытаетесь одновременно использовать указатели на классы и указатели, как массивы, вы все путаете.

    Сейчас вы в Delete передаете первый элемент массива (его значение), а не указатель на сам элемент, как массив. Далее, даже если вы там исправите на массив указателей, изменение внутри функции Delete снаружи видны не будут, потому что вы просто переписываете переданный по значению указатель. Если уж хотите с Сишными массивами работать, то вам там придется передавать указатель-на-указатель-на-указатель. Говнокод же получается, передавайте ссылку на вектор указателей.

    Используйте ключевое слово override везде, где вы хотите переопределить методы в унаследованном классе, тогда вам компилятор укажет на ошибки в вашем коде.

    Ну и зачем вам виртуальное GetDest, если оно нигде не перегружается наследником?
    Ответ написан
    7 комментариев