Ответы пользователя по тегу C++
  • Как объявить функцию в другой функции?

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

    Перед F напишите
    int G(int n);

    Это скажет компилятору, что есть вот такая функция. Ее определение же остается также дальше по тексту после F.
    Ответ написан
    Комментировать
  • Есть ли смысл в уточнении типов данных чисел? И что это даст?

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

    Оптимизировать же переменные смысла нет никакого. Сэкономите пару байт буквально.
    Ответ написан
    Комментировать
  • У меня несколько ошибок "was not declared in this scope" в коде C++, что делать?

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

    И так по каждой ошибке от компилятора в вашем вопросе. Смотрите на какое имя он ругается и где эта функция/переменная определена.
    Ответ написан
    1 комментарий
  • Как правильно применить абстрактный класc здесь?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Пометьте все методы DVector(2) в Vector2.h override. Посмотрите на ошибки компилятора.
    Ответ написан
    4 комментария
  • Реализация обоюдного включения файлов проекта?

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

    В особо запущенных случаях придется какие-то функции или классы дробить.

    Ну и Include guard'ы используйте
    Ответ написан
    Комментировать
  • Почему не работает с char[]?

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

    Это же c++, судя по тегам? Сделайте тогда все поля структуры static const и не заводите ее экземпляр. Обращайтесь к константам так: MqttConfig::host. Константы обычно задают так, а не значениями по умолчанию полей структуры.

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

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

    Несовподают типы, об этом вам компилятор и говорит.
    Ответ написан
  • Как исправить ошибку Memory limit?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ошибка в функции check. Вам тогда надо проверять, что текущее расстояние до ii, jj меньше или равно расстояния до i,j +1. Чтобы вы возвращали 0, если нет смысла переписывать расстояние и добавлять вершину в очередь.

    Из-за этого у вас каждая вершина может быть в очереди кучу раз.

    Вообще, по уму, надо бы завести массив bool пометок и их использовать чтобы помечать, а бала ли вершина в очереди уже. И проверять в check эти пометки вместо неявной логики на основе расстояния. Плюс у вас там используются глобальные i, j, что делает чтение этой функции очень неудобным. Такая неявная передача параметров - очень плохая идея.
    Ответ написан
    Комментировать
  • Почему при вычитании двух вещественных результат неправильный?

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    f(std::string("abc"))

    Каких-то специальных встроенных в язык средств созадавать const std::string нету.
    Ответ написан
    2 комментария
  • Как можно ускорить алгоритм?

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

    Проблема в том, что если число K простое - то вы будете проходиться до него. Есть трюк - достаточно проверять только числа до корня из K. Ведь если у числа есть какой-то минимальный собственный (меньше него самого) делитель, то он точно меньше корня (потому что делителей как минимум два, и если минимальный из них больше корня, то их произведение - больше самого числа).

    Если вы не нашли делителя до корня, то число простое и в качестве делитеял можно брать все K и тогда ответ будет K-1.
    Ответ написан
    2 комментария
  • Почему возникает ошибка доступа к элементу в классе?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Потому что в fillMatrix вы заполняете не член класса fullMatrixPointer, а параметр функции с точно таким же названием. Если вы включите ворнинги у компилятора, то он вам об этом скажет.

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

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

    Вы уже открыли вашу программу в дебаггере. В правом нижнем углу вы видите стек. Первые 3 функции - это в недрах библиотеки. Вам тут ничего не понятно, поднимайтесь вверх. Ткните в четвертую строчку - там где Main().

    Увидите, что ошибка происходит на строчке:
    cout << morze.find( text[i] )->second <<" ";

    Проблема возникает при попытке обратиться к second у возвращенного значения. Но почему? Читайте ошибку: "cannot dereference end map/set iterator".

    Т.е. find возвращает end() итератор. Действительно, посмотрите в документацию - map вернет end() если искомого ключа в нем нет.

    Иправить ошибку просто - исправьте ваш код. Сначала присвойте переменной возвращенный из find итератор, и потом проверяйте, а не end() ли он. И только в противном случае выводите.

    Я подозреваю, что символом оказался пробел. Пробела в вашем мапе morze нет, вот все и падает.
    Ответ написан
    1 комментарий
  • Как сравнить unsigned long long и char* в C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Потому что вы передаете во второй to_string первый символ (его код). Если вы передадите в качестве числа 61, а в качестве строки "A..." то будет true.

    Если вам надо сравнить число и строку, как набор цифр, то вы или только число переводите в to_string или только строку переводите в to_number.
    Ответ написан
    Комментировать
  • Как обращаться к элементам массива через указатель?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Раз вы передаете ссылку, то tmp_word и s являются тупо массивами, т.е. указателями на char. Поэтому вам не надо одновременно их разыменовывать и обращатся по индексу. Или пишите *(tmp_word+tmp) или tmp_word[tmp]

    А вообще, можно их и не передавать как ссылки а передвать сами массивы, как указатель на char.
    void DeleteWords(char *s, char *tmp_word, int size_word)


    Так будет понятнее и проще. А еще лучше, передавайте std::string или std::vector. По ссылке, чтобы избежать копирования. По const ссылке, если не хотите, чтобы их внутри функции меняли.
    Ответ написан
    1 комментарий
  • Как специализировать метод родительского класса?

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

    Определите shader::construct и пометьте override.
    Ответ написан
  • Как использовать переменную из одной функции в другой, не запуская при этом работу второй функции?

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

    Вы там выделяете новую память и заполняете ее, но снаружи это нигде не видно.

    Или можно наоборот - выделять массив в info, но тогда надо не выделять его в detal и передавать указатель на указатель, что бы info могла изменять stu. Или лучше, пусть info массив возвращает.
    Ответ написан
    Комментировать
  • Как удалить элементы векторов по одинаковому индексу С++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    int index = std::distance(NUMBER.begin(), it);
    TYPE.erase(TYPE.begin() + index);
    PRICE.erase(PRICE.begin() + index);
    ...


    Вы же удаляете элемент по индексу равному значению удаляемого элемента.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Он там не вызывается. Этот приватный конструктор используется в функции
    void lib::LinkedList<T>::push(const T&) [with T = Item<int>]
    , которая в шаблоне (там где вы создаете Node* tmp). При первом обращении к этой функции компилятор пытается ее инстанциировать и натыкается на эту проблему, о чем и сообщает вам. Пока эта функция вообще никак нигде не используется - программа компилируется.

    В приведенных вами примерах вы эту функцию так или иначе трогаете разными способами.

    lib::LinkedList<Item<int>> list = lib::LinkedList<Item<int>>()
    вызвает проблему пока у вас есть virtual метод в интерфейсе, потому что это тут вызывается конструктор копирования (сначала конструктор по умолчанию для временного lib::LinkedList<Item<int>>(), а потом это все копируется в конструируемый list).

    Этот конструктор копирования должен будет также скопировать таблицу виртуальных вызовов и тут компилятору понадобится знать про запретный метод push. Похоже. Я не уверен точно, почему это проявляется именно в конструкторе копирования, где-то в недрах стандарта про это, наверняка, написано.

    Если вы напишите lib::LinkedList<Item<int>> list() - то все скомпилируется, потому что конструктор по умолчанию, видимо, не требует знания о методе push. Также удаление virtual или наследования вылечит эту проблему.

    Далее, точно по этой же причине не скомпилируется list.push(a) - это прямой вызов этой запретной функции. Если же вы напишите list.push(Item<int>()), то оно скомпилируется потому что тут вызывается push с перемещением.

    Но для исправления этого кода вам надо прежде всего избавится от этой поломанной функции push.
    Ответ написан
    3 комментария
  • Какой open source проект написан на труъ Си++?

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

    Но вряд ли просмотр стороннего кода поможет вам понять, что именно коллегам не нравится в вашем коде. Тут надо все-таки коллег допытываться. Смотреть на ими написанный код.

    Если постоянные жалобы, то устройте код ревью в команде. Пусть ваш код хотя бы пару неделек кто-то постоянно будет проверять перед комитом и выдавать конкретные правки (а вообще код-ревью хорошо использовать всегда. Тот же github дает возможность это делать. Или есть опен сорсный gerrit).

    Возможно, вы используете классы только как структуры максимум с какими-то тривиальными действиями (типа get_sum, get_value, set_value и т.д.). Когда как в ООП объекты должны инкапсулировать в себе логику и уметь делать нетривиальные вещи. Сама программа должна состоять из взаимодействующих объектов.

    Еще использование stl. Стоит избегать массивов - используются std::vector. Так же вместо char* стоит использовать std::string. Ну и там куча алгоритмов есть: от выбора максимума в массиве до сортировки.
    Ответ написан
    Комментировать