Проблема с функцией c — ошибка: несовместимые типы при присвоении ‘int’ ‘int [n]’

#c #variable-assignment #function-declaration #variable-length-array #incompatibletypeerror

#c #переменная-присвоение #объявление функции #массив переменной длины #ошибка несовместимого типа

Вопрос:

я хочу создать функцию на c с именем ‘losowanie’, эта функция должна рандомизировать n чисел между 0-n. Когда я вызываю эту функцию, я получаю :

 error: incompatible types in assignment of ‘int’ to ‘int [n]’
 

Вот мой код :

  #include <iostream>
    #include <stdlib.h>
    #include <time.h>
   
using namespace std;

int losowanie (int tab[], int n) {
    for(int i = 0;i<n; i  ) {
        tab[i] = rand() % n   1;
        cout<<tab[i]<<endl;
    }
}

int main()
{
    int n = -1;
    
    while(n<0 || n>50) {
        cout<<"Give number (  0 - 50)"<<endl;
        cin>>n;
    }
    
    int tab[n];
    tab = losowanie(tab, n); //here is error
    
    return true;
}
 

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

1. Похоже losowanie , предполагается заполнить tab массив на месте. Как вы думаете, что он должен возвращать?

2. как сказал @BoBTFish, losowanie заполняет массив на месте, просто удалите это дополнительное присвоение переменной tab результата функции. losowanie(tab, n); Также эта функция должна возвращать значение int (в настоящее время ничего не возвращает), а ваша вкладка представляет собой массив int

Ответ №1:

Для начала массивы переменной длины, подобные этому

 int tab[n];
 

это не стандартная функция C . Вместо этого используйте стандартный контейнер std::vector .

Этот цикл while

 while(n<0 || n>50) {
 

позволяет ввести значение 0 для переменной n . Однако вы не можете объявлять массив переменной длины с 0 элементами.

Функция losowanie

 int losowanie (int tab[], int n) {
    for(int i = 0;i<n; i  ) {
        tab[i] = rand() % n   1;
        cout<<tab[i]<<endl;
    }
}
 

имеет возвращаемый тип int , но ничего не возвращает.

В этом операторе присваивания

 tab = losowanie(tab, n);
 

левый операнд имеет тип int[n] , в то время как возвращаемый тип функции int . Таким образом, компилятор выдает ошибку, потому что это утверждение не имеет смысла. Массивы не имеют оператора присваивания.

Вы можете изменить тип функции с int на на void и удалить оператор присваивания.

Также вы должны использовать стандартную функцию C srand для получения различных последовательностей случайных чисел.

Ответ №2:

losowanie возвращает int, но tab является массивом. Достаточно сделать losowanie для функции void.

 void losowanie (int tab[], int n) {
for(int i = 0;i<n; i  ) {
    tab[i] = rand() % n   1;
    cout<<tab[i]<<endl;
}
 

И, в основном:

 int tab[n];
losowanie(tab, n);