• Почему все типы данных четные числа?

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

    В ситуациях (или на платформах), где соображения тщательной экономии памяти являются более важными, чем соображения производительности, ваши аргументы будут более вескими. И для таких ситуаций многие языки программирования предоставляют средства для реализации именно таких более компактных типов.
    Ответ написан
    Комментировать
  • Ошибка 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 комментария
  • Почему приведение (int) pow ( variable1, variable2 ) отличается от (int) pow ( constant1, constant2 )?

    @TheCalligrapher
    Ваш код некорректен в принципе. Функция pow не объявлена. Язык С не разрешает вызов необъявленных функций. Даже если ваш компилятор умудрился это как-то скомпилировать, поведение все равно не определено.
    Ответ написан
  • Как решить проблему с undefined reference c++?

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

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

    @TheCalligrapher
    Код ничего не выводит просто потому, что цикл никогда не завершается.

    Нажатие клавиши Enter не приводит к возврату EOF из getchar(). Для того, чтобы создать ситуацию EOF при консольном вводе, вам нужно обратиться к документации на ваш терминал. Разные терминалы работают в этом отношении по-разному и их поведение может зависеть от их конфигурации.

    Для Linux терминалов EOF обычно возникает, если нажать Ctrl+D при пустом входном буфере. "При пустом входном буфере" означает, что Ctrl+D нужно нажимать либо в начале новой строки, либо сразу после предыдущего нажатия Ctrl+D.

    Для Windows терминалов EOF формируется, если ввести Ctrl+Z в начале новой строки и затем ввести Enter.

    Отдельно стоит посоветовать вам завершать вывод символом перевода строки: printf("%.0f\n", nc);
    Ответ написан
    Комментировать
  • Как работают побитовые операторы?

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

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

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

    @TheCalligrapher
    В языке С в принципе не бывает "пустых" массивов. Разве что динамически выделенная под массив память может иметь размер 0 или flexible array member в структуре может соответствовать массиву размера 0.

    Поэтому не ясно, о чем вы вообще ведете речь.

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

    @TheCalligrapher
    Проблемы, в порядке возникновения

    1. В С предпочитайте int main(void) вместо int main()
    2. Необоснованное использование типа float вместо типа double.
    3. Какая-то странная смесь нелокализованных и локализованных объявлений переменных, в т.ч. переменных с одинаковыми именами в вложенных областях видимости. Напр. wait
    4. scanf("%s", wait); никак не защищен от переполнения. И это при том, что буфер wait имеет минимальный размер. Лучше scanf("%1s", wait);. Разумеется, это не решит всех потенциальных проблем с некорректным вводом...
    5.
    if (  ( wait[0] == '/' && (num_1 == 0 && num_2 == 0) )  ||  ( wait[0] == '/' && (num_1 == 0 || num_2 == 0) )  )
    - что это за странная двойная проверка одного и того же?
    6. goto здесь совсем не уместно.
    7. Что это вообще за странное дублирование одного и тот же кода?
    Ответ написан