| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Динамическая память |
| Автор: KIDD 18.5.2004, 06:50 |
| Товарищи, помогите! Как выделить динамически двумерный массив у которого я знаю количество столбцов, а количество строк в процессе может быть любым, либо как можно реализовать иначе такой массив. ** ** ** ** ** ** ... ... И еще похожий вопрос: Как выделить динамически двумерный массив, у которого в процессе работы может вырьироваться количество столбцов, а количество строк также не предсказуемо. **... ****... **... ****... **... ... Заранее спасибо |
| Автор: chipset 18.5.2004, 07:04 |
| массив обьектов типа vertex Добавлено @ 07:04 тьфу! массив обьектов типа vector |
| Автор: dargaard 18.5.2004, 07:06 | ||
В C
СУВ. |
| Автор: chipset 18.5.2004, 07:10 |
| второй вопрос, засунуть в качестве темплейта vector'y "vector". а у каждого "строчного" vector'a пусть будет обьекты X сейчас dargaard ответит без использования С++ и вопрос будет полностью решен |
| Автор: dargaard 18.5.2004, 07:11 |
| chipset злой ты |
| Автор: chipset 18.5.2004, 07:15 |
| нет я очень добрый, просто немного усталый... голова кипит, видишь векторы с вертексами путаю... |
| Автор: AndyY 18.5.2004, 09:06 |
| для случая неопределенного кол-ва строк - согласен, хорошо будет список указателей. Для варианта, когда нет данных о столбцах и о строках, (тем более когда их число может изменятся во время работы программы): сложить все данные в map (самобалансирующеесе дерево, ключ - координаты). Если данных много, а накладные расходы байт по 8 на элемент высоки, то в map сложить небольшие куски (скажем, по 10*10 элементов) Но все это имеет смысл только при достаточно больших массивах данных. |
| Автор: gepard 18.5.2004, 09:21 |
| Зайти в FAQ по С++, там есть вопрос про динам. массивы. |
| Автор: mr.DUDA 18.5.2004, 10:05 | ||
Можно и без векторов обойтись, если хранить размер массива на 4 байта раньше его начала. В Delphi есть очень удобные функции для работы с массивами (GetMem, FreeMem, Copy и пр.), и именно так они и реализованы. Вот переделанный вариант под С++, и пример -- как можно выделить и работать с массивом, в котором не известно ни количество строк, ни размер каждой отдельной строки:
|
| Автор: Neo 20.5.2004, 00:55 | ||
Вот нам как раз на лекции такой пример давали, когда сведения о количестве строк и столбцов удобно хранить в нескольких байтах перед началом массива. Крайне удобно. Может кому понадобится такой исходник....
Собственно отличия от исходника mr.DUDA никакого. Формально, как я понимаю. Разве что пара функций, которые определяют длину строки или столбца.... |
| Автор: mr.DUDA 20.5.2004, 10:23 | ||
...и привязка к типу данных double (а у меня все функции - шаблоны, можно хранить в массивах произв. данные) |
| Автор: KIDD 20.5.2004, 15:07 |
| А я похоже более легкий выход нашел, халявный правда, но выход : В Visual есть такой класс CArray ( и его производные - CObArray,CIntArray...), создав объект которого, можно в него загонять свои данные, причем цивильно, с помощью специальных функций. Спасибо за ответы, всем!!! |
| Автор: mr.DUDA 20.5.2004, 16:08 | ||
Лёгкий путь не всегда самый верный. Насчёт CArray: я ещё год назад считал MFC'шные контейнеры удобными и самыми лучшими http://forum.vingrad.ru/index.php?showtopic=16860 |
| Автор: KIDD 20.5.2004, 16:28 | ||||||
| mr. DUDA! Меня интересует, можно ли в vector запихать свой объект.
А чем плохи СArray и кампания? У меня ксати возникли с ними проблемы: Вроде все правильно делаю
А Выдает ошибку:
???????? |
| Автор: mr.DUDA 20.5.2004, 16:36 |
| KIDD, отвечаю по порядку: 1) запихать в вектор свой объект можно, подробности - в статье в FAQ 2) CArray и компания плохи тем, что: а) тормознутые по сравнению с STL, б) привязаны к MFC, в) неудобные в использовании (один только POSITION чего стоит г) кроме CList, CArray и CMap в MFC больше ничего нету ! д) мелкософт сама отказалась от своих контейнеров (как и от MFC в целом) и стала продвигать собственные "расширения" STL - класс hash_map, например е) в Инете можно найти кучу разных вариантов STL (с одним синтаксисом, но разной реализацией), и некоторые из них внутри себя супер-навёрнутые и быстродействующие - например, STLPort 3) чтобы твой пример с CArray скомпилился, нужно добавить в класс CMyPoint реализацию конструктора копирования либо оператора "=". А если пользоваться vector, то таких проблем нету ! Кстати, конструктор копирования в MFC-шных контейнерах - эта проблема когда-то возникла и у меня, и необходимость "руками" прописывать присвоения всех по порядку полей одного объекта полям другого - просто бесила... |
| Автор: KIDD 20.5.2004, 16:46 | ||||
Не знаю, что я накосячил, но ща применил vector:
Выдает ошибку
Че ему не нравится; Класс (CMyPoint::CObject) наипростейший,урезал его полностью, оставив два пустых констр-деструктора и переменную CPoint point. |
| Автор: Sined 20.5.2004, 16:54 | ||
Сорри, но тв пишешь
В силу опять таки своей ограниченности я не вижу у тебя СMyPoint с именем point. Cкорее всего, он Не принадлежит к классу CMyPoint и для не НЕ определен copy_constructor может в CMyPoint надо вставить CMyPoint& operator=(CPoint&); с следущим синтаксисом CMyPoint& СMyPoint::operator=(CPoint& p) { point=p; return *this; } |
| Автор: DENNN 20.5.2004, 16:55 | ||||
to mr.DUDA
А зделать нечто вроде такого не судьба?
|
| Автор: Sined 20.5.2004, 17:12 |
| Если мне не изменяет память this все-таки указатель, т.е. 4 байтовое число.и sizeof(this) должно вернуть 4, хотя это личное мнение кролика. |
| Автор: KIDD 20.5.2004, 17:23 | ||||
| Sined! По фиг как писать -
либо
|
| Автор: DENNN 20.5.2004, 18:46 | ||||
Сорри, но можно написать и так:
|
| Автор: Sined 20.5.2004, 19:10 | ||
Это вопрос или утверждение? Если утверждение, то тогда приводи весь текст, где написано, что point--переменна класса CMyPoint; Если вопрос, то, видимо, не пофиг, если компилер ругается. |
| Автор: mr.DUDA 20.5.2004, 19:35 | ||||
отвечаю KIDD'у и DENNN'у:
конструктор копирования необходим для классов, имеющих в своём составе поля, которые нельзя присвоить оператором "=". Компилятор сам сгенерирует конструктор копирования для класса CMyPoint, если все поля входящие в класс CMyPoint, можно присвоить оператором "=". Иначе (как и получилось у KIDD'а из-за переменной CPoint), требуется написать свой собственный конструктор копирования, в котором реализовать все сложные и не очень сложные процедуры присваивания полей одного объекта (p) другому (this)
не судьба для сложных объектов (имеющих в составе указатели и ссылки) |
| Автор: KIDD 20.5.2004, 22:29 | ||
Ok,извиняюсь, я погорячился, Sined!
Выдает ошибку error C2558: class 'CMyPoint' : no copy constructor available or copy constructor is declared 'explicit' Что неправильно???? |
| Автор: Sined 21.5.2004, 11:32 |
| Вроде бы mr.DUDA ответил, что для сложных классов(CPoint )может тоже входит. Надо явно определять к.конструктор. Хотя по стандарту вроде бы любой класс поддерживает побитовое копирование и твой пример должен сработать. Если нет, то может сработать следующий пример. CMyPoint::CMyPoint() :point() { } CMyPoint& СMyPoint::operator=(CPoint& p) { point=p; return *this; } т.е. разделить конструктор и присвоение. |