недопустимый аргумент типа унарного ‘*’ (есть ‘int’) низшего элемента в массиве

Я хочу найти самый низкий элемент в массиве с помощью функции 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;
}

-2

Решение

Ваша функция 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]);
1

Другие решения

  • Для печати адреса вы можете использовать %p как ниже.

    printf("\nThe Lowest element in the list is %d with address %p.", low, low);
    
0

#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);

0

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 для отображения адреса переменной.

0

Здесь первая итерация фиксированной функции. Это все еще не 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 (), по-видимому, нарушает уровень абстракции, связанный с тем, что вы передаете длину массива. Вы смешиваете два стиля, в основном.

  1. STL-стиль будет: int * lowest( int *begin, int * end )
  2. Винтажный стиль будет: int lowestIndex( int *arr, int n)

Вторая версия, тем не менее, имела бы проблему, состоящую в том, что вы не можете выразить результат «без результата». Например, если размер массива равен 0 или другие недопустимые аргументы передаются в функцию. Таким образом, часто люди делают это так:

  1. bool lowestIndex( int * arr, int n, int *result )

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

0
По вопросам рекламы [email protected]