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

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

Откуда:
Сообщений: 134

Есть функция принимающая, например, 3 аргумента

Есть функция, которая принимает указатель на массив, заполняет значения и возвращает его обратно.

Вопрос, можно ли возвратить данный массив как аргументы? Например, как то — так

Чтобы первый аргумент для state (t) был level[0] и т.д.

Заранее благодарен за любую помощь!

Откуда: Санкт-Петербург
Сообщений: 1319

если у нас нет ограничения и вы можете менять сигнатуры, то можно все детерминировать используя современный C++

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

если можно менять сигнатуру, то можно state оформить как

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

Нужно вернуть массив типа int из функции

Как я понимаю сделать это можно только с помощью указателей
У меня это получилось но так как везде пишут что указатели очень сложная тема решил узнать правильно ли я все сделал

1)Обязательно ли присваивать значения каждому элементу массива который передаеться в функцию и потом изменяеться с помощью указателей ?
2) Как я понимаю ссылки вообще никак нельзя использовать для возвращения массива из функции ?

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

Возвращение массива из функции
Почему такой код выводит массив корректно. int* Input() < int b = <.

Возвращение массива из функции
Как вернуть массив из функции? double* Zapolnenie(string Name) < if (Name.

Возвращение двумерного массива из функции
int function (int x, const int r, const int c) //работает только если указана.

Возвращение двумерного массива из функции
Здравствуйте, написал пробник, чтобы освоить метод возвращения из функции.

При работе с массивом опирайся на здравый смысл. В общем, с указателями сложного ничего нет это треп все. Указатель — это переменная,в которой хранится адрес.Еще указателя есть тип — с помощью него ты говоришь себе,компилятору и тому,кто читает код,что именно по этому адресу лежит.Массив — это кусок памяти,который разбит для нескольких элементов одного типа. Или несколько элементов одного типа идущих в памяти подряд. Поэтому полное описание массива включает в себя

1. адрес его начала
2. размер одного элемента
3. кол-во элементов.

В Си :
1.Адрес его начала ассоциируется с именем массива и является по своей сути указателем.
2.Размер одного элемента определяется исходя из типа,который ты объявил.
3.Кол-во элементов остается на усмотрение пользователя. Именно поэтому есть ошибки выхода за пределы.
По твоим вопросам.

Это интересно:  Торговый налог в сша

Передавая в функцию указатель ты сообщаешь ей адрес начала массива и размер одного элемента одновременно. Размер — потому что сообщаешь тип, адрес начала — потому что указатель. Часто дополнительно передается еще одна переменная — размер массива,чтобы функция обладала всей информацией.

Для обработки массивов используют обычно циклы. Что тут еще сказать. Пробегаешь циклом от начала до конца и делаешь с каждым что надо.

Как вернуть массив из функции?

Как я могу вернуть массив из метода и как его объявить?

но было бы «больше С++» использовать векторы:

ИЗМЕНИТЬ
Я уточню некоторые моменты. Поскольку вы упомянули С++, я поеду с операторами new[] и delete[] , но это то же самое с malloc/free.

В первом случае вы напишете что-то вроде:

но это не очень хорошая идея, потому что ваш клиент функции не знает размер массива, который вы возвращаете, хотя клиент может безопасно освободить его с помощью вызова delete[] .

Лучшей сигнатурой будет следующая:

И ваш код клиента теперь будет:

Так как это С++, ` std::vector является широко используемым решением:

Теперь вам не нужно вызывать delete[] , так как он будет обрабатываться объектом, и вы можете смело повторить его с помощью:

что проще и безопаснее.

Как я могу вернуть массив в С++-методе и как его объявить? int [] test (void);??

Это звучит как простой вопрос, но на С++ у вас есть довольно много вариантов. Во-первых, вы должны предпочесть.

std::vector<> , который динамически растет, несмотря на многие элементы, с которыми вы сталкиваетесь во время выполнения, или

std::array<> (введено с С++ 11), в котором всегда хранится ряд элементов, указанных во время компиляции,

. поскольку они управляют памятью для вас, обеспечивая правильное поведение и значительно упрощая вещи:

Практика создания ссылки const для возвращаемых данных иногда может избежать копирования, но обычно вы можете просто полагаться на Оптимизацию возвращаемого значения или — для vector , но не array — перемещать семантику (введенную с помощью С++ 11).

Если вы действительно хотите использовать встроенный массив (в отличие от класса стандартной библиотеки, называемого array , упомянутого выше), один из способов — зарезервировать пространство для вызывающего абонента и сообщить функции:

Другим вариантом является обертка массива в структуре, которая — в отличие от необработанных массивов — законна для возврата по значению из функции:

Начиная с вышеизложенного, если вы застряли с использованием С++ 03, вы можете обобщить его на нечто более близкое к С++ 11 std::array :

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

Чтобы упростить управление объектами кучи, многие программисты на C++ используют «умные указатели», которые обеспечивают удаление, когда указатели (указатели) на объект покидают свои области. С С++ 11:

Это интересно:  Режим работы требования по оформлению

Если вы застряли на С++ 03, лучший вариант — посмотреть, доступна ли библиотека ускорения на вашем компьютере: она предоставляет boost::shared_array .

Еще один вариант — иметь некоторую статическую память, зарезервированную с помощью fn() , хотя это НЕ БЕСПЛАТНАЯ БЕЗОПАСНОСТЬ, и означает, что каждый вызов fn() перезаписывает данные, которые видят все, кто удерживает указатели от предыдущих вызовов. Тем не менее, это может быть удобно (и быстро) для простого однопоточного кода.

C++: Функция возвращает массив

Подскажите пожалуйста, какой способ наиболее предпочтителен для того, чтобы функция возвращала массив?

Например, есть массив char ch[6]=<'hello'>.

Как сделать возможным возврат такого массива?

  • Вопрос задан более трёх лет назад
  • 44460 просмотров

Во-первых так инициализировать нельзя, одинарная кавычка извлекает, грубо, говоря, код символа. Например

поместит туда значение ’50’ — ASCII код двойки.

Можно сделать так:

Учтите, что некоторые компиляторы выдадут вам ворнинг наподобие «возвращение адреса локальной или временной переменной».

Вообще, если вам нужно сделать, например, обработку массива, и вы пишете для этого функцию, то можно просто передать в нее указатель на массив, с которым вы хотите работать, например так:

Возвращать char * на локальную переменную — вы с дуба рухнули? Что вы за советы даете, двоечник?

alexrublev, в Си нельзя возвращать указатель на локальную переменную. Если вам надо вернуть строку, массив, структуру, кусок памяти, делают по другому (есть 2 варианта):

1) вызывающая сторона выделяет буфер в памяти и передает в функцию указатель и его длину. Функция заполняет его данными
2) функция динамически размещает массив в куче через new и возвращает указатель на него. Это дурацкий способ, так как одна функция выделяет память, другая ее освобождает и легко запутаться.

> Учтите, что некоторые компиляторы выдадут вам ворнинг наподобие «возвращение адреса локальной или временной переменной».

Поверьте, в Си эти варнинги выдаются неспроста. Вот такие люди, игнорирующие варнинги, работали в майкрософт, в результате винда представляет из себя сплошное решето.

> А можно вам вопрос: вот если я хочу применить «недурацкий» способ, но вызывающая функция просто не знает, какой длины буфер нужен вызываемой?

Вообще, хороший вопрос. Я, честно говоря, в растерянности. Мне кажется, недурацким способом в Си без объектов и без костылей сделать такое нельзя.

Но в Си++, слава Страуструпу, с помощью костылей и шаблонов можно приделать подсчет ссылок таким образом, что буфер, выделенный в функции, будет автоматически освобождаться по ненадобности. То есть, мы передаем в функцию пустой объект MyString или MyArray, а функция его заполняет данными.

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

Это интересно:  Проживание санья

Ха, и после этого находятся люди, который отказываются принимать блага ООП и пишут на Си. Как они, интересно, такие проблемы решают? Делают контейнер из структуры с функциями?

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

Это функция нахождения делителей числа.

Но ведь в с++ нельзя напрямую присваивать массив массиву. Но что тогда нужно написать в return и какого типа должна быть функция, чтобы можно было это осуществить?

А зачем вам массив deliteli, если вы его нигде не используете?

Предлагаю вам в функцию передать указатель на массив.

В функции при такой передаче не будет известен размер массива, поэтому лучше передать еще и его размер.

Шаманство же, которое вы просите мне не известно. Не факт, что оно вообще есть.

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

Я знаю что во всех почти других языка есть такой тип метода как int[] и я могу вернуть, массив который я передал.

Вот есть такой код:

Как такое сделать?

Дело в том что в C++ в функцию можно передать только указатель (или ссылку) на массив, соответственно вы всегда будете работать с исходным массивом, а не с его копией (и вернете также указатель на исходный массив):

Так же этот код не учитывает размер массива (цикл проходит строго три раза), что может привести к следующему:

  • если длина входного массива больше 3: обработаны будут только первые три элемента массива;
  • если длина входного массива меньше 3: программа упадет с грохотом и ошибкой доступа к памяти.

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

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

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

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

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

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

Возврат функцией/процедурой массива — как это сделать в Паскаль. Пример

Вернуть массив из подпрограммы (процедуры или функции)можно через предварительное описание пользовательского типа массива.

Ниже пример описания и вызова функции, возвращающей массив из 8 элементов — односимвольных строк (то есть строк состоящих из одного символа) — первых восьми символов введённой пользователем строки: