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

Крашится программа при попытке присваивания значения элементу дин-го массива - C++

Восстановить пароль Регистрация
 
pihta
1 / 1 / 0
Регистрация: 11.11.2012
Сообщений: 23
15.09.2013, 15:14     Крашится программа при попытке присваивания значения элементу дин-го массива #1
Не могу понять в чём ошибка. Я только учусь, поэтому возможно, что ошибка элементарная.

Вот шаблон класса множество. Хотел написать функцию, которая "нормализует" мн-во(т.е. удаляет из него повторяюзиеся элементы), но у меня возникли трудности с динамическим массивом. Функция "void normalize()", строка 163- начало функции, а сама проблема на строке 177.

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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#ifndef SET_H
#define SET_H
 
#include <iostream>
#include <cstdlib>
 
using std::ostream;
using std::istream;
using std::endl;
using std::cerr;
using std::exit;
 
using std::cout;
 
template <typename T> class Set;
template <typename T> ostream& operator<<(ostream&, const Set<T>&);
template <typename T> istream& operator>>(istream&, Set<T>&);
 
template <typename T>
class Set
{ 
    friend ostream& operator<< <> (ostream&, const Set<T>&);
    friend istream& operator>> <> (istream&, Set<T>&);
    
    public:
        explicit Set();
        Set(const T*, int);
        
        Set(const Set&);
        ~Set();
        const Set& operator=(const Set&);
        
        void normalize();
        
    private:
        int power;
        T *begin;
        
        
};
 
////////////////////////////////////////////////////////////////////////////////
 
template <typename T>
ostream& operator<<(ostream& output, const Set<T> &a)
{
    output << "Power: " << a.power << "; ";
    output << "Elements: ";
    for(int i=0; i<a.power; i++)
        output << a.begin[i] << " ";
    
    output << endl;
    
    return output;
}
 
template <typename T>
istream& operator>>(istream& input, Set<T> &a)
{
    int pow;
    input >> pow;
    
    a.power=(pow<0)?0:pow;
    delete [] a.begin;
    a.begin = new T[a.power];
    
    for(int i=0; i<a.power; i++)
        input >> a.begin[i];
    
    return input;
}
 
////////////////////////////////////////////////////////////////////////////////
 
template <typename T>
Set<T>::Set()
{
    power=0;
    begin=new T[power];
}
 
template <typename T>
Set<T>::Set(const T* array, int n)
{
    power=(n<0)?0:n;
 
    begin=new T[power];
    
    for(int i=0; i<power; i++)
        begin[i]=array[i];
}
 
////////////////////////////////////////////////////////////////////////////////
 
template <typename T>
Set<T>::Set(const Set &Set_to_copy)
{
    power=Set_to_copy.power;
    begin=new T[power];
    
    for(int i=0; i<power; i++)
        begin[i]=Set_to_copy.begin[i];
}
 
template <typename T>
Set<T>::~Set()
{
    delete []begin;
}
 
template <typename T>
const Set<T>& Set<T>::operator=(const Set &right)
{
    if( &right != this )
    {
        delete []begin;
        
        power=right.power;  
        begin=new T[power];
        for(int i=0; i<power; i++)
            begin[i]=right.begin[i];
    }
    
    return *this;
}
 
////////////////////////////////////////////////////////////////////////////////
 
template <typename T> 
inline void swap(T* const a, T* const b)
{
    T temp=*a;
    *a=*b;
    *b=temp;
}
 
template <typename T> 
void quick_sort(T* a, int low, int high) 
{
    int i = low, j = high;
    T br = a[(low+high)/2]; 
      
    do 
    {
        while(a[i] < br) ++i;  
        while(a[j] > br) --j;  
         
        if(i <= j)
        {
            swap(&a[i], &a[j]);
            i++;
            j--;
        }
    } 
    while(i < j);
      
    if(low < j) quick_sort(a, low, j);
    if(i < high) quick_sort(a, i, high);
}
 
template <typename T>
void Set<T>::normalize()
{
    int i=0, j=0, newPower=(power>0)?1:0;
    
    quick_sort(begin, 0, power-1);
    
    for(int i=1; i<power; i++)
        if(begin[i]!=begin[i-1]) newPower++;
    
    T *newBegin=new T(newPower);
    
    newBegin[0]=begin[0];
    for(i=1; i<power; i++)
        if(begin[i] != begin[i-1])
            newBegin[j++] = begin[i]; // Г—ГІГ® çäåñü ìîæåò áûòü Г*ГҐ ГІГ*ГЄ?
    
    delete []newBegin;
}
 
#endif
И вот main, если понадобится:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstdlib>
#include "set.h"
 
using std::cout;
using std::cin;
using std::endl;
 
int main()
{
    int array1[10]={15, 14, 13, 12, 11, 15, 49, 8, 28, 12};
    Set <int> intSet1(array1, 10);
    
    cout << intSet1 << endl;       
    intSet1.normalize();
    cout << intSet1 << endl;
    
    cout << endl;
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2013, 15:14     Крашится программа при попытке присваивания значения элементу дин-го массива
Посмотрите здесь:

C++ Непонятная ошибка при инициализации дин. массива
Ошибка при присвоении значения элементу массива в функции C++
C++ XE3 выдаёт ошибки при попытке присвоения значения переменной string
Программа вылетает при попытке открыть файл C++
C++ Присвоение значения случайному элементу массива
C++ Программа крашится при вводе данных
Запись и чтение бинарных файлов. Программа крашится при закрытии консольного окна C++
Преимущества и недостатки при реализации стека, очереди и дека через дин. массива C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
15.09.2013, 15:19     Крашится программа при попытке присваивания значения элементу дин-го массива #2
C++
1
T *newBegin=new T(newPower);
Ты выделяешь здесь память на один элемент, а (newPower) - это конструктор...
Так надо:
C++
1
T *newBegin=new T[newPower];
pihta
1 / 1 / 0
Регистрация: 11.11.2012
Сообщений: 23
15.09.2013, 15:22  [ТС]     Крашится программа при попытке присваивания значения элементу дин-го массива #3
monolit, Спасибо огромное, сам бы никогда не заметил)
Yandex
Объявления
15.09.2013, 15:22     Крашится программа при попытке присваивания значения элементу дин-го массива
Ответ Создать тему
Опции темы

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