![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
подскажите пожалуйста как лучше организовать работу с трехмерными массивами
с С++ я только начала работать, еще многого не знаю надо написать программу, обрабатывающую информацию о трехмерных объемах т.е. надо будет в трехмерных, двумерных и одномерных массивах сохранять данные и постоянно с ними оперировать вопросы такие - стоит ли создавать классы для массивов и операторы в них для более удобной обработки, напр. оператор присваивания массива и т.д. и классы Array3, Array2, Array - как декларировать указатель на трехмерный массив и инициализировать сам массив - как удалять многомерные массивы? так же, как и одномерные? delete [] p.. - если трехмерные массивы могут иметь две размерности, а операции с ними одни и те же, как лучше с ними работать? Это сообщение отредактировал(а) ElKa - 12.9.2010, 18:26 |
|||
|
||||
vnf |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 9.2.2008 Репутация: 1 Всего: 1 |
Стоит, очень стоит
Как указатель на объект класса массива CMySuperArray * superarray = new CMySuperArray(5,5,8);
delete superarray
можно трактавать двухмерный массив как частный случай трёхмерного у которого одна из размерностей 1 можно трактавать одномерный массив как частный случай трёхмерного у которого две из размерностей 1 т.е. достаточного одного класса трехмерного массива реализовать такой класс можно попробовать с помощью vector |
||||||||
|
|||||||||
ElKa |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
vnf,
спасибо! что-то я не разберусь с этими массивами мне нужен класс для массивов, в котором можно будет размерность устанавливать я написала темплейт и почему-то ошибки посмотрите пожалуйста array.h
array.cxx
вот здесь ошибка Array &Array<T,s1,s2,s3>::operator=(Array &right) говорит expected constructor, destructor, or type conversion before '&' token и еще вопрос как мне декларировать и создавать объекты этого класса в других классах? Array [][][] arr; int arr[2][3][5]; |
||||
|
|||||
vnf |
|
||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 9.2.2008 Репутация: 1 Всего: 1 |
должно быть
то что в угловых скобках является неотемлимой часть имени класса соответственно при использовании класса
Вопрос: у вас везде будут испоьлзоваться массивы одинаковой размерности? Если нет, то размерности лs1 s2 s3 лучше не включать в праметры шаблона, а сделать аргументами конструктора
использование
ещё вашему классу нехватает деструктора, в котором нужно будет освобождать память delete [] a_ Это сообщение отредактировал(а) vnf - 20.9.2010, 07:29 |
||||||||||
|
|||||||||||
ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
vnf,
спасибо, сейчас все внедрю и посмотрю, что будет |
|||
|
||||
Master01 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 22.8.2007 Репутация: 2 Всего: 2 |
Если это не учебный проект, цель которого именно в том, чтобы "научится создавать собственные трёхмерные массивы", а вам просто нужен в вашей программе трёхмерный массив, то можете воспользоваться готовой реализацией - boost::multi_array
вот пример из хелпа
Добавлено через 5 минут и 19 секунд однако ничего так код для человека, который "с С++ я только начала работать, еще многого не знаю" ![]() |
|||
|
||||
ElKa |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
Master01,
спасибо, этот вариант тоже попробую.. а проект не учебный, а очень сурьезный опять ошибка у меня.. посмотрите пожалуйста пока код выглядит так array.h
array.cxx
ошибка здесь Array<T>::Array(int s1, int s2, int s3): a_(new T[s1][s2][s3]), _size1(s1), _size2(s2), _size3(s3){} говорит - `s2' cannot appear in a constant- expression - `s3' cannot appear in a constant- expression |
||||
|
|||||
vnf |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 9.2.2008 Репутация: 1 Всего: 1 |
на
здесь
нужно принициализировать i,j,k, иначе на дебажной будет работать а в релизе ошибки посыплются (int i = 0 и т.д.) в setValue и getValue нужен контроль на выход за границы массива Это сообщение отредактировал(а) vnf - 21.9.2010, 22:09 |
||||||
|
|||||||
RedDigger |
|
||||||
![]() Программист Профиль Группа: Участник Сообщений: 26 Регистрация: 24.9.2010 Где: Москва Репутация: 1 Всего: 1 |
Прошу прощения что влезаю в данный топик но не легче ли будет использовать обычные динамические массивы..
Создать класс для обработки 3х мерных массивов довольно просто. инициализировать подобные элементы также труда составить не должно. Вот рабочая программка только что наваянная: main.cpp
myarray.h
myarray.cpp
Под линуксом работает нормально.. винды нет для проверки но теоретически работать должна и там.. Возможно изза разных компиляторов может чтото ругаться при сборке но все должно правиться без особого труда.. Надеюсь информация поможет. |
||||||
|
|||||||
ValeryLaptev |
|
|||
Препод Профиль Группа: Участник Сообщений: 41 Регистрация: 19.8.2010 Где: Астрахань Репутация: нет Всего: 1 |
Если проект серьезный, как утверждает Elka, то лучше не писать велосипед, а использовать вектор векторов векторов. Из стандартной библиотеки.
|
|||
|
||||
RedDigger |
|
|||
![]() Программист Профиль Группа: Участник Сообщений: 26 Регистрация: 24.9.2010 Где: Москва Репутация: 1 Всего: 1 |
Но при этом не учитывается что вектор занимает в памяти намного больше места нежели обычный массив. А если данных будет очень много??? результатом будет разница в скорости работы.... Холивар поднимать не хочу.. мое дело предложить. |
|||
|
||||
ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
RedDigger,
спасибо, попробую и так ValeryLaptev, мне нужны именно массивы, потому что слишком много данных |
|||
|
||||
vnf |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 9.2.2008 Репутация: 1 Всего: 1 |
ElKa
Вопрос: на сколько больше памяти занимает vector по сравнению с массивом? |
|||
|
||||
RedDigger |
|
|||
![]() Программист Профиль Группа: Участник Сообщений: 26 Регистрация: 24.9.2010 Где: Москва Репутация: 1 Всего: 1 |
Вектор - это структурный объект.. У него есть несколько больше возможностей и параметров которые возомжно не нужны в примере.. возможно следует только создать массив, удалить его при выходе и иметь возможность положить туда чтолибо или вытащить с него...
Для огромного объема данных приходится иногда изобретать велосипед.. иногда и 28.4 колесный... лично мне не привыкать ![]() |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
RedDigger |
|
||||||||||||
![]() Программист Профиль Группа: Участник Сообщений: 26 Регистрация: 24.9.2010 Где: Москва Репутация: 1 Всего: 1 |
Программа номер раз
вывод -
программа номер два..
вывод -
|
||||||||||||
|
|||||||||||||
Master01 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 22.8.2007 Репутация: 2 Всего: 2 |
Вы не совсем правильно понимаете эти результаты. Контейнер будет занимать всегда на N байт больше и это не зависит от количества элементов. Например, если память мне не изменяет, std::vector даже пустой (не содержащий полезных данных) занимает где-то 20 байт. т.о. если говорить, к примеру, о массиве int из 1024 элементов, требующих для хранения (предполагаем что int = 4 байта) 4 Кб, то эти 20 байт уже не кажутся таким кащунственным разбазареванием ресурсов. А лепить что-то своё, ради выйгрыша в 20 байт весьма сомнительно ... а вот политика выделения памяти, которой следует тот или иной контейнер - это действительно то, на что слежует обратить внимание, если нужно что-то оптимизировать. |
|||
|
||||
RedDigger |
|
|||
![]() Программист Профиль Группа: Участник Сообщений: 26 Регистрация: 24.9.2010 Где: Москва Репутация: 1 Всего: 1 |
Не учел... Спасибо за разъеснение.
|
|||
|
||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Тут вроде-бы в помощь shared_ptr, но для того что-бы достучаться до элемента, придётся делать как-то так:
Лично мне такой вариант не очень... Это сообщение отредактировал(а) Леопольд - 30.9.2010, 16:43 -------------------- вопросов больше чем ответов |
||||
|
|||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Что-то я не понял, почему трижды. При глубоком копировании вектора векторов векторов векторов ... любой степени вложенности всё копируется единожды. По крайней мере, если вектор == std::vector. Но так должно быть и у любого другого вменяемого вектора. |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Я говорил про swap, который повсеместно используется в STL. Он создаёт временную копию.
Это сообщение отредактировал(а) Леопольд - 2.10.2010, 10:13 -------------------- вопросов больше чем ответов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
ElKa |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
RedDigger,
а как передавать такие массивы объектам других классов? мне нужно создавать объекты, которые содержат по два трехмерных массива в общем конструктор должен быть такой
и операторы наверное же тоже нужны myarray.h
myarray.cxx
Это сообщение отредактировал(а) ElKa - 2.10.2010, 17:58 |
||||||
|
|||||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
RedDigger |
|
||||||||
![]() Программист Профиль Группа: Участник Сообщений: 26 Регистрация: 24.9.2010 Где: Москва Репутация: 1 Всего: 1 |
Лучше всего передовать их по ссылке. В данном случае стек вызовов не переполняется лишними объектами. А внутри класса куда тебе надо завести данные создаешь член класса типа MyArray * (допустим)_b. Но с операторами ты немного намудрила. впринципе могу помочь.. Мои координаты - Skype: sl.spell Mail: pn.spell{at}gmail.com |
||||||||
|
|||||||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Это сообщение отредактировал(а) Леопольд - 3.10.2010, 17:01 -------------------- вопросов больше чем ответов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
![]()
Это сообщение отредактировал(а) mes - 3.10.2010, 17:34 |
|||
|
||||
ElKa |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
посмотрите пожалуйста код
почему то не те элементы вызываются и зависает ехе массивы 3мерные и что-то я с этими указателями запуталась и еще меня смущает operator [](int i), я его оставила таким же как для одномерных массивов, это правильно? array.h
array.cxx
|
||||
|
|||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
ElKa, c двумерными массивами код уже сложно читать, а с тремя измерениями становится совсем тяжко, что чревато багами.
Индексы лучше переименовать в column, row, dept (или x, y ,z) во всём коде. Если производительность не критична, то можно попробовать уйти от трехмерных массивов. Например, использовать что-то типа std::map<Point3d, float>. IMHO логика в Array::setValue извращённая, если выход за границы, возвращает true, если всё ОК, возвращает false. Макроса assert в релизе обычно нет (#define NDEBUG). Проверять им что недостаточно памяти не стоит. Использовать malloc a потом delete[], это, по моему уже UB(undefined behaviour). Вместо malloc надо использовать new[]; Вызывает подозрение что на три выделения памяти делается два delete (а не три). Если есть возможность то лучше использовать исключения (или assert, если позволяет специфика приложения) в Array::getValue и Array::setValue. Исключения более универсальны, assert не обработаешь, но зато нет накладных расходов. В Array::operator= утечка памяти. Вместо трёх delete, всего один. И вообще, возникает ощущение что код писали как в мульте "Простоквашино" писали письмо. Строчку ты, строчку твой кот, а всё остальное Шарик... ![]()
Возникает ощущение что ты сама его не смотрела. Видимо практикуешь "слепой" десятипальцевый набор с завязанными глазами.. ![]() P.S. А может это просто стёб? Бывает и такое. Весьма похоже, надо сказать. Это сообщение отредактировал(а) Леопольд - 6.10.2010, 10:25 -------------------- вопросов больше чем ответов |
||||
|
|||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Если оно надо, то можно допилить.
LWS Это сообщение отредактировал(а) Леопольд - 31.10.2010, 13:30 -------------------- вопросов больше чем ответов |
||||
|
|||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
"допилил"...
Это сообщение отредактировал(а) Леопольд - 8.10.2010, 00:00 -------------------- вопросов больше чем ответов |
|||
|
||||
ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
ну в общем так и есть, если просмотреть комменты выше, то это должно быть понятно ![]() за помощь спасибо, сейчас все внедрю и посмотрю, что будет |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |