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

    @TheCalligrapher
    Странный вопрос. В С++ не существует другого спосба инициалиазции полей класса в определении конструктора. Никакой инициализации "в теле самого конструктора" не существует. О чем вы?
    Ответ написан
    Комментировать
  • Почему программа падает при вводе отрицательного числа?

    @TheCalligrapher
    В языке С++ не разрешается использовать неконстантые выражения в качестве размера при объявлении массива. Поэтому ни о каком "все нормально пока я не введу отрицательные числа" речи быть не может. Ваш код не является кодом на С++ вообще. Нужно все переделывать с самого начала.

    В качестве массива используйте std::vector<double>. И, разумеется, не float, а double. Почему у вас в коде вдруг используется тип float?
    Ответ написан
  • Почему так можно делать?

    @TheCalligrapher
    Константные ссылки можно привязывать к prvalue, в каковом случае язык сам для вас материализует временный объект, проинициализирует его правильным значением и привяжет к нему ссылку. В вашем примере этот временный объект будет автоматически уничтожен по завершении cout<<sqr(4);.
    Ответ написан
    Комментировать
  • Как восстановить окружность по массиву точек?

    @TheCalligrapher
    Используйте алгоритм Эмо Велла (Emo Welzl) для построения минимальной охватывающей окружности

    https://www.cyberforum.ru/geometry/thread1926478.h...
    www.stsci.edu/~RAB/Backup%20Oct%2022%202011/f_3_Ca...

    После чего уменьшите радиус найденной окружности (зафиксировав центр) так, чтобы количество точек внутри и снаружи стало примерно одинаковым.

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

    @TheCalligrapher
    Ввод плавающих значений поддерживает "научную нотацию". То есть при вводе значения типа double вы можете написать 10e-23. Никакого другого ввода "со степенью" в стандартной библиотеке нет.
    Ответ написан
    Комментировать
  • Является ли правильным данный код?

    @TheCalligrapher
    Нет, разумеется, на является.

    1. Одна из строк приведенного кода синтаксически выглядит как statement. В языке С++ statement может располагаться только внутри определения функции. В приведенном коде нет никакого определения функции.

    2. В поле фигурирует некий неопределенный идентификатор cout. Что это за странный cout такой?
    Ответ написан
    Комментировать
  • Библиотека и пространство имен. В чем разница?

    @TheCalligrapher
    У вас у наблюдается какая-то странная терминологическая каша.

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

    Во-вторых, нет никакой "библиотеки iostream" и никогда не было. Почему вы вдруг называете "iostream" "библиотекой"? В С++ существует стандартный заголовок <iostream>, содержащий описания сущностей из стандартной библиотеки языка С++. Но заголовок - это совсем не библиотека. Никто не считает <iostream> "библиотекой". Почему вы вдруг это делаете?
    Ответ написан
    1 комментарий
  • Возможно ли писать на C++ со вставками C?

    @TheCalligrapher
    Нет, нельзя. В С++ нет средств "вставки" кода на других языках программирования, кроме разве что asm.

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

    @TheCalligrapher
    Так а что это такое вообще: htval.num = 10;?

    Это выглядит как инструкция (statement). В языках С и С++ инструкции могут находиться только внутри функций. Больше нигде. Это требование грамматики, т.е. элементарного синтаксиса этих языков. Зачем вы написали инструкцию в "чистом поле" за пределами функции? Это некорректно с точки зрения синтаксиса языка.

    Упрощенно выражаясь, в С и С++ код пишется внутри функций, а не снаружи.

    P.S. Ваш вопрос не имеет никакого отношения к "структуре, объявленной в заголовочном файле". Ни структуры, ни заголовочные файлы тут ни при чем.
    Ответ написан
    Комментировать
  • Как организована работа rand()?

    @TheCalligrapher
    Вы все совершенно правильно описали: функция rand() является stateful функцией, т.е. она обладает состоянием (state), которое сохраняется между последовательными вызовами функции. И по понятным причинам это состояние также должно быть доступно функции srand().

    Однако, во-первых, не ясно, почему вы решили, что это состояние обязательно должно храниться в локальной статической переменной, объявленной внутри функции rand(). Даже если следовать вашей логике, то намного разумнее предположить, что это - некая статическая переменная, объявленная не уровне файла (модуля), и немедленно доступная как функции rand(), так и функции srand(). Или даже глобальная переменная. (Во многих реализациях стандартной библиотеки, старающихся поддерживать работу в многопоточных приложениях, это состояние может храниться в thread-локальной переменной.)

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

    @TheCalligrapher
    Никак не получить, пока вы сами каким-то образом не передадите в точку доступа указатель или ссылку на объект основного класса. То есть необходимый контекст придется либо передавать через параметры метода (update в данном случае), либо хранить в объектах класса thrusterMount на постоянной основе.
    Ответ написан
    Комментировать
  • Ошибка range_error, можно ли исправить этот цикл?

    @TheCalligrapher
    if(moda_min==i[zumzum+1]){

    Это уже очевидный вылет за пределы массива. Да и вообще везде, где вы обращаетесь к элементу i[zumzum+1] вы потенциально вылетаете за пределы массива.
    Ответ написан
    1 комментарий
  • Как создать папку с учетом имени пользователя c++?

    @TheCalligrapher
    А почему вы вообще решили, что папка Users располагается на C:?

    Создавать папки в домашней директории пользователя следует через значение переменной окружения %USERPROFILE%, а не заниматься ручным склеиванием кусочков, как в вашем примере. В %USERPROFILE% содержится полный путь к домашней директории текущего пользователя. От него и начинайте танцевать.

    И пытаться конкатенировать через + широкие строковые литералы и узкую std::string - бесполезное занятие. Почему вы смешиваете широкие и узкие строки в своем коде? Хотите работать с широкими строками - работайте с широкими строками. std::wstring, а не std::string.
    Ответ написан
    1 комментарий
  • Логический тип bool и оператор new. Что тут вообще происходит?

    @TheCalligrapher
    У вас в вопросе приведено new-expression, которое возвращает указатель типа bool *. Откуда вы вдруг взяли "указатель на void" - не ясно. New-expression никогда не возвращает "указатель на void".

    При этом любой указатель в языке С++ неявно приводим к типу bool. Именно это и используется в вашем примере.

    Дополнительно можно заметить, что начиная с С++20 преобразование указателей к типу bool является сужающим (narrowing). Это означает что оно, в частности, больше не будет выполняться неявно в контексте списковой инициализации

    bool value1{ new bool(true) }; // Ошибка

    Я, правда, не помню навскидку, было ли это изменение в итоге принято как дефект C++17 или как несовместимое изменение языка.
    Ответ написан
    21 комментарий
  • Почему при сериализации uint128 сначала сериализуют hi, потом lo, а не наоборот?

    @TheCalligrapher
    Это сделано потому, что данная библиотека написана в соответствии с некоей внешней спецификацией, которую вы в своем вопросе упомянуть забыли. В этой внешней спецификации черным по белому сказано, что надо делать именно так - потому и сделано именно так. Вот и весь ответ. А уж почему в этой внешней спецификации наличествует такое странное требование - вопрос к ее авторам. Может у них были на то веские причины, а может просто глупость сморозили.

    В общей постановке вопрос "почему сначала сериализуют hi, потом lo" бессмыслен. Нет, в общем случае так НЕ делают.

    Также не понятно ваше утверждение "при сериализации байты просто пишутся в обратном порядке". Порядок от "младшим к старшим" - это естественный прямой порядок. Ничего "обратного" в нем нет.
    Ответ написан
    2 комментария
  • Как решить проблему с undefined reference c++?

    @TheCalligrapher
    Не подключены соответствующие библиотеки. Вы, по-видимому, навключали в свой код хедеров и решили, что это и есть "подключение библиотек".

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

    @TheCalligrapher
    Литерал 0177 в языке С++ - это восьмеричный целочисленный литерал, который имеет тип int и положительное значение 127 - семь младших битов равны 1, а остальные (старшие) равны 0.

    Вы не указали в своем вопросе какой тип имеет n, что делает ваш вопрос несколько бессмысленным (или полностью бессмысленным), но если предположить, что n - это переменная некоего целочисленного типа, то в данном выражении операнды оператора & будут неявно приведены к одному общему целочисленному типу (к одной ширине). Этот процесс называется usual arithmetic conversions (UAC). Если в процессе UAC придется расширить операнд 0177, то он будет дополнен до требуемой ширины дополнительными нулевыми битами в старшей части.

    Так образом, даже после такого преобразования операнд 0177 по-прежнему будет представлять собой битовую "маску" из семи единичных битов в младшей части и нулевых битов в старшей части. Оператор & в такой ситуации "сохранит" семь младших битов исходного значения n и обнулит остальные биты.
    Ответ написан
    Комментировать