#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)? Что не так, поправьте. Пример кода. #includeusing 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::vectorg(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);
Комментариев нет:
Отправить комментарий