Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Возвращение массива функцией

#cpp #массивы #функции #динамические_массивы


Есть код. В функции double f(double x[], int n) делается вычисление нескольких функций
с несколькими переменными. Несколько переменных мы передадим в виде массива double
x[], int n - количество элементов массива; к примеру, пусть будут вычислятся две функции
- я их решил записать в массив double g[n], так как мне надо, что бы функция возвращала
оба вычисления функции: g[0] = x[0] + x[1]; g[1] = x[0] * x[1]. Как вернуть массив
g[n], и каким быть должно обращение к функции (в примере кода сразу в функции memcpy)?
Что не так, поправьте. 
Пример кода.

#include 

using namespace std;

double f(double x[], int n) 
{
    double g[n];
    g[0] = x[0] + x[1];
    g[1] = x[0] * x[1];
    return /* Что? */;
}

main() 
{
    int n = 2;
    double a[2], b[2];
    for (int i = 0; i < n; i++)
    {
        cout << " a[" << i << "] = ";
        cin >> a[i];
    }
    memcpy(b, f(a, n), sizeof(a));
    for (int i = 0; i < n; i++) cout << " b[" << i << "] = " << b[i];
    return 0;
}



    


Ответы

Ответ 1



Возвращать массив как таковой нельзя. Можно вернуть указатель на него - но тогда массив не должен быть локальной переменной! (Кстати, в C++ нельзя объявлять массив с размером, неизвестным во время компиляции.) Поэтому нужно иначе.. Выделить массив динамически, и вернуть (только потом не забыть освободить память!) int * g = new int[n]; ... return g; Использовать, скажем, вектор (наилучший вариант): std::vector g(n); ... return g; Можно обернуть массив в структуру, но опять же, нужно знать размер во время компиляции: struct Array { int g[10]; } ... Array f() { Array g; g.g[0] = 5; ... return g; } Но лучше всего - использовать готовый вектор, тем более что у вас количество элементов заранее не известно, так что std::array<> вам не подойдет. PS Ну и, конечно, вариант с передачей возвращаемого массива в функцию: int g[10]; ... f(..., int* g) { // работа с g[i] ... } ... f(...,g);

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

Отправить комментарий