Ошибка компилятора C2100 (недопустимое косвенное обращение)

не могу понять как решить эту ошибку. Это не конечный код, так-что не обращайте внимание на то что пишу в "". Заранее спасибо спасибо.

using namespace std;

void vibor(int k) {

    int key;
    cin >> k;
    if (k == 1) {
        cout << "key ";
        cin >> key;
        int n;
        int arr;
        find(arr, n, key);
    }
    else if (k == 2) {
        cout << "key ";
        cin >> key;
    }
    else {
        cout << "ne verno. more: ";
        vibor(k);
    }   
}
int find(int arr[], int n, int key) {
    if (arr[n - 1] != key) {
        arr[n - 1] = key;
        int i = 0;
        while (arr[i] != key)
        {
            i++;
            if (i < n - 1) {
                return i;
            }
        }
    }
    else {
        return n - 1;
    }
}
int main() {
    int* arr;
    int n;
    int k;
    cout << "Rozmir: ";
    cin >> n;
    arr = new int[n];
    for (int i = 0; i < n; i++) {
        arr[i] = rand() % 30;
    }
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }   
    cout << endl;
    cout << "yak naity? :" << endl << "1- barer; 2- binar" << endl << "viboe: ";
    cin >> k;
    vibor(k);
}


Ответы (2 шт):

Автор решения: Harry

Поскольку скорее всего будет вопрос "и как это исправить?" :),

find перенесите перед vibor (или дайте объявление функции find до vibor, чтобы компилятор понимал, с чем имеет дело.

В vibor передавайте еще и свой массив -и его размер:

void vibor(int k, int * arr, int n) {

выбросив из этой функции строки

int n;
int arr;

И еще - обратите внимание, что формально у вашей find есть ветка без returnничего не вернет, если не найдет нужное значение - а ничего не возвращать она не имеет права... Я понимаю, что оно туда не выскочит, но вот компилятор... :)

→ Ссылка
Автор решения: Alex Chili

Программа которою мне удалось сделать:

#include <iostream>
#include <ctime>

using namespace std;
//создаем динамический массив
int Ini_len_arr() {
  cout << "Enter element of array :";
  int                //длина массива
  cin >> n; cout << endl;
  if (n < 0) {       //если указали число <0, то выводим сообщение
    cout << "Not correct,try again!";
    Ini_len_arr();
  }
  return n;
}
//отображение массива
void print(int n, int* arr) {
  for (int i = 0; i < n; i++) {      //цикл прохождения по массиву 
    arr[i] = rand() % 30;            //заполнение случайными числами
    cout << arr[i] << " ";           //вывод массива на экран
  }
}
//сортировка пузырьком (понадобится для поиска двоичным методом)
void sort(int n, int* arr) {
  int tmp;                                     //выделения памяти для обмена 
  for (int j = 0; j < n - 1; j++) {            //проход по массиву
    for (int i = 0; i < n - 1; i++) {
      if (arr[i] > arr[i + 1]) {               //сравнение 2х элементов 
        tmp = arr[i];              //если элементы стоят не правильно то меняем их местами
        arr[i] = arr[i + 1];
        arr[i + 1] = tmp;
      }
    }
  }
}
//поиск двоичным методом
void findbin(int n, int* arr, int key) {
  int l = arr[0];      //обозначаем грани отсортированного массива l-мин h-макс значение
  int h = arr[n-1];
  int iter=0;          // переменная для вычисления итераций
  unsigned int start_time1 = clock();    //момент начала отчёта времени поиска
  while (l <= h) {     // цикл прекратится когда число будет найдено
    iter++;            // почёт итераций
    int m = (l + h) /     //поиск центра 
    if (arr[m] == key) {  //когда число будет найдено на кране отобразится индекс элемента
      cout << "Positions:\t " << m + 1 << endl << "Iteratoins:\t " << iter << endl;
      break;
    }
    if (arr[m] < key) {    //если сокращение массива указало на число меньше чем заданное
      l = m + 1;
    }
    if (arr[m] > key) {   //если сокращение массива указало на число больше чем заданное
      h = m - 1;
    }
  }
  unsigned int end_time1 = clock();  //момент остановки времени
  unsigned int search_time1 = end_time1 - start_time1;  //сколько времени прошло
  cout << "Time:\t " << search_time1 << "ms" << endl;   //вывод времени
}
//поиск с барьером
void findbar(int arr[], int n, int key) {
  int iter = 0;
  if (arr[n - 1] != key) {//проверка не является ли заданный элемент не является последним
    arr[n - 1] = key;  //становление на последнее место элемент который ищем  
    int i = 0;
    unsigned int start_time = clock();
    while (arr[i] != key)       //цикл продолжается пока не найдёт число
    {
      i++;       //поиск индекса 
      iter++;    //вычисление кол-во итераций
    }
    cout << "Positions:\t " << i + 1 << endl << "Iteratoins:\t " << iter << endl;
    unsigned int end_time = clock();
    unsigned int search_time = end_time - start_time;
    cout << "Time:\t " << search_time << "ms" << endl;
  }
  else {
    cout << "Positions:\t " << n << endl << "Iteratoins:\t " << 1 << endl;
    cout << "Time:\t " << 1 << "ms" << endl;
  }
}
//тело программы  
void menu(int k, int* arr, int n) {
  int key;             //число которое будем искать
//выбор способа
  if (k == 1) {        //поиск с барьером
    cout << "key ";
    cin >> key;
    findbar(arr, n, key); 
  }
  else if (k == 2) {     // поиск двоичным методом 
    cout << "key ";
    cin >> key;
    sort(n, arr);
    findbin(n, arr, key);
  }
  else {                // если выбор не соответствует вариантам  
    cout << "Not correct, try again: ";
    cin >> k;
    if (k >= 3) {
      menu(k, arr, n); // просим повторить попытку
    }
    else {
      menu(k, arr, n);
    }
  }
}

int main() {
  int k;
//создание массива
  int n = Ini_len_arr();
  int* arr = new int[n];
//отображение массива
  print(n, arr);
  cout << endl;
//визуальное меню
  cout << "Search:" << endl << "1-barier ; 2- binary" << endl << "your choise: ";
  cin >> k;       //выбор варианта поиска 
  menu(k, arr, n);
}
→ Ссылка