Ответы пользователя по тегу C++
  • При запуске проекта на 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 комментариев
  • Как добавить в `std::map` объект с константными полями?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Храните в std::map указатели на ваш тип. Лучше умные, вроде shared_ptr.
    Ответ написан
  • Выводятся какие-то цифры и ошибка, что не так?

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

    Смотрите внимательно, где вы к нему обращаетесь. Особенно на arr[j + 1]. Какие значения может принимать j? Какой размер массива и, соответственно, к каким индексам можно обращаться?
    Ответ написан
    Комментировать
  • Как определить, можно ли из символов первого массива создать строку идентичную второму массиву?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Подсчитайте, сколько каждого символа встречается в первой строке и убедитесь, что во второй - их не больше.
    Самый простой способ сделать это - это завести массив счетчиков на 256 элементов. Для символов первой строки увеличивайте счетчик по индексу static_cast<int>(s[i]) на 1, для второй строки - вычитайте 1. Если где-то получили -1, то составить нельзя.

    И еще, это же у вас C++, судя по тегам и cin? Ну так используйте std::string. Зачем вы сишные строки выделяете?
    Ответ написан
    Комментировать
  • Насколько мой код читабелен?

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

    Вместо набора функций, которые возвращают и принимают IntList1D, стоит завести класс, который содержит в себе указатель на начало списка. У этого класса должны быть методы initalize, is_initialized, pushBack, и т.д. Это сократит код немного и сделает его гораздо более логичным.

    Тип элемента списка вы объявляете как приватный класс-член в классе списка, и он не будет засорять пространство имен пользователей вашей библиотеки. Им о нем вообще знать не надо, они хотят в ваш список класть int и получать назад int.

    Далее, вы пишите контейнер, в идеале его стоит сделать по образу и подобию стандартных контейнеров. С итераторами и т.д. Чтобы с ними было можно работать точно также. Но, если не потянете, то хоть обзовите методы также, как у стандартных (push_back(), empty(), см std::vector, например).

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

    Потом, часть функций называется частично большими буквами, частично строчными. Это вообще зачем? APPEND_FRONT_Link? Соблюдайте единый стиль хотябы в одном названии. Если они отличаются от appendFront тем, что они не предназначены для пользователей библиотек, ну так это как раз аргумент в пользу использования классов. Делаете эту функцию приватным методом. И такие обычно называются с суффиксом Impl (от implementation) - appendFrontImpl.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы передаете в std::thread не статический метод класса. Его нельзя передавать как обычную функцию. Его же можно вызывать только у какого-то объекта. Где thread этот объект возьмет-то?

    Есть 2 варианта - передавайте лямбду, которая будет захватывать this и вызывать у него метод объекта.
    Или, как показано тут, передавайте туда &Matrix::findNumberInRow c первым аргументом this.
    Ответ написан
    Комментировать
  • Почему создаётся бесконечный указатель в дереве?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вот этот код создает кольцевую ссылку:
    if (left) {
            tree->left = readElement(tree);
        }


    Что вы там пытаетесь сделать? Если вы хотите прочитать элемент в дерево, то ваща readElement(tree) вернет указатель на новый корень. Если выхотите добавить в левое поддерево (и грантируете, что следующий элемент будет меньше корня), то надо добавлять в tree->left а не tree.
    Ответ написан