Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1234569
5 / 5 / 1
Регистрация: 25.11.2010
Сообщений: 23
#1

Как вернуть массив? - C++

03.06.2012, 08:14. Просмотров 1225. Ответов 10
Метки нет (Все метки)

Как правильно вернуть локальный массив (вместе с размером) из одной функции в main-функцию и потом передать его в третью функцию?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int* first(int &rArraySize) //Есть функция
{
rArraySize=;//задаём размер массива
int* Array = new int [rArraySize]; //создаем массив
 
return Array; //возвращаем указатель на массив
}
 
void third(int* pReturnedArray, const int rArray1DSize) //прототип
 
void main()
{
int rArray1DSize, * pReturnedArray = NULL;
pReturnedArray = first(preturnedArray); //вызываем первую функцию
third(pReturnedArray, rArray1DSize); //вызываем третью функцию
}
Найденные способы:
1) Передача массива в функцию по ссылке или по указателю - как сейчас, нужно ли делать static функцию first?
2) Стандартный контейнер, например vector - не подходит, нужен исходный неотсортированный массив.
3) Умный указатель - не подходит.
4) Агрегация массива в класс-обработчик - не хочется заворачивать.
5) Использовать структуру - не хочется заворачивать.
6) Др. варианты?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2012, 08:14     Как вернуть массив?
Посмотрите здесь:

Почему функция не может вернуть массив, но может вернуть структуру содержащий массив? - C++
Почему функция не может вернуть массив, но может вернуть структуру содержащую массив? Согласитесь что это некоторое несовершенство языка...

Как вернуть массив - C++
Можно ли вернуть массив через возвращаемое значение? Если нет, то как можно сделать вывод массива в main?

Как вернуть массив? - C++
Как вернуть массив из функции и узнать его размер?

Как вернуть массив? - C++
Функция вроде как работает. Но функция "printMass(mas, l);" дожа выводить этот новый массив, она тоже работает но после "return mas;" в...

Как вернуть массив? - C++
Нужно вернуть массив из функции, как это сделать? #include "stdafx.h" #include <iostream> #include <Windows.h> #include <time.h> ...

Как вернуть массив? - C++
Есть программа #include "stdafx.h" int fun1(int mas,int r) { int i; for (i=0;i<r;i++) { mas=i;

Как вернуть массив из функции? - C++
Please! #include <iostream> using namespace std; int _plus1 (int array ) { for (int i = 0; i < 5; i++){ array...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
22514 / 10919 / 1774
Регистрация: 12.02.2012
Сообщений: 18,067
03.06.2012, 09:01     Как вернуть массив? #2
Так чем плох возврат указателя? Правда динамический массив не назовешь локальным. Да думаю, что локальный (т.е. размещенный в стеке функции) массив вряд ли можно передать. После выхода из функции эта память будет считаться свободной.
1234569
5 / 5 / 1
Регистрация: 25.11.2010
Сообщений: 23
03.06.2012, 09:20  [ТС]     Как вернуть массив? #3
Верно ли, если массив объявлен в функции, значит он локальный, будь он динамическим или статическим?

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

Хочется найти вариант на все случаи жизни, без создания объектов и т.д.
Catstail
Модератор
22514 / 10919 / 1774
Регистрация: 12.02.2012
Сообщений: 18,067
03.06.2012, 11:26     Как вернуть массив? #4
Дело не в том, где массив объявлен, а в том, где он хранится. Если в куче - Бога ради! - создавайте в функции, передавайте указатель и используйте, где хотите! Но если он хранится в стеке функции:

C++
1
2
3
4
5
6
7
8
int * Func(...)
{
 
   int A[100];
 
   return A;
 
}
ни к чему хорошему не приведет.

"Хочется найти вариант на все случаи жизни, без создания объектов" - осторожно скажу: это вряд ли получится...
1234569
5 / 5 / 1
Регистрация: 25.11.2010
Сообщений: 23
03.06.2012, 11:39  [ТС]     Как вернуть массив? #5
Цитата Сообщение от Catstail Посмотреть сообщение
Дело не в том, где массив объявлен, а в том, где он хранится. Если в куче - Бога ради! - создавайте в функции, передавайте указатель и используйте, где хотите! Но если он хранится в стеке функции:
Вот это - где он будет хранится, меня и путает.
Т.е. динамические массивы всегда хранятся в куче?
Catstail
Модератор
22514 / 10919 / 1774
Регистрация: 12.02.2012
Сообщений: 18,067
03.06.2012, 12:26     Как вернуть массив? #6
Думаю, да. Динамические массивы глобальны по месту размещения элементов.
Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
03.06.2012, 12:35     Как вернуть массив? #7
Цитата Сообщение от 1234569 Посмотреть сообщение
Как правильно вернуть локальный массив
Но в вашем коде вы динамически выделяете память. С помощью указателей можно делать с этой выделенной памятью под массив все что угодно в любых функциях. Только в конце программы надо не забыть очистить память.
C++
1
delete[] pReturnedArray;
Лжец
31 / 31 / 3
Регистрация: 13.12.2011
Сообщений: 106
03.06.2012, 12:35     Как вернуть массив? #8
Т.е. динамические массивы всегда хранятся в куче?
Думаю, да.
Эм, а разве массив объявленный таким образом:

C++
1
int* Array = new int [rArraySize];
может храниться где-то не в куче?
Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
03.06.2012, 12:38     Как вернуть массив? #9
Если вы ставили вопрос иначе, есть ли какие нибудь способы вернуть массив, созданный без использования динамической памяти, то такого способа нет.

Добавлено через 1 минуту
Цитата Сообщение от Лжец Посмотреть сообщение
Эм, а разве массив объявленный таким образом:
Код C++
1 int* Array = new int [rArraySize];
может храниться где-то не в куче?
Нет, просто сказали общую концепцию. Если хранится в куче - можно, иначе - нет.
1234569
5 / 5 / 1
Регистрация: 25.11.2010
Сообщений: 23
03.06.2012, 13:11  [ТС]     Как вернуть массив? #10
А как ещё можно передать динамический массив из функции?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2012, 13:39     Как вернуть массив?
Еще ссылки по теме:

Как вернуть массив из функции? - C++
В общем есть функция: ? foo() { array<array<double, N>, 10> Wave; .... return ?; } Как правильно написать return?

Как вернуть массив из функции? - C++
int SumElementovStolbca(int M, int mas, int N) { int sum = 0; for (int i = 0; i<N; i++) { for (int j = 0; j<N; j++) {...

Как вернуть массив из функции? - C++
#include "stdafx.h" #include <iostream> using namespace std; int mass(int n) { int* Mass = new int; //здесь...

Как вернуть массив из функции? - C++
у меня есть две функции: Одна должна возвращать три числа, а вторая двумерный массив 10Х10; Как это провернуть?

как вернуть массив и как неявно получить атрибут объекта - C++
хочу спросить как из функции вернуть массив int g(void){ int a; //как-то его заполнить return a; } массив...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Lordif
21 / 21 / 1
Регистрация: 18.04.2010
Сообщений: 87
03.06.2012, 13:39     Как вернуть массив? #11
Ну ваш вариант самый нормальный. Если есть еще какие варианты, то все равно неудачные.
Yandex
Объявления
03.06.2012, 13:39     Как вернуть массив?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru