Недопустимое преобразование из int в int* ошибка для функции с типом возврата void

#c #arrays #function #pointers

Вопрос:

Итак, мне нужно получить максимальное значение из массива. Таким образом, первая строка ввода содержит количество элементов массива, а затем значения для массива. Но я действительно не понимаю, почему эта ошибка продолжает появляться, когда я передаю функции массив целочисленного типа. На данный момент мне немного сложно работать с указателями и функциями.

 #include<iostream>
using namespace std;
void maxim(long long int nums[],long long int n){
    int max_val=0;
    for(int i=0;i<n;i  ){
        if(nums[i]>max_val){
            max_val=nums[i];
        }
    }
    cout<<max_val<<endl;
}
int main() {
    long long int n;
    cin>>n;
    long long int arr[n];
            for(int i=0;i<n;i  ){
        cin>>arr[i];
    }
    maxim(arr[n],n);
    return 0;
}
 

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

1. Вы должны пройти arr вместо arr[n] «как maxim(arr,n); «.

2. long long int arr[n]; — Это недопустимый C . Массивы в C должны иметь размер, обозначаемый выражением во время компиляции, а не значением во время выполнения. Вместо этого используйте std::vector<long long> arr(n); . Кроме того, n он не инициализирован, и вы используете его, что неправильно.

3. Итак, мне нужно получить максимальное значение из массива -это то, что вы хотите сделать? Если это так, то ваша попытка далека от того, как на самом деле достичь этой цели в C . Почему бы просто не использовать std::min_element ?

4. Это все равно неправильно. Массивы переменной длины (как у вас long long int arr[n] ) недопустимы на языке C (в соответствии со стандартом). Вместо этого вы должны использовать std::vector<long long int><long long int> , что является правильной и идиоматической заменой для этого.

5. Следовало бы сказать std::max_element , что нет std::min_element .

Ответ №1:

 #include<iostream>
using namespace std;
void maxim(long long int *nums,long long int n){
    long long int max_val=nums[0];
    for(int i=1;i<n;i  ){
        if(nums[i]>max_val){
            max_val=nums[i];
        }
    }
    cout<<max_val<<endl;
}
int main() {
    long long int n;
    long long int *arr;
    cin>>n;
    arr = new long long int[n];
    for(int i=0;i<n;i  ){
        cin>>arr[i];
    }
    maxim(arr,n);
    delete []arr;
    return 0;
}
 

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

1. так и должно быть maxim(arr,n); , а не maxim(arr[n],n);

2. Не могли бы вы уточнить, что было не так в вопросе?

3. long long int arr[n]; // это статический массив. но c не поддерживает это, и n должно быть постоянным. Необходимо использовать динамическое выделение памяти с помощью операторов new и delete.

4. В этом ответе все еще есть недостатки. int max_val=0; — Передаваемый тип является указателем long long , а не int . Если одно из значений в массиве превышает диапазон an int , функция завершится ошибкой. Во-вторых, это приведет к сбою, если все значения в массиве будут отрицательными.

5. ты прав. Я отредактировал «int max_val = nums[0];»