Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
 Аватар для Gubila_2000
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1

Ошибки во время работы деструкторов

07.03.2019, 18:14. Показов 3641. Ответов 47

Студворк — интернет-сервис помощи студентам
Здравствуйте. Я давно не писал на плюсах, поэтому мог подзабыть как работать с указателями.

В общем есть 2 класса.

Первый хранит массив и его параметры

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Word
{
   int *word;
   double *vector;
   int sizeWord;
   int sizeVector;
   
   Word(int *word=nullptr, double *vector = nullptr);
   ~Word();
              
 
}
 
Word::~Word()
{
     if (this->word)
          delete [] word;
     if (this->vector)
          delete [] this->vector;
}
Второй хранит массив указателей на этот класс с другими параметрами

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class WordList
{
      Word *words;
 
      WordList(Word *words = nullptr);
      ~WordList();
}
 
WordList:~WordList()
{
       if (this->words)
           delete []  this->words;
}
И есть внешняя функция, которая создает второй класс, проводит вычислительные операции и удаляется.

C++
1
2
3
4
5
6
void main()
{
    WordList *wl = new WordList();
    int result = wl->calc();
    delete wl;
}
Программа вылетает когда запускается деструктор класса Word на строчке удаления его массива. Если же я удаляю код во всех деструкторах, то программа работает правильно, а класс все считает.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.03.2019, 18:14
Ответы с готовыми решениями:

Ошибки в программе с использованием конструкторов/деструкторов
Приветы Есть код: #include <iostream> #include <cmath> #include <stdlib.h>

Ошибки во время работы
После случайного удаления папки gridlayout_v7 и других манипуляций, при запуске вылетает куча ошибок: 05-13 23:24:35.188:...

Стали выпадать ошибки разных приложений во время работы
Здравия желаю, коллеги! На предприятии ПК с рабочей базой 1С в сети живёт в режиме 24/7 бухгалтер в течении дня работает, недавно...

47
 Аватар для Gubila_2000
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1
08.03.2019, 10:28  [ТС]
Студворк — интернет-сервис помощи студентам
_stanislav, мне почему-то казалось, что удаление nullptr через delete[] вызовет критическую ошибку.

L0M, я плюсы в свое время учил по Страуструпу, он еще изощреннее поступал, обращаясь не через this, а через ClassName::var;
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
08.03.2019, 15:40
Цитата Сообщение от Gubila_2000 Посмотреть сообщение
обращаясь не через this, а через ClassName::var
Не путайте. ClassName::var - это статический член класса. Это совсем другое. К статическому члену, как раз, нельзя обратиться через this.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
08.03.2019, 16:31
Цитата Сообщение от L0M Посмотреть сообщение
Не путайте. ClassName::var - это статический член класса.
или замещенное поле базового класса?
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
08.03.2019, 17:21
Цитата Сообщение от _stanislav Посмотреть сообщение
или замещенное поле базового класса?
Ну да, может быть.
Ещё, как вариант, квалификация одноимённых полей при множественном наследовании.

Но, согласитесь, это экзотика.
0
 Аватар для Gubila_2000
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1
16.03.2019, 13:32  [ТС]
L0M, вот как сейчас помню, он таким способом точно пользовался, чтобы инициализировать переменные в конструкторе, задавая параметры конструктора с такими же именами, как и переменные класса.

Решил, все таки, ограничиться минимумом указателей и написать свой класс вектора, частично который я позаимствовал из описанных примеров на этом форуме. Но на этом мои проблемы полностью не решились и я все так же испытываю трудности с деструкторами. Я раньше предполагал, что если параметры функции не передавать по указателю или адресу, то они должны копироваться и создавать временные переменные пока работают функций, однако сейчас я в этом засомневался. Основная проблема заключается в том, что когда мой объект Word пройдет сквозь несколько функций, даже если его передавать как const, при выходе из функций полностью ломается ссылаясь на не инициализированные данные.

Проходит вот такая последовательность команд

