Как передать указатель в другую функцию с++?

226
23 июля 2021, 06:50

В С++ я полный ноль, начал изучать по нужде буквально сутки назад. Есть проблема. Я создаю динамический массив. Потом мне нужно заполнить массив входными данными. Код заполнения массива решил вынести в отдельную функцию. Зачем - не спрашивайте. И тут проблема. Функция не видит указатель arr. Как заставить функцию его видеть? Есть какие-либо варианты, кроме передачи указателя аргументом в функцию?

Код:

#include <iostream>
#include <string>
using namespace std;
//СВАЛКА ПЕРЕМЕННЫХ
void delOZU();
void getArrData();
int* inData = new int(0);
int* arr_ptr = new int;
//-----------------
int main() {
    setlocale(0, "");
    cin >> *inData;
    cout << "Вы ввели число: " << *inData << endl;
    int* arr = new int[*inData];
    arr_ptr = arr;
    cout << "Массиву arr установлен лимит " + *inData << endl;
    cout << arr_ptr << endl;
    cout << "Введите значения массива по порядку от места 0 до места " + *inData << endl;
    getArrData();
    delOZU();
    return 0;
}
void getArrData() {
    int* i = new int(0);
    for (*i = 0; *i <= *inData; *i++) {
        cin >> *arr_ptr[*i];
    }
    delete i;
}
void delOZU() {
    cout << "\nУдаляем все указатели и освобождаем память!" << endl;
    delete inData;
}
Answer 1

Тут несколько опечаток:

  • Условие в цикле: *i <= *inData -> *i < *inData (иначе вы вылезаете на 1 элемент за границу массива).

  • Изменение счетчика в цикле: *i++ -> (*i)++ (потому что у ++ приоритет выше).

  • Доступ к элементу массива: *arr_ptr[*i] -> arr_ptr[*i].

  • Печать числа: cout << "..." + *inData -> cout << "..." << *inData (в С++ строки нельзя соединять с числами через +).

Но вообще - это несерьезно. Слишком много ненужных указателей и new.

Проще написать так:

#include <iostream>
#include <vector>
std::vector<int> GetArray()
{
    int size;
    std::cin >> size;
    std::vector<int> ret;
    for (int i = 0; i < size; i++)
    {
        int x;
        std::cin >> x;
        ret.push_back(x);
    }
    return ret;
}
int main()
{
    std::vector<int> vec = GetArray();
    for (int x : vec)
        std::cout << x << ' ';
    std::cout << '\n';
}
Answer 2

Не знаю, точно ли вам нужно именно inData+1 значение, но если считать, что да - то я бы написал такой код:

#include <iostream>
#include <string>
using namespace std;
//СВАЛКА ПЕРЕМЕННЫХ
void getArrData(int* arrptr, int size);

//-----------------
int main() {
    setlocale(0, "");
    int inData;
    cin >> inData;
    cout << "Вы ввели число: " << inData << endl;
    int* arr = new int[inData + 1];
    cout << "Массиву arr установлен лимит " << inData << endl;
    cout << "Введите значения массива по порядку от места 0 до места " <<
         inData << endl;
    getArrData(arr, inData);
    cout << "Значения в массиве:\n";
    for (int i = 0; i <= inData; i++) {
        cout << "Значение элемента " << i << " равно " << arr[i] << endl;
        }
    delete[]arr;
    return 0;
    }
void getArrData(int* arr_ptr, int inData) {
    for (int i = 0; i <= inData; i++) {
        cin >> arr_ptr[i];
        }
    }
READ ALSO
Чтение первых двух слов строки файла

Чтение первых двух слов строки файла

Столкнулся с такой проблемойМне необходимо записать слова в два массива

337
Создание const поля в объекте структуры

Создание const поля в объекте структуры

Имеется поле в структуре с расширением constКак заполнить его извне при создании обьекта (например, конструктор)

192
C++ Помогите решить проблему [закрыт]

C++ Помогите решить проблему [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

625
Авторизация на html

Авторизация на html

Всем привет! Есть страница где при вводе логина и пароля (верного) должно отобразиться сообщение "вход выполнен" и записать например дату...

333