Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очередь 
V
    Опции темы
Rage
  Дата 16.12.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 30.10.2006
Где: Спб

Репутация: 1
Всего: 1



Здравствуйте коллеги!
Нужна ваша помощь. 
 smile 
Пишу класс очередь.
Вроде он и простой получился,но программа всё время выдаёт ошибку при выполнении.
Знаете,как бывает,сидишь-сидишь, думаешь-думаешь, а потом оказывается ерунда какая-нибудь.
Взгляните свежим взглядом, пожалуйста.

Код


class turn{     //Очередь
  int *v,*first;
  int sz;
public:
  turn(int);//Перегруж конструктор
  turn(const turn&);//Конструктор копирования
  ~turn();//Деструктор
  void add(int);
  int get();
  int size() const;
 };

turn::turn(int n){
    sz=0;
    v=first=new int[n];
};

turn::turn(const turn& t){
    sz=t.sz;
    v=new int[sz];
    for(int i=0;i<sz;i++)
        v[i]=t.v[i];
    first=v+(t.first-t.v);
};

turn::~turn(){
    delete []v;
};

void turn::add(int n){

    sz=sz+1;

    first=(first+1);

    for(int i=(sz-1);i>=0;i--)
        v[i+1]=v[i];

    v[0]=n;
    
};

int turn::get(){
    sz=sz-1;
    first=first-1;
    return v[sz];
};

void main(){

  char st[100],c[5];int i,z;

  turn T(10);

  for(i=0;i<10;i++){

      CharToOem("Добавление в очередь:",st);
      cout<<st;
      cin>>z;
      T.add(z);
  }

  for(i=0;i<10;i++){
      cout<<T.get()<<'\n';
  }
  cout<<"No problem"<<flush;
}
    

PM MAIL ICQ   Вверх
Anikmar
Дата 16.12.2006, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Напишите хотя бы КАКУЮ ошибку выдает
Хотелось бы еще ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ...

Например в этом участке 
Код

turn::turn(const turn& t){
    sz=t.sz;
    v=new int[sz];
    for(int i=0;i<sz;i++)
        v[i]=t.v[i];
    first=v+(t.first-t.v);
};


лично мне непонятна строка
first=v+(t.first-t.v);

Причем я не говорю сразу, что здесь ошибка - просто как-то мудрено мне видится...

Это сообщение отредактировал(а) Anikmar - 16.12.2006, 18:00
PM MAIL ICQ   Вверх
Rage
Дата 16.12.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 30.10.2006
Где: Спб

Репутация: 1
Всего: 1



Вводится очередь нормально, выводится тоже, но вот после того, как она вся выведена, вылезает ошибка: 

