Ошибки массива и типа / значения в функции сортировки

#c #arrays

#c #массивы

Вопрос:

Я получаю различные ошибки и предупреждения, которые я не понимаю.

  • ошибка: «подписанное значение не является ни массивом, ни указателем, ни вектором» в двух верхних функциях с массивами

  • предупреждение: передача аргумента 1 из ‘selectionSort’ создает целое число из указателя без приведения int s = selectionSort(arr, len);

  • примечание: ожидаемый ‘int’, но аргумент имеет тип ‘int *’: void selectionSort(int arr, int len) {

  • ошибка: пустое значение не игнорируется, как должно быть: int s = selectionSort(arr, len);

Звучит так, как будто это простые исправления, но типы и значения — мое слабое место! Есть какие-нибудь указания? (каламбур непреднамеренный)

 int find_maxind(int arr, int len) {
    if(len == 1) return 0;
    int ind = find_maxind(arr,len-1);
    return (arr[ind] > arr[len-1])?ind:len-1;
}

void SelectionSort(int arr, int len) { //this cannot change
    if(len <= 1) return;
    int max_ind = find_maxind(arr,len);
    int temp = arr[max_ind];
    arr[max_ind] = arr[len-1];
    arr[len-1] = temp;
    SelectionSort(arr, len-1);
}

int main(){ //testing the sorting
  int arr[] = {1,2,3,4,5,6,7,8,9,11,13,15,17};
  int len = 13;
  int s = SelectionSort(arr, len);
}
  

Комментарии:

1. При публикации вопросов об ошибках сборки, пожалуйста, указывайте полный вывод ошибок, неотредактированный и в полном объеме. Также укажите, где в источнике находятся ошибки, например, в комментариях.

2. int find_maxind(int arr, int len) { —> int find_maxind(int arr[], int len) {

3. Объявлено, что ваши функции принимают int arr ровно одно целое число с именем array. Однако вы хотели передать массив, поэтому сделайте int[] arr

4. int s = SelectionSort(arr, len); также неверно по очевидным причинам

5. Эм … void SelectionSort(int arr, int len) — вы хотели, чтобы там был массив, верно ? Аналогично для int find_maxind(int arr, int len) ?

Ответ №1:

Завершите рабочий код.

 int find_maxind(int arr[], int len) {
if(len == 1) return 0;
int ind = find_maxind(arr,len-1);

return (arr[ind] > arr[len-1])?ind:len-1;
}

void SelectionSort(int arr[], int len) { //this cannot change
     if(len <= 1) return;
     int max_ind = find_maxind(arr,len);
     int temp = arr[max_ind];
     arr[max_ind] = arr[len-1];
     arr[len-1] = temp;
     SelectionSort(arr, len-1);
}

int main(){ //testing the sorting
     int arr[] = {1,2,3,4,5,6,7,8,9,11,13,15,17};
     int len = 13;
     SelectionSort(arr, len);
}
  

В основном ваша программа нуждается в некоторых изменениях:

  int find_maxind(int arr, int len) to int find_maxind(int arr[], int len)

 void SelectionSort(int arr, int len) to void SelectionSort(int arr[], int len)
  
  

Потому что вы передаете arr в selectionSort(arr, len);

Я надеюсь, вы получили ответ.

Комментарии:

1. вы передавали «arr» в selectionSort(arr, len); поэтому в функции: 1. вместо «find_maxind(int arr, int len)» измените на «int find_maxind(int arr[], int len)».

2. Саиф, лучше включить это объяснение в ответ.

3. включено объяснение в ответ. 🙂

4. Это намного лучше 🙂

5. Спасибо, я пробовал использовать arr [], но не для void, который, я не думаю, что я должен изменять. Но, похоже, у меня нет особого выбора. Спасибо!

Ответ №2:

Здесь есть пара проблем:

 int find_maxind(int arr, int len) {
  

Принимает только одно целое число вместо желаемого массива. Измените его на что-то вроде этого:

 int find_maxind(int[] arr, int len) {
  

Что касается вашей второй ошибки: ваша SelectionSort функция определена с типом возвращаемого значения void, что означает, что она ничего не возвращает. Поэтому, когда вы пытаетесь присвоить его возвращаемое значение s , компилятор стонет:

   int s = SelectionSort(arr, len);
  

Видите ли, функция ничего не возвращает (конечно, нет int), поэтому присваивать ее возвращаемое значение чему-либо бессмысленно.

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

Ответ №3:

Попробуйте приведенный ниже код, он работает:

 #include<stdio.h>

int find_maxind(int arr[], int len) 
{
    if(len == 1) return 0;
    int ind = find_maxind(arr,len-1);
    return (arr[ind] > arr[len-1])?ind:len-1;
}

void SelectionSort(int arr[], int len) 
{ //this cannot change
    if(len <= 1) return;
    int max_ind = find_maxind(arr,len);
    int temp = arr[max_ind];
    arr[max_ind] = arr[len-1];
    arr[len-1] = temp;
    SelectionSort(arr, len-1);
}

int main(){ //testing the sorting
  int arr[] = {17,2,3,4,5,6,7,8,9,11,13,15,1};
  int len = 13;
  SelectionSort(arr, len);
  for (int i=0;i<len;i  )
  {
      printf("%dn",arr[i]);
  }
}
  

Вы передаете массив и получаете его с типом int, что, несомненно, создаст проблему.

Вы можете перехватить массив с типом массива или типом указателя, но никогда с основным типом переменной, как вы делаете в своем коде прямо сейчас.

Ответ №4:

  1. Ваши функции не принимают массивы в качестве входных данных. Вы просто передаете целые числа. Вам следует изменить функции find_maxind и SelectionSort на int find_maxind(int* arr, int len) и void SelectionSort(int* arr, int len)

  2. Функция SelectionSort ничего не возвращает. Итак, в main функции измените вызов с int s = SelectionSort(arr, len); на SelectionSort(arr, len);

  3. Ваш массив arr уже отсортирован. Я не вижу смысла в вызове сортировки выбора на нем. Вы можете изменить этот массив.