![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Как вернуть массив из функции?
Только поподробнее плиз. Для примера предлагаю рассмотреть массив char massiv[12][12]; |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
В твоем случае, необходимо создать другой массив, выделить память на куче (malloc или HeapAlloc), скопировать туда массив и передать ссылку на него, ибо временные обьекты уничтожаются после завершения функции.. --------------------
|
||||
|
|||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
так сложно? |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Да, тогда всё ок Это сообщение отредактировал(а) chipset - 13.1.2005, 03:29 --------------------
|
||||
|
|||||
| sergejzr |
|
||||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
А! массив из функции. Я понял массив из функций
Ну указатель верни
Еще можно сделать массив глобальным так:
|
||||
|
|||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
ИМХО, удалится после выхода из функции.. --------------------
|
||||
|
|||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Ага, щас!
С чего бы? Мы вызвали new, а где delete? более тог, если после вызова функции мы не удалим массив, будет leak. |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Меня наверное глючит, но обьекты созданные на стеке удаляются при выходе из функции.. --------------------
|
||||
|
|||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
chipset,Так ведь на стеке только указатель - число=адрес массива в памяти.
Сам массив пришёл из new. |
|||
|
||||
| Adil' |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 26.8.2004 Где: Питер Репутация: 6 Всего: 15 |
Добавлено @ 13:36 Иногда передают в функцию адрес указателя, т.е. указатель на указатель:
-------------------- Удачи |
||||
|
|||||
| Peter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 771 Регистрация: 28.7.2003 Где: Ставрополь Репутация: -1 Всего: 1 |
Я сначала подумал так же, как chipset. Действительно, delete же отсутствует. А чтобы каждый раз после вызова функции не создавался массив, нужно указатель пометить как static. Тогда он будет инициализироваться один раз. Соответственно new будет вызвано 1 раз. -------------------- всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23). |
|||
|
||||
| Doc_d0s |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 15.12.2004 Где: в кресле Репутация: 2 Всего: 3 |
Сделай массив статическим тогда он не сотрется в памяти после завершения работы ф-ии и верни указатель на него
--------------------
Админ- это вождь Apache'й :) |
|||
|
||||
| sergejzr |
|
||||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Вай, вай! Не хотел я такой пример давать
Ну раз уж слово сказано... Этот код будет красивше через ссылку.
|
||||
|
|||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Плохим тоном вообще считается выделение памяти в одном месте а удаление в другом. Если функция только выделяет память, то очень велик шанс, что эта память так и останется не удаленной. Если так делать, то лучше использовать умные указатели. -------------------- Волны гасят ветер... |
|||
|
||||
| Adil' |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 26.8.2004 Где: Питер Репутация: 6 Всего: 15 |
Ну да, а в M$ одни недоумки сидят - они ведь почему-то часто так делают
-------------------- Удачи |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Я разве сказал, что это глупо? Использовалось словосочетание "Плохой тон". Перечитайте пожалуйста мой пост ещё раз. Дабы прервать бесполезные споры, должен добавить ещё один и на мой взгляд более элегантный подход. Так как юзаем ООП, то работаем, грубо говоря, с классом - оболочкой, у которого переложен оператор = и деструктор. Возвращаем из функции обьект. никакого неопределения, кто где выделил память и когда деструктировать. Аргументы делаем const. Надеюсь это всех устроит. |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
В общем-то это и есть smart pointer о котором я говорил. -------------------- Волны гасят ветер... |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Так. Ну раз тут речь зашла уже и о передаче массива в функцию, то моя логика такая:
Почему не работает? |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
имя массива является указателем на массив, поэтому:
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Doc_d0s |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 206 Регистрация: 15.12.2004 Где: в кресле Репутация: 2 Всего: 3 |
Сделай массив статическим тода он не удалиться после завершения работы ф-ии
и верни указатель на него. --------------------
Админ- это вождь Apache'й :) |
|||
|
||||
| Dov |
|
||||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
Железная логика, только чуток подправить нужно.
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
||||
|
|||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Нет, умные как раз не подойдут - они только заворачивают объект в "красивую упаковку". В этом случае надо использовать ведущие указатели, чтобы гарантировать взаимооднозначное соотвествие. To Fantasist: а где ты прочитал про умные указатели? |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |