Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/275: Рейтинг темы: голосов - 275, средняя оценка - 4.59
11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434

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

23.08.2009, 09:20. Показов 53103. Ответов 37
Метки нет (Все метки)

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


Как я понимаю сделать это можно только с помощью указателей
У меня это получилось но так как везде пишут что указатели очень сложная тема решил узнать правильно ли я все сделал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void straight(int*); // прототип функции
 
void straight(int* pmas_outs_straight){
 
pmas_outs_straight[0]=1;
pmas_outs_straight[1]=2;
 
}
 
main{
int straight_outs[]={0,0};
straight(straight_outs);
}
два вопроса

1)Обязательно ли присваивать значения каждому элементу массива который передаеться в функцию и потом изменяеться с помощью указателей ?
2) Как я понимаю ссылки вообще никак нельзя использовать для возвращения массива из функции ?
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.08.2009, 09:20
Ответы с готовыми решениями:

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

Возвращение массива из функции
Как вернуть массив из функции? double* Zapolnenie(string Name) { if (Name == "A") { const int number1 = 10; double A; ...

Возвращение массива из функции
Почему такой код выводит массив корректно. int* Input() { int b = { 10,20,30 }; return b; } int main() {

37
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
27.08.2009, 00:02
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Rififi Посмотреть сообщение
А других и не бывает
Бывают вот такие:

C
1
int a[n];
Дл них конструкция sizeof работает валидно

Бывают такие:

C
1
int *a = malloc (...);
Тут, понятное дело, sizoef в принципе не может работать, потому как нетпеременной, а есть только указатель

Цитата Сообщение от Rififi Посмотреть сообщение
А теперь - другой вариант (и, кстати, правильно работающий для всех типов, а не только для int) (:
Дико подозреваю, что для начинающего нужен простой вариант на Си, а не изыски с шаблонами. ПРавда это был ответ на "других не бывает".
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:03
Цитата Сообщение от Rififi Посмотреть сообщение
template <typename T, size_t N>
size_t array_size(const T(&)[N]) { return N; }
так правильней.

Rififi, ты видишь что человек только учит С++? Скажи мне? Ты начинал свое обучение с шаблонов функций?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
27.08.2009, 00:10
Rififi, Monte-Cristo, а покажите, как этой хреновиной поьзоваться. А то я в Си++ не особо
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
27.08.2009, 00:11
Monte-Cristo,
Rififi, ты видишь что человек только учит С++?
собстна, Evg всё уже сказал - это был ответ на "других не бывает"

Бывают вот такие:
int a[n];


Только в C99, но в принципе ты прав.

Бывают такие:

int *a = malloc (...);

А это и не массив ни разу, а указатель на целое.

Скажи мне? Ты начинал свое обучение с шаблонов функций?
Неа. С рассматривания картинок. DDD
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
27.08.2009, 00:14
Цитата Сообщение от Rififi Посмотреть сообщение
int *a = malloc (...);[/I]
А это и не массив ни разу, а указатель на целое
Согласен, но такую конструкцию многие называют "динамически выделяемый массив". При этом такой термин имеет право на жизнь хотя бы потому, что разыменовывание указателя можно осуществлять через операции декомпозиции массива (квадратные скобки)
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:21
Цитата Сообщение от Rififi Посмотреть сообщение
это был ответ на "других не бывает"
Не хотел дурить парню голову. Все должно постигаться своевременно и без спешки. Просто сужу по собственному опыту: когда я впервые увидел шаблоны я был в диком удивлении и пытался понять что это за нелепость?

Цитата Сообщение от Rififi Посмотреть сообщение
int *a = malloc (...);
А это и не массив ни разу, а указатель на целое.
ну это естевственно.. с архитектурной точки зрения.. но в учебниках, да как и большинство преподователей, упоминается это как динамическое создание массивов.

Не по теме:

Цитата Сообщение от Rififi Посмотреть сообщение
Неа. С рассматривания картинок. DDD
Слабак.. я с рассматривания кода ядра linux (хоть там и си). Однако.. это заставило меня задуматься над смылом жизни.

0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 00:21
Цитата Сообщение от nill Посмотреть сообщение
спасибо всем за ответы

valeriikozlov
Ну вроде не очень и сложнее
просто в книге пишут что если возможно то надо пользоваться ссылками вместо указателей
то есть вместо моего кода луше использовать твой где все сделано с помощью ссылок

skvor
А зачем это на что то может повлиять или просто для наглядности ?
nill, теперь вы поняли, что главная проблема здесь - не выйти за границы массива. все просто.

а всякие "штучки" оставьте на потом, этих штучек - пруд пруди, и никто не знает все. чем меньше вы их будете применять без меры, тем лучше будет ваша жизнь.
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
27.08.2009, 00:33
Evg,
Rififi, Monte-Cristo, а покажите, как этой хреновиной поьзоваться. А то я в Си++ не особо
в простейшем случае, чтобы просто подсчитать длинну статического массива (и только его, т.к. на указателях эта функция выдаст ошибку времени компиляции)
int arr[10];
const size_t N = array_count(arr); // N = 10

но вот такая конструкция уже не пройдёт:
int arr2[array_size(arr)];
ибо array_size - это не константа времени компиляции
чтобы заставить строчку с arr2 компилироваться, нужно преобразовать исходный массив в массив однобайтовых элементов (и тогда его размер == его sizeof), а также учесть тот замечательный факт, что sizeof не выполняет вызов функции - размер вычисляется в compile-time.
тогда:

template <typename T, const size_t N>
char (&array_size(const T (&)[N]))[N];
int arr[sizeof(array_size(arr))];

выглядит страшновато, ну а кому щас легко? :green:
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
27.08.2009, 08:45
Цитата Сообщение от Rififi Посмотреть сообщение
выглядит страшновато, ну а кому щас легко? :green:
А главное - нафига вот так всё сложно. Сделать макрос через sizoef'ы и не париться. Хотя я понимаю, что использование макросов для многих считается непацанским стилем и вообще несовместимым с концепцией Си++. Но у меня нет практики работы с Си++, а когда что-то пытался сделать - миллион раз казалось плюнуть на эту концепцию и сделать по простому
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 10:36
Цитата Сообщение от Rififi Посмотреть сообщение
Evg,
Rififi, Monte-Cristo, а покажите, как этой хреновиной поьзоваться. А то я в Си++ не особо
в простейшем случае, чтобы просто подсчитать длинну статического массива (и только его, т.к. на указателях эта функция выдаст ошибку времени компиляции)
int arr[10];
const size_t N = array_count(arr); // N = 10

но вот такая конструкция уже не пройдёт:
int arr2[array_size(arr)];
ибо array_size - это не константа времени компиляции
чтобы заставить строчку с arr2 компилироваться, нужно преобразовать исходный массив в массив однобайтовых элементов (и тогда его размер == его sizeof), а также учесть тот замечательный факт, что sizeof не выполняет вызов функции - размер вычисляется в compile-time.
тогда:

template <typename T, const size_t N>
char (&array_size(const T (&)[N]))[N];
int arr[sizeof(array_size(arr))];

выглядит страшновато, ну а кому щас легко? :green:
esli by eto esh4e i kompirirovalos' - zeny b emu ne bylo
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
27.08.2009, 10:39
esli by eto esh4e i kompirirovalos' - zeny b emu ne bylo
esli by vse polzovalis' normalnymi kompilyatorami a ne kakimi-to krivul'kami, bylo by esche kruche.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
27.08.2009, 10:58
Цитата Сообщение от Rififi Посмотреть сообщение
esli by vse polzovalis' normalnymi kompilyatorami a ne kakimi-to krivul'kami, bylo by esche kruche.
По-моему твой вариант не должен зависеть от компилятора, т.к. там всё по стандарту Си++ (наверное). Т.е. причиной могут быть только кривые руки
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
27.08.2009, 11:02
Evg,
А главное - нафига вот так всё сложно. Сделать макрос через sizoef'ы и не париться.
Это только для тех, кто предпочитает создавать более безопасный код. для каких-нибудь пользователей продукции Борланд (aka формошлёпщиков) можно действительно не париться
0
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
27.08.2009, 11:07
Если нельзя опеределить размер динамического массива, то как же delete [] узнает сколько элементов удалять?
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
27.08.2009, 11:10
HIMen,
потому что оно использует свои внутренние механизны, относящиеся к контретной реализации конкретного менеджнра памяти, недоступные обычному пользователю.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
27.08.2009, 11:11
Цитата Сообщение от Rififi Посмотреть сообщение
Это только для тех, кто предпочитает создавать более безопасный код. для каких-нибудь пользователей продукции Борланд (aka формошлёпщиков) можно действительно не париться
Чем же такой вариант более безопасен, чем вариант с sizeof?

Добавлено через 1 минуту
Цитата Сообщение от HIMen Посмотреть сообщение
Если нельзя опеределить размер динамического массива, то как же delete [] узнает сколько элементов удалять?
new и delete по своей сути внутри себя работают через malloc и free. malloc при выделении памяти реально выделает немного больше и дополнительно записывает информацию о количестве выделенной памяти. free этим пользуется
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
27.08.2009, 11:16
Evg,
Чем же такой вариант более безопасен, чем вариант с sizeof?

а вот чем:

int* arr = new int[10]();
const size_t N1 = sizeof(arr) / sizeof(arr[0]);
const size_t N2 = sizeof(array_size(arr));

второе - не скомпилируется.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
27.08.2009, 11:17
Чорт, об этом не подумал
Хотя тут скорее из разряда кривые руки, но безопаснее - факт
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.08.2009, 11:17

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

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

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

Возвращение многомерного массива из функции
Как вернуть многомерный массив из функции для обычного массива c использованием указателей это выглядит так void function(int*); //...

Возвращение массива из функции-шаблона
Есть массив int iArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; есть шаблон функция template&lt; typename T &gt; T * MySwap(const...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть не большие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru