Страницы

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

среда, 24 апреля 2019 г.

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

Есть код. В функции 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; }


Ответ

Возвращать массив как таковой нельзя. Можно вернуть указатель на него - но тогда массив не должен быть локальной переменной! (Кстати, в 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);

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

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