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

Ошибка после удаления элемента из массива - C++

Восстановить пароль Регистрация
 
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
19.12.2013, 20:17     Ошибка после удаления элемента из массива #1
После функции Delete выводится уже далеко не то, что должно было остаться, компилятор не пишет ничего вразумительного. В чем ошибка?
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
#include "stdafx.h"
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
#include <conio.h>
 
template <class Type>
class Array
{
private:
    Type *theArray;
    int size;
    Type operator[](int n) const; // возвращает значение элемента с порядковым номером n
public:
    Array(); // конструктор по умолчанию
    Array(Type); // конструктор по значению информационного поля
    Array(const Array &); // конструктор-копировщик
    ~Array(); // деструктор
    int GetSize() const; // возвращает размер массива
    void operator += (Type value); // добавляет в конец элемент value
    void Print() const; // выводит на экран
    void Add(Type value); // добавляет в конец элемент value
    int Find(Type value) const; // находит номер элемента (номера начиная с 1), если такого элемента нет, 0
    void Delete(int); // удаляет элемент с заданным номером (номера начиная с 1)
};
 
int main()
{
    Array<int> a(5); // инициализируем массив элементом 5
    a += 6; // добавляем элемент 6
    a.Add(7); // добавляем элемент 7
    a.Print(); // выводим на экран
    cout << "Nomer elementa '7': " << a.Find(7) << endl;
    cout << "Nomer elementa '3': " << a.Find(3) << endl;
    cout << "Udalim element nr.2..." << endl;
    a.Delete(2);
    a.Print();
    getch();
    return 0;
}
 
template <class Type> // конструктор по умолчанию
Array<Type>::Array(): size(0), theArray(NULL)
{
}
 
template <class Type> // конструктор по значению информационного поля
Array<Type>::Array(Type value): size(1)
{
    theArray = new Type;
    theArray[0] = value;
}
 
template <class Type> // конструктор-копировщик
Array<Type>::Array(const Array &theObject)
{
    size = theObject.GetSize();
    theArray = new Type[size];
    for (int i = 0; i < size; i++)
        theArray[i] = theObject[i]; // и копируем все элементы
}
 
template <class Type> // возвращает размер массива
int Array<Type>::GetSize() const
{
    return size;
}
 
template <class Type> // возвращает значение элемента с порядковым номером n
Type Array<Type>::operator[](int n) const
{
    return theArray[n];
}
 
template <class Type>
void Array<Type>::operator+=(Type value)
{
    Array<Type> tmp(*this); // сохраняем текущий массив
    delete [] theArray; // освобождаем память
    size++; // увеличиваем размер
    theArray = new Type[size]; // создаем новый массив
    for (int i = 0; i < size-1; i++)
        theArray[i] = tmp[i]; // копируем уже имеющиеся элементы
    theArray[size-1] = value; // и добавляем новый
}
 
template <class Type> // деструктор
Array<Type>::~Array()
{
    delete [] theArray;
}
 
template <class Type>
void Array<Type>::Print() const
{
    cout << "Size: " << size << endl << "Array: ";
    for (int i = 0; i < size; i++)
        cout << theArray[i] << " ";
    cout << endl;
}
 
template <class Type>
void Array<Type>::Add(Type value)
{
    Array<Type> tmp(*this); // сохраняем текущий массив
    delete [] theArray; // освобождаем память
    size++; // увеличиваем размер
    theArray = new Type[size]; // создаем новый массив
    for (int i = 0; i < size-1; i++)
        theArray[i] = tmp[i]; // копируем уже имеющиеся элементы
    theArray[size-1] = value; // и добавляем новый
}
 
template <class Type>
int Array<Type>::Find(Type value) const
{
    for (int i = 0; i < size; i++)
        if (theArray[i] == value)
            return i+1;
    return 0;
}
 
template <class Type>
void Array<Type>::Delete(int n)
{
    if ((n < 1) || (n > size))
        return;
    Array<Type> tmp;
    for (int i = 0; i < size; i++)
        if (i != n-1)
            tmp.Add(theArray[i]);
    delete [] theArray;
    size--;
    for (int i = 0; i < size; i++)
        theArray[i] = tmp[i];
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2013, 20:17     Ошибка после удаления элемента из массива
Посмотрите здесь:

программа для удаления элемента из массива (пояснить принцип работы) C++
C++ Реализовать приложение, содержащее функции добавления нового элемента в массив и удаления элемента из массива. (Имитируется “резиновый” массив)
После каждого четного элемента массива вставить два элемента с тем же значением, после чего полученный массив отсортировать по убыванию C++
C++ Функция удаления элемента из дерева, ошибка в коде
После каждого четного элемента массива вставить 2 элемента с тем же значением, полученный массив отсортировать C++
C++ Алгоритм удаления элемента из массива
C++ Функция для удаления элемента в двумерном динамическом массиве. В чем ошибка?
Объясните код удаления элемента массива C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Surgery
3 / 3 / 0
Регистрация: 28.09.2013
Сообщений: 32
19.12.2013, 20:21     Ошибка после удаления элемента из массива #2
C++
1
   delete [] theArray;
Освободил память и отдал ее системе
C++
1
        theArray[i] = tmp[i];
А затем пытаешься писать в нее что то
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
19.12.2013, 20:49  [ТС]     Ошибка после удаления элемента из массива #3
Аа, блин, точно)) Спасибо)

Добавлено через 27 минут
Surgery, такой вопрос, почему со string это не работает?
C++
1
2
3
4
5
6
7
8
9
10
11
        cout << "Massiv string" << endl;
    Array<string> c("Stroka1");
    c += "Stroka2";
    c.Add("Stroka3");
    c.Print();
    cout << "Nomer elementa 'Stroka1': " << c.Find("Stroka1") << endl;
    cout << "Nomer elementa 'Stroka': " << c.Find("Stroka") << endl;
    cout << "Udalim element nr.2..." << endl;
    c.Delete(2);
    c.Print();
    getch();
Возникает ошибка в операторе +=, при удалении массива, почему?
Yandex
Объявления
19.12.2013, 20:49     Ошибка после удаления элемента из массива
Ответ Создать тему

Метки
класс, удаление, шаблон
Опции темы

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