WordList::WordList() -> инициализация внешнего объекта и переход в обработку массива текста
WordList::textProcessing() -> выделили слово типа Word и отправили на добавление в Vec<Word>
WordList::AddWord() -> получили слово в правильном формате, проверили нет ли такого слова в словаре и отправили в вектор
Vec<Word>:ush_back() -> получили на вход не искаженное слово защищенное припиской const и добавили в массив
WordList::AddWord() -> выходим из push_back() и отправленное слово у нас стало ссылаться непонятно на что, вектор имеет отрицательные переменные size и cap, а data ссылается непонятно на что со значением 0xfeeefeeefeeefeee
Далее программа крашится при попытке удалить поломавшееся слово по выходу из функции
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
//vec.h
 
template <class T>
class Vec
{
    T *data;
    int size;
    int cap;
public:
    Vec(int);
    Vec(void);
    Vec(Vec&);
    Vec operator=(const Vec&);
    Vec operator=(const Vec*);
    bool operator==(const Vec&);
    T getVal(const int &i);
    Vec getAll();
    void set(const int &i, T val);
    void set(Vec<T> v);
    int Capacity() const;
    int Size() const;
    T& operator [](int);
    bool operator==(int);
    void push_back(const T);
    void clear();
    void create(const int &i);
    void remove(const int &i);
    void resize(const int &n);
    ~Vec(void);
 
};
 
template <class T>
void Vec<T>::push_back(const T val) {
 
    T nVal(val);
    int s = this->size, c = this->cap;
    if (s >= c) {
        T* newdata;
        cap = cap * 2;
        newdata = new T[cap];
        for (int i = 0; i < size; i++)
            newdata[i] = data[i];
        delete[] data;
        data = newdata;
    }
    data[size] = nVal;
    size++;
}
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
//wordlist.h
class Word {
    int id;
    Vec<int> *word;
    int instance;
    Vec<double> *vec;
 
 
public:
    Word(void);
    Word(Vec<int> word);
    Word(int ch);
    Word(const Word&);
    ~Word();
    Word& operator=(const Word &w);
    bool operator==(const Word &w);
    Vec<int> get();
    int getC(const int &i);
 
    void set(Vec<int> newWord);
    void setID(const int &id);
    int getID();    
    void addChar(int ch);
    void delChar(const int &i);
    void setVec(Vec<double> vec);
    int getWLength(const int *word = nullptr);
    int getVLength();
    void addInstance();
    void decInstance();
 
private:
    void deleteWord();
    void deleteVec();
};
 
class WordList
{
    Vec<Word> *words;
    Vec<Sentence> *sentences;
    TypeWords language;
    TypeWords type_tokens;
    bool other_chars;
    int chars_interval[2];
    TypeWords encoding;
 
 
public:
    WordList(Vec<int> &text, TypeWords encoding = TypeWords::UTF8, TypeWords language = TypeWords::RUS,
        TypeWords type_tokens = TypeWords::Chars, bool other_chars = false);
 
    ~WordList();
 
    Word GetWord(const int &i);
    void AddWord(Word word, const bool &sort = true);
    void SetWord(const int &i, Word* word);
    void DelWord(const int &i);
    int* getX(const int &i);
    int* getY(const int &i);
    int GetSizeXY();
    int GetSizeVocab();
 
    void Clear();
    bool CheckWord(Word word);
    void CodingText(int*);
    int Size();
 
private:
    //void AddXY(int *x, int *y);
    void Sort();
    void setupLanguage(const TypeWords &language, const TypeWords &encoding,
        const TypeWords &type_tokens, const bool &other_chars);
    void textProcessing(Vec<int> text);
    // void deleteWords();
};
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
//wordlist.cpp
void WordList::textProcessing(Vec<int> text)
{
 
    for (int i=0; i<text.Size(); i++)
    {
 
        Vec<int> nw;
        nw.push_back(text[i]);
        bool first = true;
        while (text[i] >= this->chars_interval[0] && text[i] <= this->chars_interval[1]
               && i<text.Size())
        {
            if (!first){
                nw.push_back(text[i]);
                i++;
            }
            else {
                i++;
                first = false;
            }
 
        }
        Word nWord(nw);
        AddWord(nWord, false);       
    }
    // Sort();
}
 
void WordList::AddWord(Word word, const bool &sort)
{
    bool f = false;
    for (int i = 0; i < this->words->Size(); i++)
        if (this->words->getVal(i) == word) {
            f = true;
            break;
    }
 
 
    if (!f) this->words->push_back(word); // вот здесь word ломается
// программа крашится при попытке уничтожить переменную word
 
}
Хочу обратить ваше внимание, что переменная ломается не из за функции push_back, а из за количества вложеностей функций, независимо от того куда я ее отправляю в качестве параметра назад она уже не возвращается.
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
16.03.2019, 13:42
Gubila_2000, скорее всего накосячил с конструктором копирования или с копирующим присваиванием, и у тебя delete дважды по одному адресу
0
 Аватар для Gubila_2000
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1
16.03.2019, 13:47  [ТС]
zayats80888, меня больше возмущает тот факт, что я переменную типа Word отравляю в функцию как константу, а она возвращается оттуда поломанной, несмотря на то, что в функциях выше по вложенности она вполне успешно копировалась.

вот ее оператор копирования
C++
1
2
3
4
5
6
7
8
9
10
11
Word& Word::operator=(const Word &w)
{
    this->id = w.id;
    //delete this->word;
    this->word = w.word;
    //delete this->vec;
    this->vec = w.vec;
    this->instance = w.instance;
 
    return *this;
}
вот у вектора
C++
1
2
3
4
5
6
7
8
9
10
11
12
Vec<T> Vec<T>::operator=(const Vec&a)
{
    if (this->size)
        delete[] this->data;
    this->size = a.size;
    this->cap = a.cap;
    this->data = new T[this->cap];
    for (int i = 0; i != this->size; ++i) {
        this->data[i] = a.data[i];
    }
    return *this;
}
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
16.03.2019, 13:57
покажи реализацию Word(const Word&)

Добавлено через 3 минуты
Цитата Сообщение от Gubila_2000 Посмотреть сообщение
вот ее оператор копирования
ну так ты копируешь указатель, в итоге у тебя два объекта Word ссылаются на одни и те же данные

Добавлено через 1 минуту
вот в векторе правильно
0
 Аватар для Gubila_2000
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1
16.03.2019, 13:59  [ТС]
zayats80888,
C++
1
2
3
4
5
6
7
8
9
Word::Word(const Word &w)
{
    this->id = w.id;
    this->instance = w.instance;
    this->word = new Vec<int>();
    this->word = w.word;
    this->vec = new Vec<double>();
    this->vec = w.vec;
}
покажите, пожалуйста, как исправить, чтобы я мог вообще забить на указатели и передавать объекты в функции как обычные переменные, либо как константы по адресу.

забыл еще вот это показать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <class T>
Vec<T> Vec<T>::operator=(const Vec&a)
{
    if (this->size)
        delete[] this->data;
    this->size = a.size;
    this->cap = a.cap;
    this->data = new T[this->cap];
    for (int i = 0; i != this->size; ++i) {
        this->data[i] = a.data[i];
    }
    return *this;
}
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
16.03.2019, 14:07
Цитата Сообщение от Gubila_2000 Посмотреть сообщение
забыл еще вот это показать
не забыл, показал выше.
Цитата Сообщение от Gubila_2000 Посмотреть сообщение
покажите, пожалуйста, как исправить, чтобы я мог вообще забить на указатели и передавать объекты в функции как обычные переменные, либо как константы по адресу.
ну так замени указатели на переменные
0
 Аватар для Gubila_2000
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1
16.03.2019, 14:09  [ТС]
Так. не, оператор коперирования вектора я тот же самый скинул, не ищите различия. Внутри копирования Word должен срабатывать оператор копирования Vec, я это хотел сказать

Добавлено через 1 минуту
Цитата Сообщение от zayats80888 Посмотреть сообщение
ну так замени указатели на переменные
Я пытался так сделать, но терялся в догадках когда происходит их инициализация и боялся, что объекты будут использованы до их инициализации. Хорошо, сейчас попробую везде убрать указатели, кроме как внутри класса Vec. Посмотрю что из этого выйдет
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
16.03.2019, 14:21
ну или так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Word& Word::operator=(const Word &w)
{
    this->id = w.id;
    delete this->word;
    word=new Vec<int>;
    *word=*(w.word);
    delete this->vec;
    vec = new Vec<double>;
    *vec=*(w.vec);
    this->instance = w.instance;
 
    return *this;
}
0
 Аватар для Gubila_2000
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1
16.03.2019, 14:28  [ТС]
Снял со всех объектов указатели и теперь крашится деструктор Vec.
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
16.03.2019, 14:30
реализацию класса vec в студию
0
 Аватар для Gubila_2000
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1
16.03.2019, 14:31  [ТС]
Вот его полный код

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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#ifndef VEC_H
#define VEC_H
#pragma once
 
 
 
template <class T>
class Vec
{
    T *data;
    int size;
    int cap;
public:
    Vec(int);
    Vec(void);
    Vec(Vec&);
    Vec operator=(const Vec&);
    Vec operator=(const Vec*);
    bool operator==(const Vec&);
    T getVal(const int &i);
    Vec getAll();
    void set(const int &i, T val);
    void set(Vec<T> v);
    int Capacity() const;
    int Size() const;
    T& operator [](int);
    bool operator==(int);
    void push_back(const T);
    void clear();
    void create(const int &i);
    void remove(const int &i);
    void resize(const int &n);
    ~Vec(void);
 
};
 
 
template <class  T>
Vec<T>::Vec(void)
{
    size = 0;
    cap = 1;
    data = new T[1];
}
 
template <class  T>
Vec<T>::Vec(int n)
{
    size = 0;
    cap = n;
    data = new T[n];
}
 
template <class  T>
Vec<T>::~Vec(void)
{
    if(this->size)
        delete[] data;
}
 
template <class  T>
int Vec<T>::Size(void) const
{
    return size;
}
 
template <class  T>
T& Vec<T>::operator[](int i)
{
    return data[i];
}
 
template <class T>
Vec<T> Vec<T>::operator=(const Vec&a)
{
    if (this->size)
        delete[] this->data;
    this->size = a.size;
    this->cap = a.cap;
    this->data = new T[this->cap];
    for (int i = 0; i != this->size; ++i) {
        this->data[i] = a.data[i];
    }
    return *this;
}
 
template <class T>
Vec<T> Vec<T>::operator=(const Vec *a)
{
    if (this->size)
        delete[] this->data;
    this->size = a->size;
    this->cap = a->cap;
    this->data = new T[this->cap];
    for (int i = 0; i != this->size; ++i) {
        this->data[i] = a->data[i];
    }
    return *this;
}
 
 
template <class T>
bool Vec<T>::operator==(const Vec&v)
{
    if (this->size == v.size)
    {
        for (int i = 0; i < this->size; i++)
        {
            if (this->data[i] != v.data[i])
                return false;
        }
        return true;
    }
    else {
        return  false;
    }
}
 
template <class T>
Vec<T>::Vec(Vec &a) {
    this->size = a.Size();
    this->cap = a.Capacity();
    this->data = new T[this->cap];
    for (int i = 0; i != a.size; ++i) {
        this->data[i] = a.data[i];
    }
}
 
template <class T>
void Vec<T>::push_back(const T val) {
 
    T nVal(val);
    int s = this->size, c = this->cap;
    if (s >= c) {
        T* newdata;
        cap = cap * 2;
        newdata = new T[cap];
        for (int i = 0; i < size; i++)
            newdata[i] = data[i];
        delete[] data;
        data = newdata;
    }
    data[size] = nVal;
    size++;
}
 
template <class  T>
int Vec<T>::Capacity() const
{
    return cap;
}
 
template <class  T>
void Vec<T>::remove(const int &i)
{
    T* newdata = new T[cap];
    bool f = false;
 
    for (int j = 0; j < this->size; j++)
    {
        if (j == i)
        {
            f = true;
        }
        if (f)
        {
            newdata[j - 1] = this->data[j];
        }
        else {
            newdata[j] = this->data[j];
        }
    }
    this->size -= 1;
    delete[] this->data;
    this->data = newdata;
}
 
template <class  T>
void Vec<T>::resize(const int &n)
{
    T* newdata = new T[n];
    this->cap = n;
    this->size = n > this->size ? this->size : n;
    for (int i = 0; i < this->size; i++)
    {
        newdata[i] = this->data[i];
    }
    delete[] this->data;
    this->data = newdata;
}
 
template <class  T>
void Vec<T>::clear()
{
    delete[] this->data;
    this->size = 0;
    this->cap = 1;
    this->data = new T[1];
}
 
template <class  T>
void Vec<T>::create(const int &i) {
    if (this->data)
        delete[] this->data;
    size = 0;
    cap = i;
    data = new T[i];
}
 
template <class  T>
T Vec<T>::getVal(const int &i)
{
    T ret = this->data[i];
    return ret;
}
 