Debug Error!
Program.....
DAMAGE:after Normal block (#44) at 0x008C1DA0

Исчерпывающе?


PM MAIL ICQ   Вверх
Anikmar
Дата 16.12.2006, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



И уж совсем мне нравится комментарии:
во всем коде есть 4 комментария - они очень информативны, не находите?

class turn{     //Очередь
  int *v,*first;
  int sz;
public:
  turn(int);//Перегруж конструктор
  turn(const turn&);//Конструктор копирования
  ~turn();//Деструктор

...
PM MAIL ICQ   Вверх
Rage
Дата 16.12.2006, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 30.10.2006
Где: Спб

Репутация: 1
Всего: 1



first=v+(t.first-t.v) - выражение для вычисления нового адреса указателя first
PM MAIL ICQ   Вверх
Anikmar
Дата 16.12.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Rage @ 16.12.2006,  18:01)
Исчерпывающе?

Не совсем

На какой-нибудь конкретной строчке или после выхода из программы?
PM MAIL ICQ   Вверх
Rage
Дата 16.12.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 30.10.2006
Где: Спб

Репутация: 1
Всего: 1



А насчёт комментариев - я их писал для себя.

Добавлено @ 18:06 
Если бы я знал на какой сторчке ошибка, я б даже темы не создавал...
PM MAIL ICQ   Вверх
Anikmar
Дата 16.12.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Если я правильно понял логику, то в конструкторе с параметром int создается объект очереди, с заданным максимально возможным количеством элементов.

Под них создается массив, который в деструкторе удаляется.

Несколько вопросов:
1. Нигде не увидел контроль выхода за пределы массива

2. В данном коде размер массива вроде как увеличивается, но память под него остается как прежде:
Код

void turn::add(int n){

    sz=sz+1;

    first=(first+1);

    for(int i=(sz-1);i>=0;i--)
        v[i+1]=v[i];

    v[0]=n;
    
};


Соответственно первый же вызов данного метода по сути должен вылезти за пределы памяти...

Добавлено @ 18:09 
Цитата(Rage @ 16.12.2006,  18:04)
Если бы я знал на какой сторчке ошибка, я б даже темы не создавал...

Программировать без использования отладчика тяжело
PM MAIL ICQ   Вверх
Rage
Дата 16.12.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 30.10.2006
Где: Спб

Репутация: 1
Всего: 1



1. Размер массива не увеличивается, данный метод только записывает целое число в массив.
А sz - актуальный размер массива. т.е сколько элементов туда записано на данный момент

2.Отладчик не указывет  на строчку с ошибкой. Не дурак, отладчиком пользоваться умею.
PM MAIL ICQ   Вверх
Anikmar
Дата 16.12.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Немного неправильно посмотрел. Может вылезти за пределы после работы с конструктором копирования..

Рассмотрим метод lобавления подробнее
На мой взгляд условие цикла должно быть строгим
for(int i=(sz-1);i>0;i--)
                        ^^

Добавлено @ 18:20 
Цитата(Rage @ 16.12.2006,  18:14)
Не дурак, отладчиком пользоваться умею.

Даже не думал кого-то обзывать.
Просто если вы почитаете побольше тем форума - хотя бы за последнюю неделю - просто все подряд, то увидете весьма занятные вещи. Каких только вопросов не задают - иногда не знаешь плакать или материться.

Мой вопрос и был так сформулирован: т.е. скорее всего где-то затирается память.
При ситуации с массивами - это как правило выход за пределы
И примерно локализовать ошибку можно даже не рассматривая детально код.
PM MAIL ICQ   Вверх
Rage
Дата 16.12.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 30.10.2006
Где: Спб

Репутация: 1
Всего: 1



К сожалению так она вообще не выводит ничего толкового...

Добавлено @ 18:25 
И я даже знаю почему... smile

PM MAIL ICQ   Вверх
Anikmar
Дата 16.12.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Мне еще один момент непонятен: при добавлении элемента - мы сдвигаем очередь и освобождаем под него место, а вот при извлечении элемента - просто двигаем указатель начала очереди. Мне кажется надо делать одинаково. Либо двигать указаетль либо сдвигать элементы и там и там
PM MAIL ICQ   Вверх
Rage
Дата 16.12.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 30.10.2006
Где: Спб

Репутация: 1
Всего: 1



Понимаешь ли, штука в том, что если бы всё то о чём ты говоришь, мешало бы выполнению программы, то она не выводила бы очереди вообще!
Но, повторюсь, она и вводит, и выводит очередь нормально!!!
 
PM MAIL ICQ   Вверх
Anikmar
Дата 16.12.2006, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Rage @ 16.12.2006,  18:31)
Понимаешь ли, штука в том, что если бы всё то о чём ты говоришь, мешало бы выполнению программы, то она не выводила бы очереди вообще!
Но, повторюсь, она и вводит, и выводит очередь нормально!!!

Запросто. 
Затерли [-1] элемент массива - и вот ошибка на операторе delete[] - так как испорчен блок памяти...
Просто я немного устамши - башка не варит, чисто нутром чую, что что-то с амссивом не так? а найти пока не могу.

Но я как и все люди могу ошибаться, естественно.

Добавлено @ 18:40 
Кстати - загнал пример к себе в Билдер 6

Вылетает на строке delete []v - в этом месте (в деструкторе) v=0. Как я и предполагал затираем именно -1 элемент
PM MAIL ICQ   Вверх
Anikmar
Дата 16.12.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



В общем поставь в методе add строку
    sz=sz+1;

ПОСЛЕ цикла
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0717 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.