Я хочу найти самый низкий элемент в массиве с помощью функции lowest()
, Но эта программа не работает. Показывает ошибку
недопустимый аргумент типа унарного ‘*’ (есть ‘int’)
Вот код:
#include <stdio.h>
int lowest(int *j, int n) { //For finding the lowest element
int i, temp, tempAdd;
for (i = 0; i < n; i++) {
if (temp > *(j + i))
temp = *(j + i);
tempAdd = j + i;
}
return tempAdd; //Sends the address of the lowest element
}
int main() {
int n;
printf("Enter the number of inputs: ");
scanf("%d", &n);
int arr[n], i;
for (i = 0; i < n; i++) {
printf("\nEnter element no. %d: ", i + 1);
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i++) {
printf("Element no. %d is %d with the address %d.\n", i + 1, *(arr + i), arr + i);
}
int low = lowest(arr, n); //Saves the address of the lowest element.
printf("\nThe Lowest element in the list is %d with address %d.", *low, low); //Error occurs
return 0;
}
Ваша функция lowest
есть проблемы:
int lowest(int *j, int n) { //For finding the lowest element
int i, temp, tempAdd;
for(i = 0; i < n; i++) {
if(temp > *(j + i))
temp = *(j + i);
tempAdd = j + i;
}
return tempAdd; //Sends the address of the lowest element
}
if
блок. Отступ не определяет структуру блока в C.tempAdd
в j + i
который является указателем на самый низкий элемент.temp
ни tempAdd
, Поведение не определено.j
, j
обычно обозначает целочисленный индекс. использование p
,Вот более простая версия:
int lowest(int *p, int n) { //For finding the lowest element
int i, tempAdd = 0;
for (i = 1; i < n; i++) {
if (p[i] < p[tempAdd]) {
tempAdd = i;
}
}
//Return the index of the lowest element
return tempAdd;
}
В основном, вы должны изменить код, потому что low
не указатель:
printf("\nThe Lowest element in the list is %d with address %d.",
arr[low], &arr[low]);
Для печати адреса вы можете использовать %p
как ниже.
printf("\nThe Lowest element in the list is %d with address %p.", low, low);
#include<stdio.h>
int *lowest(int *j, int n) { //For finding the lowest element
int i, temp;
int *tempAdd;
temp=*j;
tempAdd=j;
for(i = 0; i < n; i++) {
if(temp > *(j + i)){
temp = *(j + i);
tempAdd = j + i;
}
}
return tempAdd; //Sends the address of the lowest element
}
Вместе с этим исправьте следующую строку
int low = lowest(arr, n);
в int *low = lowest(arr, n);
lowest
функция должна быть:
int *lowest(int *j, int n) { //For finding the lowest element
int i, temp = *j;
int *tempAdd = NULL;
for(i = 0; i < n; i++) {
if(temp > *(j + i))
temp = *(j + i);
tempAdd = j + i;
}
return tempAdd; //Sends the address of the lowest element
}
и в вашем main
функция: использовать int *low
вместо int low
и использовать %p
для отображения адреса переменной.
Здесь первая итерация фиксированной функции. Это все еще не 100%, как я бы написал, но ограничивается решением вопроса.
Поскольку вы хотите вернуть адрес, я настроил тип возвращаемого значения, а также тип переменной tempAdd
int* lowest(int *j, int n) { //For finding the lowest element
int i, temp;
int *tempAdd;
for(i = 0; i < n; i++) {
if(temp > *(j + i)) {
temp = *(j + i);
tempAdd = j + i;
}
}
return tempAdd; //Sends the address of the lowest element
}
Например, для параметра n = 0
возвращаемое значение вашей функции будет неопределенным, если в функцию не будут внесены дополнительные изменения.
Как переменная temp
также изначально не инициализируется, также возможно, что возвращаемый адрес не определен в случае, если ни один элемент массива не меньше, чем (случайное) значение переменной temp
,
Вот немного более надежная версия:
int* lowest(int *j, int n) { //For finding the lowest element
if( 0 == n ) return NULL; // empty arrays have no smallest element!
int i;
int temp = j[0]; // instead of using pointer arithmetic you can also use this syntax.
int *tempAdd = j; // initially the first element is allegedly the smallest...
for(i = 1; i < n; i++) // loop starts at index 1 now!
{
if(temp > *(j + i)) {
temp = *(j + i);
tempAdd = j + i;
}
}
return tempAdd; //Sends the address of the lowest element
}
Ваша функция main()
также имеет свои проблемы. Вы не можете создать автоматический (расположенный в стеке) массив динамического размера, что вы и пытаетесь. Вместо этого, если вы хотите запросить у пользователя размер массива, вам придется вместо этого прибегнуть к массиву на основе кучи. Или вы запросите размер, который меньше или равен произвольно выбранному фиксированному размеру вашего массива на основе стека.
int main() {
int n = 0;
printf("Enter the number of inputs (1..500): ");
scanf("%d", &n);
if( n < 1 || n > 500 ) {
puts("Invalid input.");
return -1;
}
int arr[500]; // 500 was chosen because most likely no one is crazy enough to manually type in more values by hand ;)
int i;
for(i = 0; i < n; i++) {
printf("\nEnter element no. %d: ", i + 1);
scanf("%d", &arr[i]);
}
for(i = 0; i < n; i++) {
printf("Element no. %d is %d with the address %d.\n", i + 1, *(arr + i), arr + i);
}
int * low = lowest(arr, n); //Saves the address of the lowest element.
printf("\nThe Lowest element in the list is %d with address %p.", *low, low); //Error occurs
return 0;
}
Также изменил форматирование на «% p» для указателя.
Также изменился тип low
от int
в int *
,
Не в последнюю очередь вы должны изменить main()
далее, если вы позволите разрешить размер массива 0. Зачем? Потому что в вашей печати вы пишете ...,*low,...
, Как низший () будет возвращать NULL в случае n = 0
, вы бы разыменовали нулевой указатель, что приведет к неприятной ошибке во время выполнения.
С точки зрения дизайна, в конечном итоге возвращение адреса в lower (), по-видимому, нарушает уровень абстракции, связанный с тем, что вы передаете длину массива. Вы смешиваете два стиля, в основном.
int * lowest( int *begin, int * end )
int lowestIndex( int *arr, int n)
Вторая версия, тем не менее, имела бы проблему, состоящую в том, что вы не можете выразить результат «без результата». Например, если размер массива равен 0 или другие недопустимые аргументы передаются в функцию. Таким образом, часто люди делают это так:
bool lowestIndex( int * arr, int n, int *result )
… где возвращаемое значение указывает на успех, а содержимое результата является действительным, только если возвращаемое значение было true
,