Ответы пользователя по тегу C++
  • Тестированое "ошибками", или как эмулировать их при дебаге и отладке?

    bogolt
    @bogolt
    Пишите логи всех действий совершаемых программой. Например
    2018-11-01 15:12:12.123 Menu 'Open file' activated
    2018-11-01 15:12:12.223 Opening file '/home/user/abc.txt'
    2018-11-01 15:12:12.223 Operation failed with system error: Permission denied


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

    Учтите только что логи не должны бесконечно расти, и что при каждом старте программы нужно дописывать в существующий лог не обнуляя старый файл.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы std::set при добавлении объектов сравнивал на повторяемость по моим правилам?

    bogolt
    @bogolt
    Указать ваш компаратор:

    std::set<std::shared_ptr<CString>, MyCompare>
    Который будет сравнивать значения внутри умных указателей.

    Чтобы с пониманием делать такие вещи нужен опыт и некоторые навыки чтения литературы.

    upd:
    using namespace std;
    typedef shared_ptr<string> SString;
    
    class SharedLess
    {
    public:
        bool operator() (const SString& a, const SString& b) const
        {
            return *a < *b;
        }
    };
    Ответ написан
  • Какую FastCGI-библиотеку для C/C++ посоветуете?

    bogolt
    @bogolt
    А может ну его, это фаст-сги, а взять сразу http библиотеку, и прямо с ее помощью все написать?
    А потом пустить все через nginx чтобы исключить разные проблемы безопасности.

    Например берем libevent http - он позволяет обрабатывать http запросы, пишем на его основе одно/многопоточный сервер.
    Тоже самое можно сделать при помощи boost.asio, в самом бусте есть немало примеров посвященных созданию http серверов.
    Кроме того вам уже указали на cppcms которая вроде как заточена под подобные задачи.

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

    bogolt
    @bogolt
    Смотреть и пробовать - разные вещи. Настолько разные, что часто смотреть как кто-то что-то делает скучно, а вот самому делать интересно. И наоборот.
    Не думаю что можно понять что-то об интересующем занятии не попробовав его.

    Но тратить сотни часов для этого в любом случае нет необходимости. Есть огромное количество простых уроков, видеолекций для чайников, книг для начинающих. Почему бы вам не попробовать любую ( ну или одну из тех что пользуются популярностью), чтобы понять нужно ли вам это?

    Если коротко - найти любой популярный курс по интересующей тематике ( сайты, игры, прикладные программы ), начать читать/смотреть и обязательно параллельно делать. Во всех курсах для начинающих обычно описывается какие программы нужно установить чтобы можно было у себя запустить рабочие примеры. Дальше станет ясно - если интересно пытаться что-то создавать управляя всесильной машиной, то занимайтесь.
    Ответ написан
    Комментировать
  • Как сделаить Ряд тейлора (через указатели)?

    bogolt
    @bogolt
    У вас в программе три явно выраженных участка - это ввод данных, вычисление и вывод результата. Каждый из этих фрагментов можно вынести в свою функцию.
    По-поводу указателей - вы можете вернуть указателями значения из функции ввода данных.
    Ответ написан
    Комментировать
  • Почему если вызывать QWidget::show() через точку, то не показывает?

    bogolt
    @bogolt
    Вам уже ответили правильно, хочу добавить что в Qt все окна и контролы нужно создавать в куче ( так как тогда сама Qt сможет корректно их удалить ). Кроме того при создании нового объекта не забывайте указать ему на его родителя ( в вашем случае при создании QWidget внутри класса Widget -
    QWidget* w = new QWidget(this);
    QLineEdit *line = new QLineEdit(w);
    Ответ написан
    1 комментарий
  • Как написать анализатор выражений C++?

    bogolt
    @bogolt
    Люди, ну почему вы разучились думать сами?
    Нет, не нужно читать книжку если вам задали задание найти максимальный элемент массива.
    Омг, да какие нафик книги, просто напишите этот код. Вначале без скобок, потом добавьте скобки.

    Не можете придумать алгоритм? Возьмите лист бумаги и ручку, напишите простейший пример 3+2 и разберите по шагам как вы сами его решаете. Затем тоже самое выразите на нужном вам языке. Потом останется только добавить операторов, вспомнить о приоритетах ну и подключить скобки.
    Ответ написан
    3 комментария
  • Почему выводится ошибка "необработанное исключение по адресу"?

    bogolt
    @bogolt
    Про неверные индексы матрицы тут вам уже сказали, добавлю что вы не очищаете за собой память. На каждый выделенный блок памяти нужно вызвать delete x[];
    Ответ написан
    Комментировать
  • Как заполнить матрицу по данному образцу?

    bogolt
    @bogolt
    Формулу вам дали в условии задачи, в чем проблема то ?
    Ответ написан
  • Как сократить время выполнения программы [C++]?

    bogolt
    @bogolt
    Очевидно что самая долгая операция это пользовательский ввод, поэтому нужно быстрее водить число =)

    Шутки в сторону. Для начала убедитесь что вы собираете проект с включенной оптимизацией. Например мой старенький Core2Duo для n=999999 выдает ответ почти за секунду, после того как я собрал вашу программу с O2.

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

    bogolt
    @bogolt
    Если у вас будет только лишь указатель на вершину дерева, то как вы дальше будете ходить по ветвям этого дерева - без указателей на них?
    По-моему для узла дерева нужно что-то в таком духе:
    template<class T>
    struct Node
    {
    Node* left, *right;
    T data;
    };
    Ответ написан
  • Почему при динамическом копировании символов, остается лишняя память?

    bogolt
    @bogolt
    До меня тут уже ответили, но хочу добавить.
    Автор - обратите внимание на работу с памятью. Если вы напишите подобное в реальной программе, то такая утечка памяти как здесь сможет за несколько минут/часов/дней в зависимости от частоты использования функции выжрать всю оперативку на запущенной машине.
    Разберитесь как работают new/delete и malloc/free. Разберитесь почему нельзя выделить переменную через оператор new и потом освобождать эту память через free ( даже если сейчас у вас это каким-то образом сработало ).
    По вопросу - strcat принимает вторым аргументом указатель на строку а не указатель на единственный char и обманув компилятор добавленным значком & вы обманули лишь себя.
    Ответ написан
    Комментировать
  • Что делать с ошибкой undefined reference to при передаче параметра в функцию?

    bogolt
    @bogolt
    Вы объявили separateImage членом класса, а определили ее как глобальную функцию ( не указали имя_класса:: перед определением. Поэтому и возникает undefined reference.
    Ответ написан
    Комментировать
  • Что означает эта ошибка в С++ ?

    bogolt
    @bogolt
    Ошибка в недрах STL событие маловероятное. Эта библиотека тестируется годами на огромном количестве проектов. То что ошибка проявилась именно в std::vector вовсе не значит что ошибка именно там. Вероятнее всего - код пытается работать с удаленной памятью, вызывает функцию получения размера, а так как объект не существует программа падает.
    Это совершенно нормально для программ с ручным управлением памятью ( ну и для остальных тоже вроде случается ).
    Почему ошибка может происходить время от времени: причин тому множество. Может неправильная работа с многопоточностью ( и тут уже зависит от ОС как она и что распределит ) ведет к тому что изредка один поток обращается к ресурсу удаленному другим потоком. Может ошибка с памятью проявляется не сразу потому что хоть какие-то значения обращаются к несуществующей памяти, но физически эта память находится в адресном пространстве вашей программы, а значит ОС считает что все в порядке. Ну а уже когда указатели выходят за пределы этого пространства - случается большой бум.

    Раз уж у вас есть запрос который гарантированно воспроизводит проблему - вам стоит попытаться отладить ваш сервер и найти эту ошибку.
    Ответ написан
    3 комментария
  • Почему не срабатывает сигнал в режиме Release?

    bogolt
    @bogolt
    >Коннект вроде проходит нормально (стоит assert)
    Подозреваю что вы написали нечто в таком духе
    assert(connect(signal(), slot());
    и в этом ваша ошибка.
    Дело в том что в релизной сборки все ассерты из кода выкидываются. Есть дефайн, гласящий что в дебаге ассерты выводят сообщение об ошибке, а в релизе меняются на void. А так как выкинулся ассерт то выкинулась и ваша функция.
    Так что проверяйте результат функций не в ассертах, ну или вначале получите значение функции а потом пихайте его в ассерт.
    Ответ написан
    4 комментария
  • Какие технологии нужно использовать для создания web приложения, которое задействует код на С++ (только для вычислений)?

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

    bogolt
    @bogolt
    Так, теперь попробуйте улучшить ваш вопрос, так чтобы на него можно было ответить.
    1. Скриншот запущенного приложения это прекрасно, но непонятно зачем он нужен.
    2. Скриншот куска ошибок - ничего не понятно какие именно там ошибки. Разберитесь как из студии скопировать лог сборки и вытащите эти сообщения оттуда.
    3. После чтения из файла - проверьте значение переменной con и выведете его на экран, чтобы убедится что именно из файла читается не то число.
    Если там не то число - то проверьте тип этой переменной - может вы записали туда char "1" а читаете его уже как int или наоборот.
    Ответ написан
  • Можно ли описать template от метода класса?

    bogolt
    @bogolt
    Передать имя функции как аргумент нельзя.
    Можно это решить через макросы, например так
    #define F(a, b, func) a->func(b)

    Еще можно передать указатель на функцию, но будет чуть более геморно полагаю.
    Ответ написан
    Комментировать
  • Что использовать при разработке графического редактора на С++/Qt?

    bogolt
    @bogolt
    По-моему Qt хороший выбор для подобной программы. И не думаю, что вам имеет смысл отказываться от QGraphicsScene только потому что иначе задача вам кажется слишком простой. Я скорее предположу, что на каком-то этапе работы возможностей QGraphicsScene может не хватить для поставленных задач ( я однажды столкнулся с подобной проблемой, у ее дедушки в Qt3 ), и вот тогда действительно придется весь код писать ручками. Но изобретать себе работу, отказываясь от уже существующих классов - имхо неправильно.
    Поймите меня правильно - научится создавать подобные классы самому - полезное умение. Но если вы вначале научитесь использовать существующие, то затем, когда решитесь создать нечто свое уже будете обладать опытом использования этих классов, а так же примерным пониманием того что в них хорошо, а что не очень.
    На мой взгляд выбранная вами задача не настолько простая как может показаться, хотя это конечно сильно зависит от количества фич которые вы хотите реализовать. Но тем не менее я бы предположил вам вначале создать работающую программу, реализовав таким образом свою цель, а уже потом если сохранится желание переписывать внутренности на собственные графические контейнеры.
    Ответ написан
    Комментировать
  • Как добиться нужного fps?

    bogolt
    @bogolt
    Если хотите понизить фпс ( я так понял по вопросу что хотите вы именно этого ), то после вычислений времени текущего цикла, добавляйте sleep() на недостающее количество миллисекунд.
    Например вам нужно чтобы 1 цикл выполнялся за 30 мс, а он выполнлился за 20, значит нужно поспать еще 10 до выхода из цикла.
    Ответ написан
    3 комментария