11 / 11 / 2
Регистрация: 16.08.2009
Сообщений: 434
1

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

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

Author24 — интернет-сервис помощи студентам
Нужно вернуть массив типа 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2009, 09:20
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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

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


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

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

int *a = malloc (...);

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

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

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

Не по теме:

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

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

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

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

а всякие "штучки" оставьте на потом, этих штучек - пруд пруди, и никто не знает все. чем меньше вы их будете применять без меры, тем лучше будет ваша жизнь.
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
27.08.2009, 00:33 28
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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
27.08.2009, 08:45 29
Цитата Сообщение от Rififi Посмотреть сообщение
выглядит страшновато, ну а кому щас легко? :green:
А главное - нафига вот так всё сложно. Сделать макрос через sizoef'ы и не париться. Хотя я понимаю, что использование макросов для многих считается непацанским стилем и вообще несовместимым с концепцией Си++. Но у меня нет практики работы с Си++, а когда что-то пытался сделать - миллион раз казалось плюнуть на эту концепцию и сделать по простому
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 10:36 30
Цитата Сообщение от 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
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
27.08.2009, 10:39 31
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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
27.08.2009, 10:58 32
Цитата Сообщение от Rififi Посмотреть сообщение
esli by vse polzovalis' normalnymi kompilyatorami a ne kakimi-to krivul'kami, bylo by esche kruche.
По-моему твой вариант не должен зависеть от компилятора, т.к. там всё по стандарту Си++ (наверное). Т.е. причиной могут быть только кривые руки
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
27.08.2009, 11:02 33
Evg,
А главное - нафига вот так всё сложно. Сделать макрос через sizoef'ы и не париться.
Это только для тех, кто предпочитает создавать более безопасный код. для каких-нибудь пользователей продукции Борланд (aka формошлёпщиков) можно действительно не париться
0
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
27.08.2009, 11:07 34
Если нельзя опеределить размер динамического массива, то как же delete [] узнает сколько элементов удалять?
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
27.08.2009, 11:10 35
HIMen,
потому что оно использует свои внутренние механизны, относящиеся к контретной реализации конкретного менеджнра памяти, недоступные обычному пользователю.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
27.08.2009, 11:11 36
Цитата Сообщение от Rififi Посмотреть сообщение
Это только для тех, кто предпочитает создавать более безопасный код. для каких-нибудь пользователей продукции Борланд (aka формошлёпщиков) можно действительно не париться
Чем же такой вариант более безопасен, чем вариант с sizeof?

Добавлено через 1 минуту
Цитата Сообщение от HIMen Посмотреть сообщение
Если нельзя опеределить размер динамического массива, то как же delete [] узнает сколько элементов удалять?
new и delete по своей сути внутри себя работают через malloc и free. malloc при выделении памяти реально выделает немного больше и дополнительно записывает информацию о количестве выделенной памяти. free этим пользуется
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
27.08.2009, 11:16 37
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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
27.08.2009, 11:17 38
Чорт, об этом не подумал
Хотя тут скорее из разряда кривые руки, но безопаснее - факт
0
27.08.2009, 11:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2009, 11:17
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru