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

Ошибка при добавлении элемента в динамический массив - C++

Восстановить пароль Регистрация
 
AzgardC
7 / 7 / 0
Регистрация: 18.10.2012
Сообщений: 81
04.03.2013, 15:42     Ошибка при добавлении элемента в динамический массив #1
Всем привет! Создал класс для работы с дин.массивом. Нормально компилируется и выводит массив, но когда добавляю новый элемент, выдает ошибку. Подскажите, пожалуйста, в чем может быть проблема. Буду очень благодарен!
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
#include <conio.h>
#include <iostream>
#include <math.h>
#include <time.h>
using namespace std;
 
class massiv
{
private:
    int p;
    int max;
    int* mas;
 
public:
    massiv();
    massiv(int v);
    massiv(const massiv & a);
    ~massiv();
    void neo(int m[100], int Max); //запись массива
    void printmassiv(); //распечатка массива
    void dob(int ); //добавление элемента в конец массива
    void search(int ); //поиск элемента
    void swap(int , int ); //замена элемента 
    void del(int ); //удаление элемента
    
};
massiv::massiv()
{
    max=0;
    mas=new int[max];
}
 
massiv::massiv(int v)
{
    int i;
    max=v;
    mas=new int[max]; 
    for(i=0; i<max;++i)mas[i]=0;
}
 
massiv::massiv(const massiv & a)
{
    int i;
    max=a.max;
    mas=new int[max]; 
    for(i=0; i<max;++i)mas[i]=a.mas[i];
}
 
 
massiv::~massiv() 
{  
    delete [] mas;
}
 
 
 
void massiv::neo(int *m, int Max)
{
    int i;
    max=Max;
    for (int i = 0; i < max; i++) mas[i]=m[i];
}
 
void massiv::printmassiv()
{
    int i;
    for (int i=0; i<max; i++)cout<<mas[i]<<"\n";
}
 
void massiv::dob(int f)
{
    int i;
    int* o;
    o=new int[max];
    for (int i=0; i<max; i++)o[i]=mas[i];
    delete [] mas;
    mas=new int[max+1];
    for (int i=0; i<max; i++)mas[i]=o[i];
    mas[max]=f;
    max=max+1;
}
 
void massiv::search(int k)
{
    int i;
    for (int i=0; i<max; i++)if(mas[i]==k)
    {
        cout<<"Nomer elementa: "<<i+1<<"\n"; 
        break;
    };
}
 
void massiv::swap(int y, int u)
{
    mas[y-1]=u;
}
 
void massiv::del(int t)
{
    int i;
    for (int i=t-1; i<max-1; i++)mas[i]=mas[i+1];
    max=max-1;
}
 
int main()
{
    int Max, m[100], f, k, y, u, t;
    massiv M;
    int j;
    cout << "Vvedite razmer massiva: ";
    cin >> Max;
    cout << "Vvodite elementi massiva nazhimaya Enter: \n";
    for (j = 0; j<Max; ++j) cin >>m[j];
    M.neo(m,  Max);
    cout << "Vot ON!\n";
    M.printmassiv();
    cout << "\n";
    cout << "Vvedite celoe chislo kotoroe hotite dobavit': \n";
    cin >> f;
    M.dob(f);
    cout << "Vot ON!: \n";
    M.printmassiv();
    cout << "\n";
    cout << "Vvedite iskomoe chislo: \n";
    cin >> k;
    M.search(k);
    cout << "\n";
    cout << "Vvedite nomer elementa kotoriy hotite zamenit': \n";
    cin >> y;
    cout << "Vvedite noviy element: \n";
    cin >> u;
    M.swap(y, u);
    cout << "Vot ON!: \n";
    M.printmassiv();
    cout << "\n";
    cout << "Vvedite nomer elementa kotoriy hotite udalit': \n";
    cin >> t;
    M.del(t);
    cout << "Vot ON!: \n";
    M.printmassiv();
    cout << "\n";
    printf("\n Press any key: ");
    _getch();
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
shults95
0 / 0 / 0
Регистрация: 18.02.2013
Сообщений: 28
04.03.2013, 15:57     Ошибка при добавлении элемента в динамический массив #2
попробуй так

C++
1
2
3
4
5
6
7
8
9
10
11
12
void massiv::dob(int f)
{
    int* o;
    o=max;
    delete mas;
    mas=new int[max+1];
    for (int i=0; i<max; i++)mas[i]=o[i];
    delete [] o;
    mas[max]=f;
    max=max+1;
 
}
AzgardC
7 / 7 / 0
Регистрация: 18.10.2012
Сообщений: 81
04.03.2013, 16:00  [ТС]     Ошибка при добавлении элемента в динамический массив #3
Цитата Сообщение от shults95 Посмотреть сообщение
o=max;
Вы имели ввиду
C++
1
o=mas
?
shults95
0 / 0 / 0
Регистрация: 18.02.2013
Сообщений: 28
04.03.2013, 16:03     Ошибка при добавлении элемента в динамический массив #4
точно, o=mas.
сори
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
04.03.2013, 16:03     Ошибка при добавлении элемента в динамический массив #5
Смущает функция neo. Она изменяет поле max но не производит перевыделение памяти, чтобы ее размер был max. В конструкторе по умолчанию тоже непонятно выделение нулевого объема памяти. Неужели так можно? Но последнее, возможно, и не ошибка.
AzgardC
7 / 7 / 0
Регистрация: 18.10.2012
Сообщений: 81
04.03.2013, 16:07  [ТС]     Ошибка при добавлении элемента в динамический массив #6
Цитата Сообщение от palva Посмотреть сообщение
Смущает функция neo. Она изменяет поле max но не производит перевыделение памяти, чтобы ее размер был max. В конструкторе по умолчанию тоже непонятно выделение нулевого объема памяти. Неужели так можно? Но это, возможно, и не ошибка.
Я в классах совсем новичок, но вроде бы там все норм, т.к. ошибки например при выводе массива после запси не происходит, а только при добавлении нового элемента.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
04.03.2013, 16:07     Ошибка при добавлении элемента в динамический массив #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от AzgardC Посмотреть сообщение
C++
1
2
3
4
5
massiv::massiv()
{
   max=0;
   mas=new int[max];
}
C++
1
2
3
4
5
massiv::massiv()
{
    max=0;
    mas=NULL;
}

Цитата Сообщение от AzgardC Посмотреть сообщение
C++
1
2
3
4
5
6
void massiv::neo(int *m, int Max)
{
   int i;
   max=Max;
   for (int i = 0; i < max; i++) mas[i]=m[i];
}
C++
1
2
3
4
5
6
7
8
9
10
void massiv::neo(int *m, int Max)
{
    if (max)
    {
        delete []mas;
    }
    max=Max;
    mas = new int[max];
    for (int i = 0; i < max; i++) mas[i]=m[i];
}
Цитата Сообщение от AzgardC Посмотреть сообщение
C++
1
2
3
4
void massiv::swap(int y, int u)
{
    mas[y-1]=u;
}
C++
1
2
3
4
5
void massiv::swap(int y, int u)
{
     if ((y-1) < max)
        mas[y-1]=u;
}
Цитата Сообщение от AzgardC Посмотреть сообщение
C++
1
2
3
4
5
6
void massiv::del(int t)
{
     int i;
     for (int i=t-1; i<max-1; i++)mas[i]=mas[i+1];
     max=max-1;
}
Аналогично примеру выше.
AzgardC
7 / 7 / 0
Регистрация: 18.10.2012
Сообщений: 81
04.03.2013, 16:14  [ТС]     Ошибка при добавлении элемента в динамический массив #8
shults95, Ваш способ не помог.
kazak, извините, можете пожалуйста добавить комментарии показав в чем были мои ошибки?
shults95
0 / 0 / 0
Регистрация: 18.02.2013
Сообщений: 28
04.03.2013, 16:49     Ошибка при добавлении элемента в динамический массив #9
...хотя тоже не правильно.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
04.03.2013, 19:28     Ошибка при добавлении элемента в динамический массив #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
void massiv::neo(int *m, int Max)
{
/*прежде чем что-либо записывать, нужно убедиться,
 что у нас имеется достаточно места для записи*/   
    if (max)   // проверяем массив на пустоту
    {
        delete []mas;   // если массив не пустой, освобождаем занимаемую им память
    }
    max=Max;
    mas = new int[max]; // выделяем память в нужном для выполнения функции объеме
    for (int i = 0; i < max; i++) mas[i]=m[i];
}
C++
1
2
3
4
5
6
void massiv::swap(int y, int u)
{
     if ((y-1) < max) // банальная проверка, что заданный элемент есть в массиве
                           // желательно еще предусмотреть какую-нибудь обработку ошибок
        mas[y-1]=u;
}
Добавлено через 1 минуту
Кстати, в функции добавления элемента в массив, выделяется память для временного хранения старого массива, а вот в конце функции эта память не освобождается, нехорошо.(
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2013, 19:31     Ошибка при добавлении элемента в динамический массив
Еще ссылки по теме:

Программа вылетает при добавлении элемента C++
C++ Динамический массив. Ошибка при выполнении программы
Ошибка при добавлении элемента в связный список C++

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

Или воспользуйтесь поиском по форуму:
AzgardC
7 / 7 / 0
Регистрация: 18.10.2012
Сообщений: 81
04.03.2013, 19:31  [ТС]     Ошибка при добавлении элемента в динамический массив #11
kazak, Спасибо огромное!

Добавлено через 1 минуту
Цитата Сообщение от kazak Посмотреть сообщение
Кстати, в функции добавления элемента в массив, выделяется память для временного хранения старого массива, а вот в конце функции эта память не освобождается, нехорошо.(
Исправил) Спасибо)
Yandex
Объявления
04.03.2013, 19:31     Ошибка при добавлении элемента в динамический массив
Ответ Создать тему
Опции темы

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