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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 200, средняя оценка - 4.94
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
#1

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

23.08.2009, 09:20. Просмотров 26582. Ответов 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) Как я понимаю ссылки вообще никак нельзя использовать для возвращения массива из функции ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,465
Записей в блоге: 26
27.08.2009, 00:02     Возвращение массива из функции #21
Цитата Сообщение от Rififi Посмотреть сообщение
А других и не бывает
Бывают вот такие:

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

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

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

Цитата Сообщение от Rififi Посмотреть сообщение
А теперь - другой вариант (и, кстати, правильно работающий для всех типов, а не только для int) (:
Дико подозреваю, что для начинающего нужен простой вариант на Си, а не изыски с шаблонами. ПРавда это был ответ на "других не бывает".
Monte-Cristo
2787 / 1373 / 30
Регистрация: 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, ты видишь что человек только учит С++? Скажи мне? Ты начинал свое обучение с шаблонов функций?
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,465
Записей в блоге: 26
27.08.2009, 00:10     Возвращение массива из функции #23
Rififi, Monte-Cristo, а покажите, как этой хреновиной поьзоваться. А то я в Си++ не особо
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 00:11     Возвращение массива из функции #24
Monte-Cristo,
Rififi, ты видишь что человек только учит С++?
собстна, Evg всё уже сказал - это был ответ на "других не бывает"

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


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

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

int *a = malloc (...);

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

Скажи мне? Ты начинал свое обучение с шаблонов функций?
Неа. С рассматривания картинок. DDD
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,465
Записей в блоге: 26
27.08.2009, 00:14     Возвращение массива из функции #25
Цитата Сообщение от Rififi Посмотреть сообщение
int *a = malloc (...);[/I]
А это и не массив ни разу, а указатель на целое
Согласен, но такую конструкцию многие называют "динамически выделяемый массив". При этом такой термин имеет право на жизнь хотя бы потому, что разыменовывание указателя можно осуществлять через операции декомпозиции массива (квадратные скобки)
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 00:21     Возвращение массива из функции #26
Цитата Сообщение от Rififi Посмотреть сообщение
это был ответ на "других не бывает"
Не хотел дурить парню голову. Все должно постигаться своевременно и без спешки. Просто сужу по собственному опыту: когда я впервые увидел шаблоны я был в диком удивлении и пытался понять что это за нелепость?

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

Не по теме:

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

novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 00:21     Возвращение массива из функции #27
Цитата Сообщение от nill Посмотреть сообщение
спасибо всем за ответы

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

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

а всякие "штучки" оставьте на потом, этих штучек - пруд пруди, и никто не знает все. чем меньше вы их будете применять без меры, тем лучше будет ваша жизнь.
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
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:
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,465
Записей в блоге: 26
27.08.2009, 08:45     Возвращение массива из функции #29
Цитата Сообщение от Rififi Посмотреть сообщение
выглядит страшновато, ну а кому щас легко? :green:
А главное - нафига вот так всё сложно. Сделать макрос через sizoef'ы и не париться. Хотя я понимаю, что использование макросов для многих считается непацанским стилем и вообще несовместимым с концепцией Си++. Но у меня нет практики работы с Си++, а когда что-то пытался сделать - миллион раз казалось плюнуть на эту концепцию и сделать по простому
novi4ok
550 / 503 / 8
Регистрация: 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
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
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.
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,465
Записей в блоге: 26
27.08.2009, 10:58     Возвращение массива из функции #32
Цитата Сообщение от Rififi Посмотреть сообщение
esli by vse polzovalis' normalnymi kompilyatorami a ne kakimi-to krivul'kami, bylo by esche kruche.
По-моему твой вариант не должен зависеть от компилятора, т.к. там всё по стандарту Си++ (наверное). Т.е. причиной могут быть только кривые руки
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 11:02     Возвращение массива из функции #33
Evg,
А главное - нафига вот так всё сложно. Сделать макрос через sizoef'ы и не париться.
Это только для тех, кто предпочитает создавать более безопасный код. для каких-нибудь пользователей продукции Борланд (aka формошлёпщиков) можно действительно не париться
HIMen
4121 / 1370 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
27.08.2009, 11:07     Возвращение массива из функции #34
Если нельзя опеределить размер динамического массива, то как же delete [] узнает сколько элементов удалять?
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
27.08.2009, 11:10     Возвращение массива из функции #35
HIMen,
потому что оно использует свои внутренние механизны, относящиеся к контретной реализации конкретного менеджнра памяти, недоступные обычному пользователю.
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,465
Записей в блоге: 26
27.08.2009, 11:11     Возвращение массива из функции #36
Цитата Сообщение от Rififi Посмотреть сообщение
Это только для тех, кто предпочитает создавать более безопасный код. для каких-нибудь пользователей продукции Борланд (aka формошлёпщиков) можно действительно не париться
Чем же такой вариант более безопасен, чем вариант с sizeof?

Добавлено через 1 минуту
Цитата Сообщение от HIMen Посмотреть сообщение
Если нельзя опеределить размер динамического массива, то как же delete [] узнает сколько элементов удалять?
new и delete по своей сути внутри себя работают через malloc и free. malloc при выделении памяти реально выделает немного больше и дополнительно записывает информацию о количестве выделенной памяти. free этим пользуется
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
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));

второе - не скомпилируется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2009, 11:17     Возвращение массива из функции
Еще ссылки по теме:

C++ Как реализовать передачу массива в функцию и возвращение массива из функции?
C++ Возвращение из функции массива указателей
Возвращение массива из функции C++
Возвращение массива из функции C++
C++ Возвращение результата функции bool и использование его в функции main()

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,465
Записей в блоге: 26
27.08.2009, 11:17     Возвращение массива из функции #38
Чорт, об этом не подумал
Хотя тут скорее из разряда кривые руки, но безопаснее - факт
Yandex
Объявления
27.08.2009, 11:17     Возвращение массива из функции
Ответ Создать тему
Опции темы

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