Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
5 / 5 / 3
Регистрация: 25.11.2010
Сообщений: 23

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

03.06.2012, 08:14. Показов 3100. Ответов 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) Др. варианты?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.06.2012, 08:14
Ответы с готовыми решениями:

Как вернуть массив в данной функции ? Или как записать массив в переменную ?
#pragma once #include "stdafx.h" const int S = 49; int bin2; int decbin(int a, int sistem) { double b;

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

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

10
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
03.06.2012, 09:01
Так чем плох возврат указателя? Правда динамический массив не назовешь локальным. Да думаю, что локальный (т.е. размещенный в стеке функции) массив вряд ли можно передать. После выхода из функции эта память будет считаться свободной.
0
5 / 5 / 3
Регистрация: 25.11.2010
Сообщений: 23
03.06.2012, 09:20  [ТС]
Верно ли, если массив объявлен в функции, значит он локальный, будь он динамическим или статическим?

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

Хочется найти вариант на все случаи жизни, без создания объектов и т.д.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
03.06.2012, 11:26
Дело не в том, где массив объявлен, а в том, где он хранится. Если в куче - Бога ради! - создавайте в функции, передавайте указатель и используйте, где хотите! Но если он хранится в стеке функции:

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

"Хочется найти вариант на все случаи жизни, без создания объектов" - осторожно скажу: это вряд ли получится...
0
5 / 5 / 3
Регистрация: 25.11.2010
Сообщений: 23
03.06.2012, 11:39  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
Дело не в том, где массив объявлен, а в том, где он хранится. Если в куче - Бога ради! - создавайте в функции, передавайте указатель и используйте, где хотите! Но если он хранится в стеке функции:
Вот это - где он будет хранится, меня и путает.
Т.е. динамические массивы всегда хранятся в куче?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
03.06.2012, 12:26
Думаю, да. Динамические массивы глобальны по месту размещения элементов.
1
 Аватар для Lordif
21 / 21 / 4
Регистрация: 18.04.2010
Сообщений: 87
03.06.2012, 12:35
Цитата Сообщение от 1234569 Посмотреть сообщение
Как правильно вернуть локальный массив
Но в вашем коде вы динамически выделяете память. С помощью указателей можно делать с этой выделенной памятью под массив все что угодно в любых функциях. Только в конце программы надо не забыть очистить память.
C++
1
delete[] pReturnedArray;
1
 Аватар для Лжец
34 / 33 / 6
Регистрация: 13.12.2011
Сообщений: 107
03.06.2012, 12:35
Т.е. динамические массивы всегда хранятся в куче?
Думаю, да.
Эм, а разве массив объявленный таким образом:

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

Добавлено через 1 минуту
Цитата Сообщение от Лжец Посмотреть сообщение
Эм, а разве массив объявленный таким образом:
Код C++
1 int* Array = new int [rArraySize];
может храниться где-то не в куче?
Нет, просто сказали общую концепцию. Если хранится в куче - можно, иначе - нет.
0
5 / 5 / 3
Регистрация: 25.11.2010
Сообщений: 23
03.06.2012, 13:11  [ТС]
А как ещё можно передать динамический массив из функции?
0
 Аватар для Lordif
21 / 21 / 4
Регистрация: 18.04.2010
Сообщений: 87
03.06.2012, 13:39
Ну ваш вариант самый нормальный. Если есть еще какие варианты, то все равно неудачные.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.06.2012, 13:39
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru