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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Для точного восстановления кода по контрольной сумме последняя должна быть размером с архив этого кода.
    Как правило, если контрольная сумма не совпадает, то просто выдаётся ошибка и запуск оборудования останавливается. Так поступают, например, BIOS'ы компьютеров. Дальше нужно восстановить код из внешнего источника, это дело для сервисного техника, или внутреннего хранилища (если там всё в порядке), такое есть на материнских платах с двумя чипами BIOS.
    Как более сложный вариант - проверять контрольную сумму каждой функции. Если повреждена критическая функция, то останавливать работу, если некритическая, то не вызывать её во время работы.
    Ответ написан
    2 комментария
  • Зачем использовать кучу если есть стек? а так же где применяются указатели и ссылки?

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что 0.1 в двоичном коде не представимо конечным числом.
    0.110 = 0.0(0011)2
    Записывая это число в 32-битовый float вы получаете 1.100110011001100110011012 * 2-4 или 0.10000000149011611938476562510
    Соответственно, когда вы 20 раз прибавляете 0.1 к -1, вы не получаете 1. Вы получаете 1.00000029802322387695312510.
    Это число, очевидно, больше единицы, поэтому условие цикла не срабатывает и 21я строка не выводится.
    Ответ написан
    6 комментариев
  • Неправильно работает компилятор c++?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Связано с тем, что у mintty нет ключа -f, это английским по белому в ошибке написано.
    Исправить можно убрав этот ключ из командной строки mintty.
    Ответ написан
    1 комментарий
  • Как хранится struct в памяти?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Зависит от компилятора и заданных при компиляции опций. Например, при плотной упаковке (#pragma pack(1)) каждый элемент структуры занимает ровно столько, сколько ему необходимо. А при выравнивании на 64 бита (#pragma pack(8)) под каждый элемент выделится память, кратная 8 байтам и достаточная для размещения элемента. Для разных архитектур процессоров могут быть доступны разные настройки выравнивания.
    Ответ написан
    Комментировать
  • В чём ошибка вычисления бесконечно убывающей прогрессии с точностью до эпсилон?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас изначально неверная логика. Ваша программа не должна знать конечный результат вычислений. Она должна останавливаться, когда очередной вычисленный член ряда будет по модулю меньше заданной точности.
    Ответ написан
  • Как отобразить байт в двоичном виде?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    #include <iostream>
    #include <bitset>
    ...
    std::cout << "111 = " << std::bitset<8>(111) << std::endl;
    Ответ написан
    Комментировать
  • Как из первых N натуральных чисел составить максимальное количество пар, суммы которых являются простыми?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ключевые слова - максимально возможное количество пар. Значит простой перебор тут не работает, поскольку можно упереться в локальный оптимум и не найти глобального. Нужно перебрать все возможные комбинации пар и найти ту, где простых чисел больше всего.
    Пример: при поиске наивным способом для N = 8 получим три пары с простой суммой (1, 2), (3, 4), (5, 6). Оставшаяся пара (7, 8) даст 15, что не является простым числом. Однако, при разбиении (1, 2), (3, 4), (5, 8), (6, 7) получим уже четыре пары с простой суммой.
    Ответ написан
  • Что означает запись?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В контроллере COM-порта несколько регистров. Запись в них определённых значений меняет режим работы порта. Эти регистры адресуются от базового адреса контроллера.
    _outp(COMBase+3,0x80); - Line Control Register (LCR). Установка старшего бита разрешает доступ к делителю.
    _outp(COMBase,0x01); - установка младшего байта делителя (0x01 => 115200 tick/s).
    _outp(COMBase+3,0x03); - отключение доступа к делителю и установка размера символа 8 бит, 1 стоп-бит, без контроля чётности.
    _outp(COMBase+1,0x00); - Inerrupt Enable Register (IER), запрет всех прерываний.
    _outp(COMBase+2,0xC7); - FIFO Control Register (FCR), разрешить буферы FIFO размером 14 байт и очистить их.
    _inp(COMBase); - прочитать байт из буфера.
    www.osdever.net/documents/CP_serial.pdf
    Ответ написан
    Комментировать
  • Не работает простой код хотя он правильный в чем может быть проблема?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Цифр больше 9 в десятичной системе не бывает.
    А ваш код выдаёт числа от 1 до 10, как вы в нём и написали.
    Ответ написан
    1 комментарий
  • Генерация паролей на c++ Не могу понять в чем проблема?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    ⌈829 / 100⌉ = 1 676 195 504 097 081 > 2 147 483 647 = 231 - 1
    То есть, вы получаете переполнение переменной num_files, там оказывается отрицательное значение и цикл не выполняется ни разу. Вообще, переполнение вы получаете уже начиная с 7 символов, но, видимо, там получаются положительные значения.
    Дальше, при 10 символах вы получите уже переполнение total_combinations:
    8210 = 13 744 803 133 596 058 624 > 9 223 372 036 854 775 807 = 263-1
    Ответ написан
    Комментировать
  • Почему цикл в C++ застревает?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Развели тут, понимаешь, циклы...
    int first_odd = first | 1;
    int last_odd = (last - 1) | 1;
    int sum_odds = (first_odd + last_odd) * ((last_odd - first_odd) / 2 + 1) / 2;
    Ответ написан
    Комментировать
  • Как убрать предупреждение "F может быть равно NULL"?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    --  FILE* F = NULL;
    --  fopen_s(&F, "out1.txt", "w");
    ++  FILE * F;
    ++  errno_t err;
    ++  err = fopen_s(&F, "out1.txt", "w");
    ++  if (err != 0) {
    ++      printf_s("Ошибка создания файла 'out1.txt': %d\n", err);
    ++      return;
    ++  }
    Ответ написан
    Комментировать
  • Как получить массив коэффициентов?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    [1, 2, 1] => x2 + 2x - 1
    [0, 1, 1] => x + 1
    Частное: (x2 + 2x - 1) / (x + 1) = x + 1 => [0, 1, 1]
    Остаток: (x2 + 2x - 1) % (x + 1) = -2 => [0, 0, -2]
    Ответ написан
    Комментировать
  • В чем преимущество статического массива перед динамическим?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В первом случае у вас не статический массив, а локальный. Память для него выделяется на стеке и ограничена размером стека.
    Во втором случае выделяется динамический массив. Память под него ограничена свободной памятью системы или предельным размером динамического массива, если такое ограничение есть в системе.
    Ответ написан
    6 комментариев
  • Почему не выводит площадь в с++?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что в целых числах 1/2 == 0
    Да и гипотенуза должна быть 7.211, а не 7.
    Ответ написан
    3 комментария
  • Почему выводит 0?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что вы делите меньшее целое число на большее и получаете целый ноль.
    Ответ написан
    Комментировать
  • Как исправить ошибочную генерацию чисел?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    int a[10];
    12 -ввел пользователь
    Ответ написан
    Комментировать
  • Как решить задачу линейным алгоритмом?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1 ⩽ i ⩽ n
    Ответ написан
    Комментировать
  • Чем обусловлены различия в работе со строками и другими массивами?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Всё достаточно просто.
    char str[] = "Hello"; - здесь создаётся массив и инициализируется символами из строки.
    const char *str = "Hello"; - здесь создаётся скалярная переменная-указатель и инициализируется указателем на строку в памяти.
    const int *mas = { 4, 5, 7, 9 }; - здесь вы пытаетесь создать переменную-указатель, а инициализировать её как массив, что недопустимо.
    const char *strArr[] = { "Hello", "world", "and" };
    - здесь создаётся массив указателей и инициализируется массивом указателей на строки. Правильно читается как (*strArr)[], а не *(strArr[])
    Ответ написан
    Комментировать