Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

Не понятная ошибка - C++

08.05.2013, 18:08. Просмотров 392. Ответов 11
Метки нет (Все метки)

Здорова господа!
Вообщем проблема. Написал короче программку как бы имитация контейнеров с общим базовым классом. И пытаюсь туда запулить 10000 элементов. Но когда я их вывожу выводится только 4300 ну примерно где то так элементов и вылазит ошибка. Вот код самой программы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
//programma proizvoditel6nocti
#include <iostream>
using std::cout;
using std::endl;
#include <vector>
using std::vector;
#include <cstdlib>
using std::rand;
using std::srand;
#include <ctime>
using std::time;
 
//Vector iz 16.5.[9]
struct Object
{
    Object* pre;
    Object* next;
    //...
public:
    //konctryktor po ymolchaniyu
    Object():pre(0),next(0){}
 
    //virtual6nui dectryktor
    virtual ~Object(){};
};
 
class Container : public Object
{
public:
    struct Bad_op//klacc icklyuchenii
    {
        const char* p;
        Bad_op(const char* pp):p(pp){}
    };
    
    virtual void put(Object*){throw Bad_op("put");}
    virtual Object* get() {throw Bad_op("get");}
    virtual Object*& operator[](int){throw Bad_op("[]");}
    
    //...
};
 
class Vector1 : public Container
{
    Object* tek;//pervui element;
    int size;//razmer
public:
    //konctryktor preobrazovani9
    Vector1(int i):size(i),tek(0){}
 
    //dabavit6 elementu
    void put(Object* a)
    {
        //cout <<"Mu v put"<<endl;
        if(tek==0)
        {
            //cout <<"vector pyct"<<endl;
            if(size!=0)
                tek=a;
        }
        else
        {
            //cout <<"vector ect6 elementu"<<endl;
            Object* temp=tek;
            tek->next=a;
            a->pre=tek;
            tek=a;
        }
    }
 
    //indekc
    Object*& operator[](int a)
    {
        //cout <<"Mu cdec6"<<endl;
        if(a==0)
            return tek;
        else
        {
            if(a>0&&a<size)
            {
                int count=0;
                Object* t = opHelper(a,tek->pre,count);
                //cout <<"t= "<<t<<endl;
                return t;
            }
        }
        //return 0;
    }
 
    //opHelper
    Object*& opHelper(int& a, Object* Ptr,int& count)
    {
        if(Ptr!=0&&++count==a)
        {
            //cout <<"a= "<<a<<" cout= "<<count<<endl;
            //cout <<"MU TYT"<<endl;
            //exit(1);
            //cout <<"Ptr= "<<Ptr<<endl;
            return Ptr;
        }
        else if(Ptr!=0&&count!=a)
            opHelper(a,Ptr->pre,count);
        else
        {
            //cout <<"element ne cozdan"<<endl;
            exit(1);
        }
    }
    //...
};
 
class elem : public Object
{
public:
    int data;
    elem(int a):data(a){}
};
 
int main()
{
//proizvedem podcchet dl9 Vector iz 16.5.[9]
    Vector1 vec2(10000);
    for(int i=0;i<10000;i++)
    {
        elem* a= new elem(rand()%1023);
        //cout <<a.data<<endl;
        //a=(rand()%1024);
        vec2.put(a);
        if(i==9999)
            cout <<"i= "<<i<<endl;
    }
    //elem* pr=dynamic_cast<elem*>(vec2[7000]);
    //cout <<pr->data<<endl;
    //exit(1);
    //podcchet crednego arifmeticheckogo
    double sum=0;
    double sredV=0;
    for(int i=0;i<10000;i++)
    {
        //elem* pr=dynamic_cast<elem*>(vec2[i]);
        cout <<i<<endl;//do 4000 примерно выводит и тормозит.
        sum+=dynamic_cast<elem*>(vec2[i])->data;
    }
 
    return 0;
}
Он видно оно посчитало щас до 4380, а прошлые разы когда вся программа была полностью считала до 4170. Я от не пойму мб память израсходовала всю программа, а может быть слишком много рекурсивных вызовов функций в классе. Кто шарит может просто просветить в чом все таки ошибка, а то по тому что выскочило окошко я ничего не понял.

Сама ошибка которая вылазит:
Миниатюры
Не понятная ошибка  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.05.2013, 18:29     Не понятная ошибка #2
Цитата Сообщение от ninja2 Посмотреть сообщение
//cout <<"vector ect6 elementu"<<endl;
* * * * * * Object* temp=tek;
* * * * * * tek->next=a;
* * * * * * a->pre=tek;
* * * * * * tek=a;
Неправильно добавляете элементы.
Чему равен a->next?
Оно же чудом работает.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.05.2013, 18:35  [ТС]     Не понятная ошибка #3
Цитата Сообщение от lemegeton Посмотреть сообщение
Неправильно добавляете элементы.
Чему равен a->next?
Оно же чудом работает.
a->next=0 там конструктор есть.

