Возникает ошибка с некорректным значением переменной size, которую вводит пользователь

Рейтинг: -1Ответов: 1Опубликовано: 07.07.2023

Пишу программу для плавной сортировки (Smoothsort) на С++. За основную функцию не переживаю, она написанна правильно. Появилась проблема, что моя переменная int size во время компиляции получает неккоретное значение. Вот код программы на С++ и фотография дебаггера от VSCode.

#include <iostream>

// Модификация сортировки кучей. Вместо двоичной кучи используем K-ую кучу Леонардо.

void smoothsort(int *arr, int size)
{
    int p = 1; // индекс в массиве (p = r + b) (r = q & ~b) (q = p & ~b)
    int q = 1; // битовая маска (q = p & ~b) (b = q & ~c) (c = b << 1)
    int r = 0; // индекс в массиве (r = q & ~b) (q = p & ~b) (b = q & ~c)
    int b = 1; // битовая маска (b = q & ~c) (c = b << 1) (p = r + b)
    int c = 1; // битовая маска (c = b << 1) (b = q & ~c) (p = r + b)
    while (p < size) // Построение кучи Леонардо
    {
        if ((p & q) == 0) // Поддержание свойства кучи Леонардо
        {
            if (p + 1 != size && arr[p] < arr[p + 1]) // Поддержание свойства кучи Леонардо
            {
                p++;
                q |= p;
            }
            if (r != 0)
            {
                b = c = r;
            }
            r = p;
        }
        else
        {
            if (arr[p] < arr[p - 1])
            {
                std::swap(arr[p], arr[p - 1]);
                if (r != 0)
                {
                    p = r;
                    r = 0;
                }
                else
                {
                    p--;
                    q &= ~p;
                }
            }
            else
            {
                if (r != 0)
                {
                    p = r;
                    r = 0;
                }
                else
                {
                    p--;
                    q &= ~p;
                }
            }
        }
        p += b;
        q >>= 1;
        c -= b;
        b <<= 1;
    }
    while (c != 1)
    {
        c >>= 1;
        b >>= 1;
        p -= b;
        q |= p;
        if ((q & c) != 0)
        {
            if (arr[p] < arr[p - c])
            {
                std::swap(arr[p], arr[p - c]);
                int t = c;
                while (t <= b)
                {
                    c = t;
                    t <<= 1;
                }
            }
        }
    }
}

// заправшиваем размер массива
// просим ввести элементы массива
// выводим введенный массив
// вызываем функцию сортировки
// выводим отсортированный массив
int main()
{
    int size;
    std::cout << "Введите размер массива: ";
    std::cin >> size;
    int arr[size];
    std::cout << "Введите элементы массива: \n";
    for (int i = 0; i < size; i++)
    {
        std::cin >> arr[i];
    }
    std::cout << "Начальный массив: ";
    for (int i = 0; i < size; i++)
    {
        std::cout << arr[i] << " ";
    }
    smoothsort(arr, size);
    std::cout << "\nОтсортированный массив: ";
    for (int i = 0; i < size; i++)
    {
        std::cout << arr[i] << " ";
    }
    std::cout << "\n";
}

Неккоректный вывод переменной int size

Ответы

▲ 0Принят

Не некорректное, а неопределенное. У компилятора нет обязанности присваивать хоть какое-то значение. Поэтому тут нет никакого вопроса.