Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
934 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,039
1

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

08.05.2013, 18:08. Просмотров 512. Ответов 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. Я от не пойму мб память израсходовала всю программа, а может быть слишком много рекурсивных вызовов функций в классе. Кто шарит может просто просветить в чом все таки ошибка, а то по тому что выскочило окошко я ничего не понял.

Сама ошибка которая вылазит:
0
Миниатюры
Не понятная ошибка  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2013, 18:08
Ответы с готовыми решениями:

Не понятная ошибка
Доброго времени суток...))) С++ изучаю второй день, прошу строго не ругать если моя проблема...

Не понятная ошибка
|9|error: no matching function for call to 'TArray&lt;std::basic_string&lt;wchar_t&gt;...

Не понятная ошибка
Ошибка: undefined reference to `Factor(unsigned short, unsigned short&amp;, unsigned short&amp;)'| ...

set_intersection ??? не понятная ошибка.
есть базовый класс car, производный Bus. Так же есть класс который не связан с Bus и car, он...

11
3049 / 1454 / 492
Регистрация: 29.11.2010
Сообщений: 2,893
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?
Оно же чудом работает.
1
934 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,039
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);
Оно видимо чото память сожрало или фиг его знает мб много рекурсивных вызовов ?.
0
3049 / 1454 / 492
Регистрация: 29.11.2010
Сообщений: 2,893
08.05.2013, 18:41 4
Ок, а куда девается ссылка на объект, который был tek->next? Кто продолжает о нем помнить?
1
934 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,039
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;
Отета от фигня что выше показывает что все вроде правильно добавляется как положено.
0
934 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,039
08.05.2013, 19:02  [ТС] 6
От красивый вывод который показывает, что все правильно добавляется.
0
Миниатюры
Не понятная ошибка  
934 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,039
08.05.2013, 19:09  [ТС] 7
Код запутанный ставлю всем плюсы тошо его трудно читать.
Ну что? У кого какие идеи есть?
0
3049 / 1454 / 492
Регистрация: 29.11.2010
Сообщений: 2,893
08.05.2013, 19:53 8
Есть идея. Может его нормально переписать? А то запутанный он какой-то. Еще и очередь кверху тормашками.

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

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

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

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

Добавлено через 1 минуту
ОТ как раз щас задачку буду делать написать итератор для этого класса, для класса Vector, придумать короче его. Щас как нибуть втулю лишь бы заработало.
0
3049 / 1454 / 492
Регистрация: 29.11.2010
Сообщений: 2,893
09.05.2013, 10:06 12
Незамутненный поток сознания.

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

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

Цитата Сообщение от ninja2 Посмотреть сообщение
Щас как нибуть втулю лишь бы заработало.
Жуть.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2013, 10:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Не понятная ошибка файлы и строки
Не могу понять в чем дело Задача: Посчитать сколько строк в файле начинаються и заканчиваються с...

не понятная ошибка ввода значений
#include &lt;math.h&gt; #include &lt;iostream&gt; using namespace std; void main() { int...

Не понятная ошибка при чтении из файла
#include&lt;iostream&gt; #include&lt;iomanip&gt; #include&lt;string&gt; #include&lt;fstream&gt; using namespace std;...

Phonon: не понятная ошибка
Здравствуйте, что-то как-то не работает Phonon, выдает ошибку, подскажите пожалуйста, вот код: ...

Не понятная ошибка при работе программы (окно CPU)
Программа компилируется, запускается. При добавлении в справочник номера какого-либо номера...

Не понятная ошибка
Пацаны хелпаните с кодом Не понимаю почему не проходит unit Unit1; interface uses...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.