template <class  T>
Vec<T> Vec<T>::getAll()
{
    return this;
}
 
template <class  T>
void Vec<T>::set(const int &i, T val)
{
    this->data[i] = val;
}
 
 
template <class  T>
void Vec<T>::set(Vec<T> v)
{
    delete[] this->data;
    this->size = v.Size();
    this->cap = v.Capacity();
    this->data = new T[this->cap];
    for (int i = 0; i < this->size; i++)
    {
        this->data[i] = v[i];
    }
}
 
 
 
#endif // VEC_H
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
16.03.2019, 14:58
я не тестил, но вроде норм все(единственно что в копировании принято возвращать ссылку, но то такое)

Добавлено через 9 минут
давай следующий по иерархии модуль
0
 Аватар для Gubila_2000
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1
16.03.2019, 15:33  [ТС]
zayats80888,

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
#ifndef WORDLIST_H
#define WORDLIST_H
#pragma once
 
//#include "W2V_Lib/w2v.h"
#include "W2VLib/vec.h"
 
 
 
enum TypeWords {UTF8, RUS, ENG,
               Chars};
 
 
class Word {
    int id;
    Vec<int> word;
    int instance;
    Vec<double> vec;
 
 
public:
    Word(void);
    Word(Vec<int> word);
    Word(int ch);
    Word(const Word&);
    ~Word();
    Word& operator=(const Word &w);
    bool operator==(const Word &w);
    Vec<int> get();
    int getC(const int &i);
 
    void set(Vec<int> newWord);
    void setID(const int &id);
    int getID();    
    void addChar(int ch);
    void delChar(const int &i);
    void setVec(Vec<double> vec);
    int getWLength(const int *word = nullptr);
    int getVLength();
    void addInstance();
    void decInstance();
 
private:
    void deleteWord();
    void deleteVec();
};
 
 
class Sentence {
    Vec<Word> *words;
    Vec<int> *IDs;
 
 
public:
    Sentence(void);
    ~Sentence();
 
    void addWord(Word word);
    void delWord(const int &i);
    Vec<Word> getWords();
    Vec<int> getIDs();
 
 
};
 
 
 
class WordList
{
    Vec<Word> words;
    Vec<Sentence> sentences;
    TypeWords language;
    TypeWords type_tokens;
    bool other_chars;
    int chars_interval[2];
    TypeWords encoding;
 
 
public:
    WordList(Vec<int> text, TypeWords encoding = TypeWords::UTF8, TypeWords language = TypeWords::RUS,
        TypeWords type_tokens = TypeWords::Chars, bool other_chars = false);
 
    ~WordList();
 
    Word GetWord(const int &i);
    void AddWord(Word word, const bool &sort = true);
    void SetWord(const int &i, Word* word);
    void DelWord(const int &i);
    int* getX(const int &i);
    int* getY(const int &i);
    int GetSizeXY();
    int GetSizeVocab();
 
    void Clear();
    bool CheckWord(Word word);
    void CodingText(int*);
    int Size();
 
private:
    //void AddXY(int *x, int *y);
    void Sort();
    void setupLanguage(const TypeWords &language, const TypeWords &encoding,
        const TypeWords &type_tokens, const bool &other_chars);
    void textProcessing(Vec<int> text);
    // void deleteWords();
};
 
 
#endif // WORDLIST_H
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
#include "W2VLib/wordlist.h"
#include "W2VLib/vec.h"
 
//****************************** WORD ************************************************************
 
 
Word::Word(void)
{
    /*this->wordSize = 0;
 
    this->word = nullptr;
 
 
    this->vec = nullptr;*/
    this->instance = 0;
    this->id = -1;
   // this->word = new Vec<int>();
   // this->vec = new Vec<double>();
 
 
    //this->VecSize = 0;
}
 
Word::Word(Vec<int> word)
{
 
    /*this->wordSize = getWLength(word);
 
    this->word = word;
 
 
    this->vec = nullptr;
 
    this->VecSize = 0;*/
   // this->word = new Vec<int>();
    this->word = word;
    this->instance = 0;
    this->id = -1;
    //this->vec = new Vec<double>();
 
 
}
 
Word::Word(int ch)
{
    this->word = new Vec<int>();
    this->word.push_back(ch);
    this->instance = 0;
    this->id = -1;
    //this->vec = new Vec<double>();
}
 
Word::Word(const Word &w)
{
    this->id = w.id;
    this->instance = w.instance;
    //this->word = new Vec<int>();
    this->word = w.word;
    //this->vec = new Vec<double>();
    this->vec = w.vec;
}
 
Word::~Word()
{
    // deleteWord();
    // deleteVec();
    //delete this->word;
   // delete this->vec;
}
 
Word& Word::operator=(const Word &w)
{
    this->id = w.id;
    /*deleteWord();
     this->word = new int[w.wordSize];
     for (int i =0; i<w.wordSize; i++)
         this->word[i] = w.word[i];
 
     deleteVec();
     this->Vec = new double[w.vecSize];
     for(int i =0; i<w.VecSize; i++)
     {
         this->Vec[i] = w.Vec[i];
     }
 
     this->VecSize = w.VecSize;*/
 
    //delete this->word;
    this->word = w.word;
    //delete this->vec;
    this->vec = w.vec;
    this->instance = w.instance;
 
    return *this;
}
 
bool Word::operator==(const Word &w)
{
    /*if (this->word.Size() == w.word.Size())
    {
        for (int i=0; i<this->word.Size(); i++)
        {
            if (this->word[i] == w.word[i]) return false;
        }
        return true;
    }
    else {
        return false;
    }*/
    return this->word == w.word;
}
 
int Word::getWLength(const int *word)
{
    if (word)
    {
        int len = 0;
        for (; word[len] != -1; len++);
        return len - 1;
    }
    else {
        return this->word.Size();
    }
}
 
void Word::addChar(int ch)
{
    /*int n = this->word.Size() + 1;
  int *newWord = new int[n];
 
   for (int i=0; i<n-1; i++){
       newWord[i]=word[i];
   }
   deleteWord();
   this->wordSize=n;
   newWord[n-1] = ch;
   this->word = new int[n];
   for (int i=0; i<n; i++)
       this->word[i] = newWord[i];
   //this->word = newWord;*/
    this->word.push_back(ch);
 
}
 
Vec<int> Word::get()
{
    return this->word;
}
 
 
 
void Word::set(Vec<int> newWord)
{
    //deleteWord();
    //this->word.Size() = getWLength(newWord);
    this->word.set(newWord);
}
 
void Word::setVec(Vec<double> vec)
{
    //deleteVec();
    this->vec.set(vec);
    //this->VecSize = size;
}
 
void Word::addInstance()
{
    this->instance += 1;
}
 
void Word::decInstance()
{
    this->instance -= 1;
}
 
 
 
int Word::getC(const int &i)
{
    if (i < this->word.Size()) {
        int *ret = new int();
        ret[0] = this->word.getVal(0);
        return ret[0];
    }
    else {
        return -1;
    }
}
 
//********************************** Sentence ********************************************************
 
Sentence::Sentence(void)
{
 
}
 
Sentence::~Sentence()
{
 
}
 
void Sentence::addWord(Word word)
{
 
}
 
void Sentence::delWord(const int &i)
{
 
}
 
Vec<Word> Sentence::getWords()
{
    return this->words[0];
}
 
Vec<int> Sentence::getIDs()
{
    return this->IDs[0];
}
 
//******************************** LIST **************************************************************
WordList::WordList(Vec<int> text, TypeWords encoding, TypeWords language,
    TypeWords type_tokens, bool other_chars)
{
    setupLanguage(language, encoding, type_tokens, other_chars);
    this->words = new Vec<Word>();
    textProcessing(text);
}
 
WordList::~WordList()
{
    /* deleteWords();
     int j;
     for (int i=0; i<this->sizeXY; i++){
         j=0;
         while () {
 
         }
     }*/
    //delete this->words;
 
}
 
void WordList::setupLanguage(const TypeWords &language, const TypeWords &encoding,
    const TypeWords &type_tokens, const bool &other_chars)
{
    this->encoding = encoding;
    this->language = language;
    this->type_tokens = type_tokens;
    this->other_chars = other_chars;
    switch (encoding) {
    case TypeWords::UTF8: {
        switch (language)
        {
        case TypeWords::RUS:
            this->chars_interval[0] = 1040;
            this->chars_interval[1] = 1103;
            break;
        case TypeWords::ENG:
            this->chars_interval[0] = 65;
            this->chars_interval[1] = 122;
            break;
 
        }
        break;
    }
    }
 
}
 
