Есть код. В функции 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
Можно обернуть массив в структуру, но опять же, нужно знать размер во время компиляции:
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);
Комментариев нет:
Отправить комментарий