Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ошибка Project kontr1_pr.exe raised exception class EAccessViolation ...

48K
18 мая 2009 года
killa_
2 / / 18.05.2009
в новом окне Debugger Exception Notification
Project kontr1_pr.exe raised exception class EAccessViolation with message 'Access violation at address 7C90100B.Read of address 0000001C'.Process stopped.Use Step or Run to continue.
кнопки OK.Help.
чекбокс View CPU Window

заголовочный файл:
Код:
#include <vcl.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>

template <class T> class Collection
{
private:
int current_size;   //текущий размер коллекции
int max_size;       //максимальный размер коллекции
T *obj;            //массив объектов коллекции

long N_comparison;
long N_exchange;

public:
Collection ( ); //конструктор по умолчанию
//Collection (…); //конструктор с параметрами

Collection (const Collection<T> & anotherCollection);   // конструктор копирования
~Collection (); //деструктор

//объявление прототипов интерфейсных методов Collection
int size_of_vektor();    //опрос размера вектора  ============== READY!========
void resize(int);        //изменение размера вектора  ============== READY!========
void random_input();     //заполнение вектора случайными величинами
void ranked_input();      //заполнение вектора упорядоченным набором
void manual_input();     //ввод вектора с клавиатуры   ============== READY!========
void term_output();      //вывод вектора на экран
T read_N(int);           //чтение по индексу      ============== READY!========
void write_N(int,T);   //запись по индексу        ============== READY!========
  //сортировки:
void Bubble_sort();
void MSD_sort();
long get_N_comparison();
long get_N_exchange();

//класс итератора для объекта Collection
class Iterator
{  Collection *ptr; //указатель на объект коллекции
   T *cur;      //указатель на текущий элемент коллекции
   public:
   Iterator (Collection *);  //конструктор итератора
   ~Iterator(); //деструктор итератора

   void beg();  //установка итератора на первый элемент коллекции
   void end();  //установка итератора на последний элемент коллекции
   void next(); //перевод итератора на следующий элемент
   void prev(); //перевод итератора на предыдущий элемент
   bool is_off();   //проверка выхода итератора за пределы коллекции
 //  Т& operator *(); //доступ к данным текущего элемента
//необязательные методы итератора
//   Iterator  &operator ++(); //оператор инкремента итератора
//   Iterator  & operator --();  //оператор декремента итератора
//   bool  opereator ==(const Iterator &);  //оператор сравнения итераторов
//   Iterator  & operator =( const Iterator &); //оператор присваивания
}; //конец класса Iterator
friend class Iterator;
}; //конец класса Collection
//реализация методов класса Collection
//контруктор по умолчанию (===============ИЗМЕНИТЬ!!!!!!==============)
template <class T> Collection <T>::Collection () :

                                current_size (5),
                                max_size (10),
                                N_comparison (0),
                                N_exchange (0)
{
obj=new T;
}

//деструктор

template <class T> Collection <T>::~Collection ()
{delete obj; }


//опрос размера вектора
template <class T> int Collection <T>::size_of_vektor ()
{ return current_size; }

//чтение по индексу
template <class T> T Collection <T>:: read_N (int N)
{
        while (N < 0 || N > current_size)  do
        {
                cout << "Enter correct index: " ;
                cin >> N;
        };

        return obj[N];
}

//запись по индексу
template <class T> void Collection <T>:: write_N (int N,T new_item)
{
        while (N < 0 || N > current_size)  do
        {
                cout << "Enter correct index: " ;
                cin >> N;
        };

        obj[N]=new_item;
}

//изменение размера вектора
template <class T> void Collection <T>:: resize (int N)
{
        while (N < 0 || N > max_size)  do
        {
                cout << "Enter correct new size: " ;
                cin >> N;
        };

        current_size=N ;
}

//ввод вектора с клавиатуры
template <class T> void Collection <T>:: manual_input ()
{
        for (int i = 0 ; i < current_size ; i++)
        {
                cout << "Enter " << i << " element:";
                //cin >> obj;
                obj=i*2;
        }
}

//вывод вектора на экран
template <class T> void Collection <T>:: term_output ()
{
        for (int i = 0 ; i < current_size ; i++)
        {
                cout << obj << "--";
        }
}
//реализация методов класса Iterator.
//конец заголовочного файла "Collection.h"

файл программы:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>

#include "kontr1.h"

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
        Collection <int> *test;
        test=new Collection <int> ();
        test->manual_input();
        cout << test->size_of_vektor();
        test->term_output();
        cout << "pezdec" << endl;
        getch();
        delete test;
        return 0;
}
//---------------------------------------------------------------------------


окно ошибки появляется после выполнения функции getch();. причем если закомментировать test->manual_input(); ручной ввод с клавиатуры, то ошибка не появляется. выводит конечно мусор из паямяти но без ошибки. не могу понять что ему не нравится. помогите пожалуйста. скоро сессия :(
602
19 мая 2009 года
KPI Student
265 / / 16.12.2006
как вариант - включите CodeGuard, это такая штука, покажет, если вы что-то перемудрили с памятью. Еще можно прикрепить к теме файлы проекта в архиве, так как мне, к примеру, лень создавать проект по исходникам "из окошка". Боюсь, что многим посетителям форума - тоже.
602
19 мая 2009 года
KPI Student
265 / / 16.12.2006
А, так это, ну создали вы ОДИН элемент массива, а юзать хотите 10...
Код:
Collection () :

                                current_size (5),
                                max_size (10),
                                N_comparison (0),
                                N_exchange (0)
{
obj=new T;
}

template <class T> void Collection <T>:: manual_input ()
{
        for (int i = 0 ; i < current_size ; i++)
        {
                cout << "Enter " << i << " element:";
                //cin >> obj;
                obj=i*2;
        }
}


Вот вам и ошибка.

Кстати, раз уж память выделяете динимически - надежнее работать с auto_ptr, чтобы не забывать очищать.

Вопрос к автору: зачем вы столько стандартных хидеров натыкали? Используются всего 2:
 
Код:
#include <iostream.h>
#include <conio.h>
Еще на забывайте включать про стражи повторного включения:
 
Код:
#ifndef _MYHEADER_H_
#define _MYHEADER_H_

code

#endif
иначе при нечаянном включении одного хидера 2 раза будет беда.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог