С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
AzgardC
7 / 7 / 0
Регистрация: 18.10.2012
Сообщений: 81
#1

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

04.03.2013, 15:42. Просмотров 517. Ответов 10
Метки нет (Все метки)

Всем привет! Создал класс для работы с дин.массивом. Нормально компилируется и выводит массив, но когда добавляю новый элемент, выдает ошибку. Подскажите, пожалуйста, в чем может быть проблема. Буду очень благодарен!
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();
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2013, 15:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при добавлении элемента в динамический массив (C++):

Ошибка при добавлении элемента в список - C++
Первый элемент всегда выводится правильно, у второго почему-то портится указатель. Третий вообще куда-то исчезает. Структура: struct...

Ошибка при добавлении элемента в связный список - C++
Помогите найти ошибку в программе,добавляю элементы в связный список,и если использую второй push_back он его добавляет,даже делает...

Ошибка при добавлении элемента в конец дека - C++
2 игрока берут из своих колод по 1-й карте. Т.е. достают элемент дека из начала дека. В данном случае пока неважно сколько раз это...

Ошибка при вводе в динамический двумерный массив - C++
заполнить матрицу не могу. ошибка где то от 19 до 24 строки. #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;math.h&gt; #include...

Динамический массив. Ошибка при выполнении программы - C++
Программа должна предоставить заполнение массива пользователю, а дальше вывести массив на экран. (Массив динамический) При компиляции...

Почему не вылетает ошибка при выделении памяти под динамический массив, размером 100 Гб? - C++
Здравствуйте, знатоки! Столкнулся с проблемой выделения памяти под динамические массивы. При создании массива более программа вылетает...

10
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;
 
}
0
AzgardC
7 / 7 / 0
Регистрация: 18.10.2012
Сообщений: 81
04.03.2013, 16:00  [ТС] #3
Цитата Сообщение от shults95 Посмотреть сообщение
o=max;
Вы имели ввиду
C++
1
o=mas
?
0
shults95
0 / 0 / 0
Регистрация: 18.02.2013
Сообщений: 28
04.03.2013, 16:03 #4
точно, o=mas.
сори
0
palva
2694 / 1921 / 288
Регистрация: 08.06.2007
Сообщений: 7,072
Записей в блоге: 4
04.03.2013, 16:03 #5
Смущает функция neo. Она изменяет поле max но не производит перевыделение памяти, чтобы ее размер был max. В конструкторе по умолчанию тоже непонятно выделение нулевого объема памяти. Неужели так можно? Но последнее, возможно, и не ошибка.
0
AzgardC
7 / 7 / 0
Регистрация: 18.10.2012
Сообщений: 81
04.03.2013, 16:07  [ТС] #6
Цитата Сообщение от palva Посмотреть сообщение
Смущает функция neo. Она изменяет поле max но не производит перевыделение памяти, чтобы ее размер был max. В конструкторе по умолчанию тоже непонятно выделение нулевого объема памяти. Неужели так можно? Но это, возможно, и не ошибка.
Я в классах совсем новичок, но вроде бы там все норм, т.к. ошибки например при выводе массива после запси не происходит, а только при добавлении нового элемента.
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
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;
}
Аналогично примеру выше.
1
AzgardC
7 / 7 / 0
Регистрация: 18.10.2012
Сообщений: 81
04.03.2013, 16:14  [ТС] #8
shults95, Ваш способ не помог.
kazak, извините, можете пожалуйста добавить комментарии показав в чем были мои ошибки?
0
shults95
0 / 0 / 0
Регистрация: 18.02.2013
Сообщений: 28
04.03.2013, 16:49 #9
...хотя тоже не правильно.
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
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 минуту
Кстати, в функции добавления элемента в массив, выделяется память для временного хранения старого массива, а вот в конце функции эта память не освобождается, нехорошо.(
1
AzgardC
7 / 7 / 0
Регистрация: 18.10.2012
Сообщений: 81
04.03.2013, 19:31  [ТС] #11
kazak, Спасибо огромное!

Добавлено через 1 минуту
Цитата Сообщение от kazak Посмотреть сообщение
Кстати, в функции добавления элемента в массив, выделяется память для временного хранения старого массива, а вот в конце функции эта память не освобождается, нехорошо.(
Исправил) Спасибо)
0
04.03.2013, 19:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2013, 19:31
Привет! Вот еще темы с ответами:

Создать динамический массив (Если чётных чисел больше, то массив должен быть укорочен на 2 элемента) - C++
Создать динамический массив из 8 случайных целых чисел из отрезка и вывести его на экран . Если в массиве чётных чисел оказалось...

Программа вылетает при добавлении элемента - C++
Написал программу Car, в которой реализовал функции Add и Delete нового авто, только из-за какого-то исключения нарушаются права доступа и...

Программа вылетает при добавлении элемента - C++
Здравствуйте ув. форумчане. Есть у меня в программе массив первого и второго типа. При начальном создание (мы выбераем сами количество...

Ошибка при вызове функции добавления нового элемента в массив - C++
Описывается класс Datchik. Затем в классе Lists объявляется массив объектов класса датчик и описывается функция NewDatchik добавления...


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

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

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