void WordList::textProcessing(Vec<int> text)
{
 
    for (int i=0; i<text.Size(); i++)
    {
 
        Vec<int> nw;
        nw.push_back(text[i]);
        bool first = true;
        while (text[i] >= this->chars_interval[0] && text[i] <= this->chars_interval[1]
               && i<text.Size())
        {
            if (!first){
                nw.push_back(text[i]);
                i++;
            }
            else {
                i++;
                first = false;
            }
 
        }
        Word nWord(nw);
        AddWord(nWord, false);       
    }
    // Sort();
}
 
 
 
void WordList::AddWord(Word word, const bool &sort)
{
    bool f = false;
    for (int i = 0; i < this->words.Size(); i++)
        if (this->words.getVal(i) == word) {
            f = true;
            break;
    }
    if (!f) this->words.push_back(word);
}
 
Word WordList::GetWord(const int &i)
{
    /*Word *word = new Word();
    word[0] = this->words[i];*/
 
    return this->words.getVal(i);
}
 
void WordList::Sort()
{
 
}
 
int WordList::Size()
{
    return this->words.Size();
}
/*
void WordList::deleteWords()
{
    if (this->words)
    {
        delete [] this->words;
        this->words = nullptr;
    }
 
}*/
 
bool WordList::CheckWord(Word word)
{
    /*if (this->words)
    {
        bool f=false;
        for (int i =0; i<this->words.Size(); i++)
        {
            if (this->words[i].getWLength() == word->getWLength())
            {
                f = false;
                for (int j =0; j<word->getWLength(); j++)
                {
                    if (this->words[i].getC(j) == word->getC(j)){
                        f = true;
                    }
                    else f = false;
                }
                if (f) return f;
            }
        }
        return f;
    }
    else {
        return false;
    }*/
 
    return true;
 
}
Больше пока ничего не используется
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
16.03.2019, 15:47
Цитата Сообщение от L0M Посмотреть сообщение
К статическому члену, как раз, нельзя обратиться через this.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
 
struct Some
{
    Some() {
        this->x = 55;//ok
    }
    static int x;
};
 
int Some::x = 42;
 
int main()
{
    Some s;
    std::cout << Some::x;//55
}
Цитата Сообщение от Gubila_2000 Посмотреть сообщение
C++
1
newdata = new T[cap];
Вы уверены, что Вы пишите вектор?
0
 Аватар для Gubila_2000
7 / 3 / 3
Регистрация: 07.11.2014
Сообщений: 218
Записей в блоге: 1
16.03.2019, 16:10  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Вы уверены, что Вы пишите вектор?
Пример наброска класса вектора я брал с этого форума, и там никто ничего против не имел. Слишком усложнять алгоритм я не вижу смысла, а написал этот класс чтобы не плодить посторонние указатели, за которыми сложно уследить когда проект приобретает большие масштабы.
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
16.03.2019, 16:15
реализация Word:
стр. 46, стр. 227 - убрать
стр. 181 - зачем там выделение памяти?

и передавать крупные структуры лучше по ссылке или константной ссылке
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.03.2019, 16:15

Ноутбук все время виснет,завершение работы, не отвечает, ошибки выдает
всем привет, люди помогите пожалуйста, у меня ноутбук- все время виснет,завершение работы, не отвечает, ошибки выдает что делать? заранее...

На моем компе во время установки игры часто возникают ошибки, зависания и ошибки копирования файлов с установочного диска.
Добрый вечер! На моем компе во время установки игры часто возникают ошибки, зависания и ошибки копирования файлов с установочного диска....

Посчитать время события - время работы кассиров (система массового обслуживания)
Есть программа, моделирующая следующую задачу (система массового обслуживания): В бухгалтерии предприятия имеются два кассира, каждый...

Выводить текущее время в определенные позиции консоли во время работы
Портирую консольное приложение. Есть код, который работал после компиляции в BC++ 3.1, после компиляции под MinGW GCC программа не...

Вывести время работы системы и перезагрузить её, если время превысило заданное значение
Собственно говоря нужно в powershell написать скрипт, выводящий время работы системы и отправляющий систему в перезагрузку, если время...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru