Ответы пользователя по тегу C++
  • Что возвращает return в С++?

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

    Советую всем программистам на C++ хотябы почитать про ассемблер.
    Стек, регистры, вот это вот все. Тогда станет понятно, как работает процессор.

    Тогда станет понятно что "сам объект tmp" никак не вернуть. Это локальная переменная, лежащая на стеке в части, которая будет отброшена при выходе из функции. Отсюда вытекает, что вообще говоря, там должна быть копия.

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

    Если код и включенные оптимизации позволяют это сделать - то копии не будет. Но в общем случае - будет копия.
    Ответ написан
    Комментировать
  • Как записать формулу на c++?

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

    Дальше вам остается только скомбинировать как записано в задании.
    Ответ написан
    Комментировать
  • Как работает long long int в C++?

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

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

    Ничем. В консоли можно вводить только числа. А вот что за единицы измерения у этих чисел - это уже вам решать, как их интерпретировать. Хотите, чтобы введенное число было градусами - ну так просто интерпретируйте его как градусы (еще хорошо бы переменную назвать так, чтобы по названию была видна единица измерения. Например angle_deg).

    Со вводом разобрались. Осталось интерпретировать переменную как градусы. Как к ней прибавить 45 градусов? Как к 2 яблокам прибавить 3 яблока и получить 5 яблок? Градусы с градусами можно складывать точно так же. Тупо прибавьте 45 к числу в переменной.

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

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

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

    Кстати, по английски этот обмен - "swap".
    Ответ написан
    9 комментариев
  • Как получить публичный ключ из приватного?

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

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

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

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

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Если нет пауз между буквами, то задача однозначно не решается:
    Например, "vz" и "3d" одинаково кодируются "...---.." ("...-- -.." и "...- --..").
    В худшем случае, неправильная интерпретация первых символов может сделать расшифровку в самом конце невозможной.

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

    Тогда надо разбить строку на отдельные "слова" - группы тире и точек, разделенные пробелами и каждую группу перевести в букву по таблице. Таблицу в идеале надо хранить в trie ("бор" по русски), но эта структура не реализована в стандартной библиотеке C++, поэтому можно воспользоваться просто std::map<std::string, char>

    Edit: Разумеется, таблица для обратного перевода должна быть отдельной переменной. Не получится смешать в одну кучу переводы и туда и обратно.
    Ответ написан
    Комментировать
  • Как скопировать строку в строку?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Что такое Im? Судя по "->" - это указатель. Вы кладете в вектор указатель. И у вас получается вектор из кучи указателей, которые все указывают на одну и ту же область памяти. И вот в эту область памяти вы в цикле постоянно записываете path. В итоге там останется только последняя запись.

    Вам надо в векторе хранить не указатели на ваш класс/структуру, а сами объекты.
    Ответ написан
    1 комментарий
  • Как правильно сортировать файл?

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

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

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

    Что такое "абстрактный класс" знаете?

    Когда прочтете в гугле определение, почитайте текст ошибки - там имя класса указана. Вот откройте исходники этого класса и исправьте там ошибку.
    Ответ написан
    Комментировать
  • Может ли метати стать типом объявлемого уникального указател в шаблоне интерфейса при реализации интерфейса в конечном классе?

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

    Ошибка C2989 "класс шаблон уже объявлен как не класс шаблон" означает, внезапно, что класс-шаблон уже объявлен где-то как не шаблон. Имя класса в ошибке тоже присутствует: "Машинный::Интерфейсы::ИСистемаОбменаСообщениями"

    Итак, вы заводите шаблон ИСистемаОбменаСообщениями. Но где-то еще в этом же модуле трансляции (смотрите всякие включенные хедеры тоже) уже есть ИСистемаОбменаСообщениями - только объявленная как класс.

    Ищите по исходникам все места, где ИСистемаОбменаСообщениями встречается и смотрите. Может у вас где-то forward declaration есть неправильное (вроде class ИСистемаОбменаСообщениями; вместо template <...> class ИСистемаОбменаСообщениями;). Или класс с таким же названием.

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

    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++ - это просто набор байт. Что они означают уже определяется кодировкой.

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