Я получаю сообщение об ошибке в программе на C для сортировки массива - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь написать программу на C, которая сортирует массив следующим образом. Я новичок, и у меня очень мало идей об алгоритмах. Пожалуйста, помогите мне найти ошибку в моем коде. Поскольку я не получаю никаких ошибок компилятора (за исключением нескольких предупреждений), но только программа перестает отвечать на запросы, поэтому я не могу обнаружить свою ошибку.

#include <stdio.h>
#include <stdlib.h>

void selection_sort(int n, int a[n]);

int main () {
int n,i;


printf("Enter the number of elements:");
scanf("%d",&n);
printf("Enter %d elements :",n);

int a[n];

for (i=0 ; i<n ; i++) {
    scanf("%d",&a[i]);
}

selection_sort(n, a[n]);

for (i=0 ; i<n ; i++) {
    printf("%d ",a[i]);
}

return(0);
}

void selection_sort(int n, int a[n]) {

int i,p;

p = 0;

if (n != 0) {
    for (i=0 ; i<n ; i++) {
        if (a[i]>p) p=a[i];
    }

    p = a[n];

    selection_sort(n-1 , a[n]);
}
}

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Первые предупреждения не следует игнорировать.

Мой компилятор говорит:

предупреждение: несовместимое преобразование целочисленного значения в указатель с передачей значения int в параметр типа int *; взять адрес с & [-Wint-преобразованием]

   selection_sort(n, a[n]);

Это серьезная проблема: вы передаете одно единственное целое число (и передаете конец массива ...), когда хотите передать массив (который будет распадаться на адрес его первого элемента) = > этого достаточно, чтобы вызвать неопределенное поведение и вызвать сбой

Тривиально исправить, просто позвоните:

selection_sort(n, a);

и позже в selection_sort, рекурсивно вызывать:

selection_sort(n-1, a);

Как только это будет сделано, ваш алгоритм будет совершенно неверным. Для сортировки выбора вы должны поменять элементов в массиве, чего вы не делаете. Должно быть:

if (n != 0) {
    for (i=0 ; i<n ; i++) {
        if (a[i]>a[p]) p=i;            # first select the rank
    }

    if (p != n-1) {                    # then exchange elements
        int tmp = a[p];
        a[p] = a[n-1];
        a[n-1] = tmp;
    }
0 голосов
/ 28 июня 2018

В вашем коде несколько ошибок.

Во-первых, когда вы не понимаете всего, что делаете, рассматривайте предупреждения как ошибки. Потому что предупреждения, отображаемые во время компиляции, являются ошибками в данном случае и приводят к segfault.

Когда вы компилируете программу, всегда используйте флаги, такие как gcc -Wall -Werror -Wextra. Предупреждения будут рассматриваться как ошибки.

Во-вторых, ваша программа не работает, потому что вы не понимаете, как работают указатели и массивы. Когда вы объявляете массив int, такой как int a[n], и пытаетесь получить доступ к массиву, a[n] будет указывать на первый элемент в массиве. Поэтому, если вы хотите передать массив в функцию, вы не можете передать int a[n] в качестве параметра. Потому что это int.

Если вы хотите передать массив, вы должны сказать «Я хочу дать вам адрес, если этот первый элемент, который является & a [0]», то же самое, что сказать «a».

Так что ваша функция должна принимать в качестве параметра?

Если вы зададите в качестве параметра «int a [n]», вы дадите ему int. Но вы хотите адрес этого int, поэтому int *.

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...