![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Rage |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 30.10.2006 Где: Спб Репутация: 1 Всего: 1 |
Здравствуйте коллеги!
Нужна ваша помощь. Пишу класс очередь. Вроде он и простой получился,но программа всё время выдаёт ошибку при выполнении. Знаете,как бывает,сидишь-сидишь, думаешь-думаешь, а потом оказывается ерунда какая-нибудь. Взгляните свежим взглядом, пожалуйста.
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Напишите хотя бы КАКУЮ ошибку выдает
Хотелось бы еще ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ... Например в этом участке
лично мне непонятна строка first=v+(t.first-t.v); Причем я не говорю сразу, что здесь ошибка - просто как-то мудрено мне видится... Это сообщение отредактировал(а) Anikmar - 16.12.2006, 18:00 |
|||
|
||||
| Rage |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 30.10.2006 Где: Спб Репутация: 1 Всего: 1 |
Вводится очередь нормально, выводится тоже, но вот после того, как она вся выведена, вылезает ошибка:
Debug Error! Program..... DAMAGE:after Normal block (#44) at 0x008C1DA0 Исчерпывающе? |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
И уж совсем мне нравится комментарии:
во всем коде есть 4 комментария - они очень информативны, не находите? class turn{ //Очередь int *v,*first; int sz; public: turn(int);//Перегруж конструктор turn(const turn&);//Конструктор копирования ~turn();//Деструктор ... |
|||
|
||||
| Rage |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 30.10.2006 Где: Спб Репутация: 1 Всего: 1 |
first=v+(t.first-t.v) - выражение для вычисления нового адреса указателя first
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Не совсем На какой-нибудь конкретной строчке или после выхода из программы? |
|||
|
||||
| Rage |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 30.10.2006 Где: Спб Репутация: 1 Всего: 1 |
А насчёт комментариев - я их писал для себя.
Добавлено @ 18:06 Если бы я знал на какой сторчке ошибка, я б даже темы не создавал... |
|||
|
||||
| Anikmar |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Если я правильно понял логику, то в конструкторе с параметром int создается объект очереди, с заданным максимально возможным количеством элементов.
Под них создается массив, который в деструкторе удаляется. Несколько вопросов: 1. Нигде не увидел контроль выхода за пределы массива 2. В данном коде размер массива вроде как увеличивается, но память под него остается как прежде:
Соответственно первый же вызов данного метода по сути должен вылезти за пределы памяти... Добавлено @ 18:09
Программировать без использования отладчика тяжело |
||||
|
|||||
| Rage |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 30.10.2006 Где: Спб Репутация: 1 Всего: 1 |
1. Размер массива не увеличивается, данный метод только записывает целое число в массив.
А sz - актуальный размер массива. т.е сколько элементов туда записано на данный момент 2.Отладчик не указывет на строчку с ошибкой. Не дурак, отладчиком пользоваться умею. |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Немного неправильно посмотрел. Может вылезти за пределы после работы с конструктором копирования..
Рассмотрим метод lобавления подробнее На мой взгляд условие цикла должно быть строгим for(int i=(sz-1);i>0;i--) ^^ Добавлено @ 18:20
Даже не думал кого-то обзывать. Просто если вы почитаете побольше тем форума - хотя бы за последнюю неделю - просто все подряд, то увидете весьма занятные вещи. Каких только вопросов не задают - иногда не знаешь плакать или материться. Мой вопрос и был так сформулирован: т.е. скорее всего где-то затирается память. При ситуации с массивами - это как правило выход за пределы И примерно локализовать ошибку можно даже не рассматривая детально код. |
|||
|
||||
| Rage |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 30.10.2006 Где: Спб Репутация: 1 Всего: 1 |
К сожалению так она вообще не выводит ничего толкового...
Добавлено @ 18:25 И я даже знаю почему... |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Мне еще один момент непонятен: при добавлении элемента - мы сдвигаем очередь и освобождаем под него место, а вот при извлечении элемента - просто двигаем указатель начала очереди. Мне кажется надо делать одинаково. Либо двигать указаетль либо сдвигать элементы и там и там
|
|||
|
||||
| Rage |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 30.10.2006 Где: Спб Репутация: 1 Всего: 1 |
Понимаешь ли, штука в том, что если бы всё то о чём ты говоришь, мешало бы выполнению программы, то она не выводила бы очереди вообще!
Но, повторюсь, она и вводит, и выводит очередь нормально!!! |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Запросто. Затерли [-1] элемент массива - и вот ошибка на операторе delete[] - так как испорчен блок памяти... Просто я немного устамши - башка не варит, чисто нутром чую, что что-то с амссивом не так? а найти пока не могу. Но я как и все люди могу ошибаться, естественно. Добавлено @ 18:40 Кстати - загнал пример к себе в Билдер 6 Вылетает на строке delete []v - в этом месте (в деструкторе) v=0. Как я и предполагал затираем именно -1 элемент |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
В общем поставь в методе add строку
sz=sz+1; ПОСЛЕ цикла |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |