Для этой сортировки выбора почему первое число 0, когда 0 никогда не используется в моем массиве? (в с) - PullRequest
0 голосов
/ 23 октября 2011

Это код, вызываемый main для сортировки массива с использованием сортировки выборок на языке Си.У меня есть файл, открытый в main и я помещаю первые десять целых в массив, а одиннадцатый в переменную, а затем вызывается куча простых функций.Все это повторяется три раза.Для моего тестового файла последние две итерации имеют правильную печатную сортировку, но первая начинается с 0, но у меня нет 0 в моем массиве.Он также сбрасывает последний int.

Заранее спасибо за вашу помощь !!

Вот мой код:

    void sortme (int arry [], int last_int)
{
     int temp;
     int smallest_int;
     int current_int;
     int target_searcher;
     int numPrinted;

     for(current_int = 0; current_int < last_int; current_int++)
        {
            smallest_int = current_int;

            for(target_searcher = current_int + 1; target_searcher <= last_int; target_searcher++)
                if(arry[target_searcher] < arry[smallest_int])
                    smallest_int = target_searcher;

            temp = arry[current_int];
            arry[current_int] = arry[smallest_int];
            arry[smallest_int] = temp;
        }                                                                       //end outter loop

     numPrinted = 0;

     printf("\nThe sorted array is: ");
     for(current_int = 0; current_int < SIZE; current_int++)
        {
            printf("%4d", arry[current_int]);
            if(numPrinted < COUNT)
                numPrinted++;
            else
                {
                    printf("\n");
                    numPrinted = 0;
                }
        }
     printf("\n");

     return;
}

Вот мой вывод для справки (большинствовещи комментируются в main.c):

The file opened.

Scanned into a[] and target is  33

ARRAY[1]
The contents in the array are:   40  32  57  27  67   6   3  89   2  99
The sorted array is:    0   2   3   6  27  32  40  57  67  89
The value searched,   33, was  not found.

Scanned into a[] and target is   3

ARRAY[2]
The contents in the array are:   86  43  89  32  45  12   1  58  98   4
The sorted array is:    1   4  12  32  43  45  58  86  89  98
The value searched,    3, was  not found.

Scanned into a[] and target is  11

ARRAY[3]
The contents in the array are:    1   2   3   4   5   6   7   8   9  10
The sorted array is:    1   2   3   4   5   6   7   8   9  10
The value searched,   11, was  not found.
Closing the file.
The file closed.

1 Ответ

1 голос
/ 23 октября 2011

Вы разрешаете target_searcher быть равным last_int при поиске минимума. Таким образом, иногда вы получаете случайное небольшое значение, введенное в ваш массив (и связываетесь с памятью, которая вам не принадлежит). Конечно, я предполагаю, что last_int - это длина массива.

Когда вы имеете дело с «только действительными индексами», диапазон составляет от 0 до len-1. Вы можете увидеть это с массивом длины 1 (на случай, если у вас снова возникнут сомнения). Поскольку существует только 1 элемент, он находится на array[0] или array[len-1].

Сказав это, обычно принято передавать параметры в виде массива и длины вместо массива и индекса последнего действительного элемента. Это более естественно. Скажем, у вас есть большой массив с двумя блоками len1 и len2 и функция, которая что-то делает с этими разделами. Если вы используете длину в качестве параметра, вы используете:

processBlock(arr, len1);
processBlock(arr + len1, len2);

Если бы вы использовали последний действительный индекс, были бы все эти +/-1 термины, с которыми вам пришлось бы иметь дело. Так что либо:

processBlockIdx(arr, len1 - 1);
processBlockIdx(arr + len1, len2 - 1);

или

processBlockIdx(arr, lastIdx1);
processBlockIdx(arr + lastIdx1 +1, lastIdx2 - lastIdx1 - 1);

Что касается ответа на ваш второй вопрос: да, проблема была вызвана доступом к элементу, который находится за пределами вашего массива. Поскольку C не имеет системы безопасности для проверки границ массива, такая ошибка обычно проявляется в том, что в ваших результатах появляется необъяснимое значение, или, что еще хуже, сбой приложения. В некоторых случаях вам не так повезло, и это проявляется в совершенно не связанной части вашей программы. Поэтому лучше всего очень быть уверенным в доступе к элементам массива.

...