Используется неинициализированная локальная переменная «Quick» - PullRequest
0 голосов
/ 28 октября 2018

Я делаю эту функцию, которая подсчитывает общее количество перестановок и сравнений, которые бы в целом выполняла функция быстрой сортировки.Однако, когда я запускаю его, я получаю эту ошибку:

ошибка C4700: неинициализированная локальная переменная 'quick' используется

Это происходит в операторе 'if' дляБазовый случай указан в коде функции ниже.SwapandComp - это имя структуры, которую я использую для отслеживания как свопов, так и сравнений для сортировки, а раздел - это функция, в которой мы находим место для разделения исходного массива, а также подсчитываем свопы и сравнения.

int partition(int numbers[], int i, int k) {
int l = 0;
int h = 0;
int midpoint = 0;
int pivot = 0;
int temp = 0;
bool done = false;

// Pick middle element as pivot
midpoint = i + (k - i) / 2;
pivot = numbers[midpoint];

l = i;
h = k;

while (!done) {

    // Increment l while numbers[l] < pivot
    while (numbers[l] < pivot) {
        ++l;
        totalComps++;
    }

    // Decrement h while pivot < numbers[h]
    while (pivot < numbers[h]) {
        --h;
        totalComps++;
    }

    // If there are zero or one elements remaining,
    // all numbers are partitioned. Return h
    if (l >= h) {
        totalComps++;
        done = true;
    }
    else {
        // Swap numbers[l] and numbers[h],
        // update l and h
        temp = numbers[l];
        numbers[l] = numbers[h];
        numbers[h] = temp;
        totalSwaps++;

        ++l;
        --h;
    }
  }
  return h;
}

А теперь вот функция быстрой сортировки.Как упоминалось ранее, SwapandComp - это структура, которую я использовал для отслеживания как свопов, так и сравнений.

SwapandComp quicksort(int numbers[], int i, int k) {
SwapandComp quick;
int j = 0;
int z = 0;


// Base case: If there are 1 or zero elements to sort,
// partition is already sorted
if (i >= k) {
    return quick;
}

    // Partition the data within the array. Value j returned
    // from partitioning is location of last element in low partition.
    j = partition(numbers, i, k);

    // Recursively sort low partition (i to j) and
    // high partition (j + 1 to k)
    quickSort(numbers, i, j);
    quicksort(numbers, j + 1, k);

    quick.swaps = totalSwaps;
    quick.comps = totalComps;

    return quick;
}

Во второй строке я пишу

SwapandComp quick;

, чтобы использовать для быстрогосортировать структуру.Ошибка на самом деле не имеет смысла для меня, потому что я объявил «быстро» как новую структуру, чтобы функция возвращала.Любая помощь приветствуется!Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Инициализировать struct как показано ниже:

SwapandComp quick = { 0 };
0 голосов
/ 28 октября 2018
SwapandComp quick;

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

Вы могли бы просто инициализироватьчлены, когда объявляют это, например, с помощью:

SwapandComp quick; quick.swaps = quick.comps = 0;

Но лучше способ сделать это с реальными инициализаторами, что-то вроде:

struct SwapAndComp {
    unsigned swaps;
    unsigned comps;
    SwapAndComp(): swaps(0U) , comps(0U) {};
};

Этот метод (инициализация как часть самого класса) позволяет вам правильно создать структуру без всех пользователей, которым не нужно беспокоиться о том, чтобы сделать это правильно.И, если вам нужна гибкость, вы можете просто предоставить конструктор, который разрешит его, при этом по умолчанию используется значение «set to zero»:

SwapAndComp(unsigned initSwaps = 0U, unsigned initComps = 0U)
    : swaps(initSwaps) , comps(initComps) {};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...