в самом верху
C++
1
2
//konctryktor po ymolchaniyu
Object():pre(0),next(0){}
elem наследник Object , значит по умолчанию уже вызван конструктор базового класса при создании
elem* a=new(rand()%1023);
Оно видимо чото память сожрало или фиг его знает мб много рекурсивных вызовов ?.
lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.05.2013, 18:41     Не понятная ошибка #4
Ок, а куда девается ссылка на объект, который был tek->next? Кто продолжает о нем помнить?
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.05.2013, 18:58  [ТС]     Не понятная ошибка #5
Цитата Сообщение от lemegeton Посмотреть сообщение
Ок, а куда девается ссылка на объект, который был tek->next? Кто продолжает о нем помнить?
мы находимся в самом объекте Vector как бы с конца tek это текущий элемент tek->next=0; в нем tek->pred равняется предыдущий элемент. в предыдущем элементе tek->pred->next указывает на tek. Как бы я иду снизу в верх. От если мы опустимся в самый низ к элементу то в нем tek->pred=0 , Вообщем список двусвязный.
next - указывает на следующий элемент. Поэтому в самом векторе он нулевой.

Добавлено через 1 минуту
Цитата Сообщение от lemegeton Посмотреть сообщение
Ок, а куда девается ссылка на объект, который был tek->next? Кто продолжает о нем помнит
О нем помнит temp
temp->next и tek->next это ж один и тот же указатель? щас попробую поменять.
ну да я там temp нигде не использую щас попробую подправить.

Добавлено через 7 минут
Я от посмотрел и вообще за комментировал лишнюю строчку там 3 строчки хватит:
C++
1
2
3
4
//Object* temp=tek;//tekychii element
            tek->next=a;//указываем на новый элемент
            a->pre=tek;//указываем на предыдущий
            tek=a;//указываем текущий.
Добавлено через 2 минуты
щас еще и выводы сделаю.
C++
1
cout <<tek->pre<<' '<<tek->next<<' '<<tek->pre->next<<' '<<tek->pre->pre<<endl;
Отета от фигня что выше показывает что все вроде правильно добавляется как положено.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.05.2013, 19:02  [ТС]     Не понятная ошибка #6
От красивый вывод который показывает, что все правильно добавляется.
Миниатюры
Не понятная ошибка  
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.05.2013, 19:09  [ТС]     Не понятная ошибка #7
Код запутанный ставлю всем плюсы тошо его трудно читать.
Ну что? У кого какие идеи есть?
lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.05.2013, 19:53     Не понятная ошибка #8
Есть идея. Может его нормально переписать? А то запутанный он какой-то. Еще и очередь кверху тормашками.

А вообще про opHelper, который сам себя вызывает -- это можно подумать. Попробуйте его без рекурсии.
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.05.2013, 20:24  [ТС]     Не понятная ошибка #9
lemegeton, я наверно забью на эту задачку лень переписывать, хоть как то работает и то хорошо. Это так все рамно для примера типо СТЛ. Мне просто еще нужно 180 задач решить (10 уже сделал), так что ну его забью на нее, потом если реально понадобится тогда переделаю. Читая книгу я так понял, что реально оно не понадобится, потому что там говорится, что это мы просто создаем в учебных целях, а дальше нужно обязательно использовать СТЛ.

Это вообще то третья часть задачи. Там нужно посчитать для трех векторов производительность из стл, из 5 задачи и из 9 - этот как бы этот класс что тормозит.
lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.05.2013, 23:58     Не понятная ошибка #10
Странно вы как-то "типо СТЛ" пишете. Ваш код даже близко по функционалу не подошел. Плюс выкинуто нафиг чуть ли не самая крутая шляпа в STL -- вся концепция итераторов.

Кстати, vector в STL не реализуется связным списком. Может по этому и кажется, что тормозит?
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.05.2013, 02:26  [ТС]     Не понятная ошибка #11
lemegeton, Это как бы один из вариантов как можно организовать контейнеры, ну типо с общим базовым классом. СТЛ вроде организована с разными базовыми классами, класс вектор ни от кого ничо не наследует, лист тоже ни от кого ничо не наследует, как бы типо своя стл. (класс итератор тоже делал). А это шо час делаю, что не получилась, это как бы можно такую организацию иерархии классов взять себе на вооружение, ну это как бы стандартная иерархия один базовый класс и от него пошли производные. Короче типо токого шото.

Они конечно не так организованы, но вектор можно б было организовать так как я написал. Вообще там в задаче была пустая функция типо доделайте вектор из параграфа такого, ну я от и втулил в виде связного списка лиш бы сделать.

Добавлено через 1 минуту
ОТ как раз щас задачку буду делать написать итератор для этого класса, для класса Vector, придумать короче его. Щас как нибуть втулю лишь бы заработало.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2013, 10:06     Не понятная ошибка
Еще ссылки по теме:

C++ Не понятная ошибка
Не понятная ошибка C++
Не понятная ошибка C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
09.05.2013, 10:06     Не понятная ошибка #12
Незамутненный поток сознания.

Цитата Сообщение от ninja2 Посмотреть сообщение
Это как бы один из вариантов как можно организовать контейнеры, ну типо с общим базовым классом.
STL основан на шаблонах, наследование ему только помешает.

Цитата Сообщение от ninja2 Посмотреть сообщение
это как бы можно такую организацию иерархии классов взять себе на вооружение
Я бы не стал брать на вооружение контейнер, наследуемый от хранимого в нем элемента. Хотя бы потому, что контейнер не является хранимым в нем элементом. Это неправильно.

Цитата Сообщение от ninja2 Посмотреть сообщение
Щас как нибуть втулю лишь бы заработало.
Жуть.
Yandex
Объявления
09.05.2013, 10:06     Не понятная ошибка
Ответ Создать тему
Опции темы

Текущее время: 22:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru