#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:
-
Ваши функции не принимают массивы в качестве входных данных. Вы просто передаете целые числа. Вам следует изменить функции
find_maxind
иSelectionSort
наint find_maxind(int* arr, int len)
иvoid SelectionSort(int* arr, int len)
-
Функция
SelectionSort
ничего не возвращает. Итак, вmain
функции измените вызов сint s = SelectionSort(arr, len);
наSelectionSort(arr, len);
-
Ваш массив
arr
уже отсортирован. Я не вижу смысла в вызове сортировки выбора на нем. Вы можете изменить этот массив.