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

11.03.2019 Выкл. Автор admin

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

Откуда:
Сообщений: 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: программа упадет с грохотом и ошибкой доступа к памяти.
Читайте так же:  Налог на имущество физических лиц 2011 ставки

Проблему с размером можно решить двумя путями: передавать в функцию дополнительно размер массива или передавать массив по ссылке (если передавать массив по ссылке, ошибки с тем, что вы передали или вернули массив неправильного размера будут выявлены на стадии компиляции):

В обоих случаях вернется указатель (или ссылка) на исходный массив. Но смысла возвращать что либо из функции в таком случае нет, вы просто можете продолжать использовать старую переменную.

Чтобы вернуть новый массив, придется просто внутри функции выделить память под новый массив и вернуть указатель на нее (главное потом не забыть очистить память):

Но у нас же C++, черт возьми, так что стоит вместо стандартных сишных массивов воспользоваться теми контейнерами, которые предоставляет Родина STL:

  • std::vector такой «массив» с изменяемым размером;
  • std::array массив фиксированного размера.

Теперь мы можем использовать итераторы, Range-based for loop (начиная с C++11) и прочие прелести: