![]() |
|
Модераторы: bsa |
![]()
|
|
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Неправильно - у класса Vector не определен copy конструктор (и оператор присваивания). Без них конструкция Vector<T> buf=*this; из erase сделает совсем не то, что было нужно
Что делает resize совсем не понятно, явно только что не resize вектора |
|||
|
||||
| toxx |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
xvr
Вы имели ввиду вот это?:
А без этого тоже неплохо работало, а в чем разница с этим конструктором копирования и без него? хотя догадываюсь... но наверно не точно. Это сообщение отредактировал(а) toxx - 30.3.2010, 21:23 |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
стандартный конструктор скопирует указатель V и счетчик n. Таким образом, когда вызовется деструктор одного из объектов он освободит ОБЩУЮ память, поэтому, когда вызовется второй деструктор, произойдет попытка повторного освобождения, что приведет к краху программы. |
|||
|
||||
| toxx |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
И всеже никак не пойму у меня функция удаления
Есть метод у вектора удаления произвольного элемента массива
Опятьже я ищу уровень где нечетное число листьев
Потом номер этого элемента
потом удаляю когда рекурсия дошла до уровня нужного
Но у меня не всегда получается то что нужно, в чем проблема я никак не понимаю) уже и свой класс вот написал для удаления из массива(походу кривоват слегка)Всёравно никак, может быть подскажете где ошибка, как xvr говорил я сделал, но это не решение задачи, как я понял. Это сообщение отредактировал(а) toxx - 31.3.2010, 09:53 |
||||||||||
|
|||||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| toxx |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
Вот такая постановка задачи, я уже писал в последнем посте 1й страницы, только там я еще с вектором разбирался своим, щас вот исправил. |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
В таком случае это делается так (делаю на vector<>, на массив переделайте сами, если надо)
|
|||
|
||||
| toxx |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
Интересно,но это работает!Полунедельная проблема решена!Спасибо это делает то чего не делает моя процедура. В связи с этим кодом родились вопросы: 1.Почему вы используете size_t? вместо int(в дефайне unsigned int) 2.Как работает resize у vector'a, хочу попробовать хотябы чтонить близкое сделать. 3.В чем недостатки моего erase? потомучто если тоже самое запускать, но вместо вектора использовать мой вектор ошибки памяти... erase:
resize
Это сообщение отредактировал(а) toxx - 31.3.2010, 17:47 |
||||||||
|
|||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
size_t специально предназначен для хранения размеров областей памяти. Так же как и ptrdiff_t предназначен для хранения смещений указателей. Если интересно, поищи в интернете, чем это обусловлено и какая выгода.
Кстати, size_t на 32-х битных машинах обычно uint32_t, а на 64-х битных - uint64_t. Как ты думаешь, почему? |
|||
|
||||
| toxx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
Думаю из-за разрядности системы, как я понимаю в 32-битных и 64-битных системах один и тот же тип занимает разное количество памяти в битах.верно?щас ищу про size_t и ptrdiff_t... |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
На некоторых DSP процессорах char 2х байтовый |
|||
|
||||
| toxx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
Судя по статье есть смысл использовать
size_t и ptrdiff_t если ты переносишь приложения на 64х битные системы, а так написано, что на моей 32х битной ничего не будет заметно... Это сообщение отредактировал(а) toxx - 1.4.2010, 15:15 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Мой отец в таких случаях всегда говорит: "Делай хорошо, плохо само получится". Не известно, каким местом жизнь потом повернется.
|
|||
|
||||
| toxx |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 653 Регистрация: 4.3.2009 Где: НН Репутация: 4 Всего: 13 |
Проверил функцию вашу функцию xvr
Сначала у меня сложилась видимость что всё верно делает, потом сегодня я сел опять проверять, но только уже на других данных(увеличил количество уровней дерева до 3х, до этого проверял на одном уровне, и увидел что если на 1м уровне 3 поддерева на втором у каждого дерева еще по 3 поддерева и на третьем уровне еще под 1 поддереву у каждого) и понял что функция вызывается смотрит что у второго уровня 3 поддерева и удаляет весь первый уровень не смотря на то, что есть еще 3й уровень. Опять добавил рекурсию... менял условия, но опять ничего не выходит. Функция remove_odd() написанная вами и рисунок дерева которое я вводил мой erase()
И как я ей пользуюсь:
До этого я просто в main() написал root->remove(); и понял, что это ошибка только сегодня(тестируя, всегда на 1 уровне дерева)
Вроде бы уже всё что нужно есть, а не удаляется если уровней больше одного...прошу еще раз посмотреть. Это сообщение отредактировал(а) toxx - 2.4.2010, 16:27 |
||||||||
|
|||||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |