Возврат массивов из функций
Содержание:
Возврат массивов из функций
Откуда:
Сообщений: 134
Есть функция принимающая, например, 3 аргумента
Есть функция, которая принимает указатель на массив, заполняет значения и возвращает его обратно.
Вопрос, можно ли возвратить данный массив как аргументы? Например, как то — так
Чтобы первый аргумент для state (t) был level[0] и т.д.
Заранее благодарен за любую помощь!
Откуда: Санкт-Петербург
Сообщений: 1319
если у нас нет ограничения и вы можете менять сигнатуры, то можно все детерминировать используя современный C++
если надо оставить сигнатуры функций как они представлены в первоначальном вопросе, то, боюсь, кроме как использовать временную переменную и ее скармливать по частям никак
если можно менять сигнатуру, то можно state оформить как
Возврат массивов из функций
Есть код. В функции 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 )? Что не так, поправьте. Пример кода.
Возвращать массив как таковой нельзя. Можно вернуть указатель на него — но тогда массив не должен быть локальной переменной! (Кстати, в C++ нельзя объявлять массив с размером, неизвестным во время компиляции.)
Поэтому нужно иначе..
Выделить массив динамически, и вернуть (только потом не забыть освободить память!)
Использовать, скажем, вектор (наилучший вариант):
Можно обернуть массив в структуру, но опять же, нужно знать размер во время компиляции:
Но лучше всего — использовать готовый вектор, тем более что у вас количество элементов заранее не известно, так что std::array<> вам не подойдет.
PS Ну и, конечно, вариант с передачей возвращаемого массива в функцию:
Возврат массивов из функций
Есть функция parseDesc() . В результате ее выполнения получается массив $productDesc[] .
Вопрос: Как вытащить этот массив и использовать не только в самой функции?
Чтобы вернуть результат работы функции, необходимо использовать оператор return .
После этого можно будет присвоить результат работы функции переменной.
Уважаемый @Egor Smolyakov На ваш вопрос ответил @Ипатьев и это половина ответа. Этот ответ абсолютно верен, если результат вашей функции это генерировать массив $productDesc Но если у вас функция выполняет другую задачу, а генерация массива побочное действие, то вам скорее всего придется изменять формат выводимых данных
Либо использовать ссылку в функции, что чревато ошибками при повторном вызове функции
Но я на стадии проектировании выбираю — либо это функция выполняющая конкретно возложенное на нее обязательство, либо сущность с характерными для нее свойствами
Передача массива в функцию и возврат из функции
Особенность передачи массивов в функции в языке Си в том, что передается не сам массив, а адрес массива, который хранится в локальном указателе на него.
Это можно сделать по-разному, но результат будет одинаковый:
- void some_function(int array[]);
- void some_function(int *array);
При этом обязательно нужно указать тип элемента массива.
Размер массива в функцию автоматически не передается, поэтому если размер массива заранее (на этапе компиляции) не оговорен, то нужно передать параметр, который содержит количество элементов в массиве, например number_of_elements:
void some_function(int array[], int number_of_elements);
Следующая программа передает массивы в функцию show_array, которая использует цикл for для вывода значений массивов:
void show_array (int array [], int number_of_elements)
<
for ( int i = 0; i printf(«%d\t», array[i]);
>
printf(«\n»);
>
int main()
<
int little_numbers[5] = <1, 2, 3, 4, 5>;
int big_numbers[3] = <1000, 2000, 3000>;
show_array(little_numbers, 5);
show_array(big_numbers, 3);
>
Массив просто передается в функцию по имени (а его имя — это адрес первого элемента), а также указывает параметр, который сообщает функции количество элементов, содержащихся в массиве:
Изменение массива из функции
Возможно ли поменять значения элементов из функции?
Ответ положительный — да, это возможно, причем ничего дополнительно для этого указывать не нужно, так как в функцию передается адрес массива, а не сами значения, то и доступ происходит к тем же самым элементам, а не к их копиям.
Следующая программа использует функцию get_values, чтобы присвоить три значения массиву numbers:
values_from_keyboard.c
#include
void read_array(int array[], int number_of_elements)
<
for(int i = 0; i read_array (numbers, 3); //массив будет изменен!
printf(» Значения массива\n»);
for (int i = 0; i printf(» numbers [%d] \n», i);
>
Как видите, программа передает массив в функцию по имени, а функция присваивает массиву элементы.
Таким образом, функция может изменить элементы массива, если ей это нужно.
Возврат функцией/процедурой массива — как это сделать в Паскаль. Пример
Вернуть массив из подпрограммы (процедуры или функции)можно через предварительное описание пользовательского типа массива.
Ниже пример описания и вызова функции, возвращающей массив из 8 элементов — односимвольных строк (то есть строк состоящих из одного символа) — первых восьми символов введённой пользователем строки:
Возврат массивов из функций
Я знаю что во всех почти других языка есть такой тип метода как int[] и я могу вернуть, массив который я передал.
Вот есть такой код:
Как такое сделать?
Дело в том что в C++ в функцию можно передать только указатель (или ссылку) на массив, соответственно вы всегда будете работать с исходным массивом, а не с его копией (и вернете также указатель на исходный массив):
Так же этот код не учитывает размер массива (цикл проходит строго три раза), что может привести к следующему:
- если длина входного массива больше 3: обработаны будут только первые три элемента массива;
- если длина входного массива меньше 3: программа упадет с грохотом и ошибкой доступа к памяти.
Проблему с размером можно решить двумя путями: передавать в функцию дополнительно размер массива или передавать массив по ссылке (если передавать массив по ссылке, ошибки с тем, что вы передали или вернули массив неправильного размера будут выявлены на стадии компиляции):
В обоих случаях вернется указатель (или ссылка) на исходный массив. Но смысла возвращать что либо из функции в таком случае нет, вы просто можете продолжать использовать старую переменную.
Чтобы вернуть новый массив, придется просто внутри функции выделить память под новый массив и вернуть указатель на нее (главное потом не забыть очистить память):
Но у нас же C++, черт возьми, так что стоит вместо стандартных сишных массивов воспользоваться теми контейнерами, которые предоставляет Родина STL:
- std::vector такой «массив» с изменяемым размером;
- std::array массив фиксированного размера.
Теперь мы можем использовать итераторы, Range-based for loop (начиная с C++11) и прочие прелести: