Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2012, 06:25   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Крот Посмотреть сообщение
Попробуй вот так. С++ не может весь массив целиком возвратить а только его адрес в памяти.
Ты не прав. Все он может.

Код:
    //Создаем массив, и возвращаем его по ссылке
    template<class T, size_t N>
    T (&Create(  T (&arr)[N] )   )[N]
    {
        T tmp[N]; for(size_t i=0;i<N;++i ) { tmp[i]= arr[i]; }
        return tmp; 
    }
По аналогии, можно вернуть указатель, или массив по значению.

/ps Использование голых указателей для передачи данных - небезопасный способ работы. Можно запросто поймать вылет связанный с выходом за пределы диапазона. А потом несколько часов искать причину вылетов.

Намного лучше для таких целей использовать либо ссылки на массивы, либо обертки над массивами, которые осуществляют все необходимые проверки для дебаг-версии приложения.
_Bers вне форума Ответить с цитированием
Старый 01.04.2012, 09:43   #12
Крот
Пользователь
 
Регистрация: 15.03.2012
Сообщений: 57
По умолчанию

_Bers. Имя массива - это адрес его первого элемента.
Цитата из одной книги: "Теперь предположим, что вы хотите создать функцию, которая возвращает строку. Правда, функция это сделать неспособна, зато (что даже лучше) она может возвратить адрес строки."
А любая строка - это и есть массив.

Последний раз редактировалось Крот; 01.04.2012 в 09:48.
Крот вне форума Ответить с цитированием
Старый 01.04.2012, 10:15   #13
Artem_Kokos
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 122
Радость

Ну ладно, так по карйней мере работает все. Спасибо г-н Крот за помощь =)
Повторенье - мать ученья. И прибежище для лентяев.
Artem_Kokos вне форума Ответить с цитированием
Старый 01.04.2012, 10:18   #14
Крот
Пользователь
 
Регистрация: 15.03.2012
Сообщений: 57
По умолчанию

Да не за что. Рад что помог
Спасибо за интересную задачку.
Крот вне форума Ответить с цитированием
Старый 01.04.2012, 11:29   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Крот Посмотреть сообщение
_Bers. Имя массива - это адрес его первого элемента.
Цитата из одной книги: "Теперь предположим, что вы хотите создать функцию, которая возвращает строку. Правда, функция это сделать неспособна, зато (что даже лучше) она может возвратить адрес строки."
А любая строка - это и есть массив.
1. Автор твоей книги не прав. Выше я привел тебе пример реального рабочего кода. Который иллюстрирует как можно принимать на входе ссылку на массив (а не указатель), и возвращать на выходе ссылку на массив (а не указатель).

2. Ты не прав. На языке с++ имя массива и указатель - это два принципиально различных типа данных.

http://www.programmersforum.ru/showp...6&postcount=34

3. (На всякий случай тебе на заметку) На с++ не существует никаких строк, и не существует никаких динамических массивов.
_Bers вне форума Ответить с цитированием
Старый 01.04.2012, 14:00   #16
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_Bers
Код:
 template<class T, size_t N>
 T (&Create(  T (&arr)[N] )   )[N]
 {
     T tmp[N]; for(size_t i=0;i<N;++i ) { tmp[i]= arr[i]; }
     return tmp; 
 }
бред. возвращаешь ссылку на автоматически выделенную память. не знаешь языка - хотя бы компилятором нормальным пользуйся, которые отловит для тебя такие ошибки
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 01.04.2012, 14:09   #17
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2_Bers
Код:
 template<class T, size_t N>
 T (&Create(  T (&arr)[N] )   )[N]
 {
     T tmp[N]; for(size_t i=0;i<N;++i ) { tmp[i]= arr[i]; }
     return tmp; 
 }
бред. возвращаешь ссылку на автоматически выделенную память.
1. Это пример-иллюстрация того, как пишется синтаксис функций, возвращающих ссылки на массивы.

2. http://www.programmersforum.ru/showp...94&postcount=9

3.
Цитата:
Сообщение от pproger Посмотреть сообщение
не знаешь языка - хотя бы компилятором нормальным пользуйся, которые отловит для тебя такие ошибки
Если ты не знаешь, для чего это использовалось, это не означает, что я не знаю языка. Это означает, что ты не знаешь всех подробностей.
И весьма голословен.

Последний раз редактировалось _Bers; 01.04.2012 в 14:11.
_Bers вне форума Ответить с цитированием
Старый 01.04.2012, 14:15   #18
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

1_Bers
Цитата:
1. Это пример-иллюстрация того, как пишется синтаксис функций, возвращающих ссылки на массивы.
это пример-иллюстрация того, как человек, не знающий языка учит других. массив уничтожится при выходе из функции, и ты получишь ссылку в никуда.

Цитата:
По стандарту, пока жива константная ссылка на временный объект, этот объект будет жив.
тут нет ни константных ссылок, ни временных объектов (временные объекты в том посте не имеют ничего общего с автоматическими переменными в этом)


Цитата:
Если ты не знаешь, для чего это использовалось, это не означает, что я не знаю языка. Это означает, что ты не знаешь всех подробностей.
И весьма голословен.
хорошо. приведи пример использования своего кода. http://ideone.com/ тут, к примеру. который будет копировать массив, возвращать ссылку и напечатает полученный массив. иначе посчитаю твои посты троллингом
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 01.04.2012 в 14:21.
pproger вне форума Ответить с цитированием
Старый 01.04.2012, 14:25   #19
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
1_Bers
это пример-иллюстрация того, как человек, не знающий языка учит других. массив уничтожится при выходе из функции, и ты получишь ссылку в никуда.
Ты не можешь делать таких предположений, только потому, что в иллюстрации отсутствует вызывающая сторона.

Это все равно что сказать, что в ниже представленном коде присутствует утечка памяти:

Код:
int * ptr = new int[10];
1. По твоему, здесь присутствует утечка памяти, только потому, что не был описан явный delete? Может быть ты найдёшь представленный код некорректным, потому что нигде не указана точка входа в программу, и все такое? А может быть тебе тупо докалебаццо захотелось, м?

2. Делать выводы на основе одних лишь предположений, не имея в голове представления обо всей картинке является логически некорректным.

Цитата:
Сообщение от pproger Посмотреть сообщение
тут нет ни константных ссылок, ни временных объектов (временные объекты в том посте не имеют ничего общего с автоматическими переменными в этом)
А они имеют общее - и тут, и там использовалась одна и та же функция.
Просто в данном случае, вызывающая сторона не указана.
_Bers вне форума Ответить с цитированием
Старый 01.04.2012, 14:27   #20
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_Bers
Цитата:
Ты не можешь делать таких предположений, только потому, что в иллюстрации отсутствует вызывающая сторона.
вызывающая сторона в твоем коде никакой роли на валидность кода не играет
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объявить массив через функцию. (С++) Alendorff Помощь студентам 11 20.02.2012 18:22
Передача указателей на массив в функцию. nibir Общие вопросы C/C++ 14 06.07.2011 13:24
Как передать Динамический массив в функцию? RainCat Помощь студентам 4 13.04.2011 11:25
Массив используя функцию и процедуру. Profan4ik Помощь студентам 1 30.05.2010 14:06
Передача указателя на массив в функцию loser Общие вопросы C/C++ 2 19.02.2010 19:41