Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29

ООП. Возникает ошибка с динамической памятью

11.04.2023, 00:36. Показов 3674. Ответов 49

Студворк — интернет-сервис помощи студентам
/*Доброй ночи! Возникает ошибка с памятью в деструкторе класса Person (для двух других классов все срабатывает хорошо). Такое ощущение, что уже происходило освобождение памяти для переменных класса Person (FIO и Birthday), и она пытается освободить память по старому адресу, которого уже нет. */


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
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
//Задание. Создайте программу, имитирующую многоквартирный дом. Необходимо иметь классы “Человек”, “Квартира”, “Дом”.
//Класс “Квартира” содержит динамический массив объектов класса “Человек”. Класс “Дом” содержит массив объектов класса “Квартира”.
//Каждый из классов содержит переменные - члены и функции - члены, которые необходимы для предметной области класса.
//Обращаем ваше внимание, что память под строковые значения выделяется динамически. Например, для ФИО в классе “Человек”.
//Не забывайте обеспечить классы различными конструкторами (конструктор копирования обязателен), деструкторами.
//В main протестировать работу полученного набора классов.
 
#include <iostream>
#include <Windows.h>
#define cout std::cout
#define endl std::endl
#define cin std::cin
 
typedef unsigned short US;
 
class Person {
 
public:
    char* FIO;
    char* Birthday;
    US Age;
 
    Person() :FIO(nullptr), Birthday(nullptr), Age(0){}
    Person(char* fio, char* bday, US age) : FIO(new char[strlen(fio) + 1]), Birthday(new char[strlen(bday) + 1]), Age(age) {
        if (!FIO || !Birthday) {
            return;
        }
 
        strcpy_s(FIO, strlen(fio) + 1, fio);
        strcpy_s(Birthday, strlen(bday) + 1, bday);
    }
 
    ~Person() { 
        
        cout << "\nВызывался деструктор Person " << endl;
 
        if (FIO)
            delete[]FIO;
        FIO = nullptr; 
        if (Birthday)
            delete[]Birthday;
        Birthday = nullptr;
    }
 
    Person(const Person& an) : Age(an.Age) {
 
        if (FIO) {
            delete[]FIO; FIO = nullptr;
        }
 
        US lenfio = strlen(an.FIO) + 1;
 
        if (!lenfio) {
            return;
        }
 
        FIO = new char[lenfio];
 
        if (FIO == nullptr) {
            return;
        }
 
        strcpy_s(FIO, lenfio, an.FIO);
 
        if (Birthday) {
            delete[]Birthday; Birthday = nullptr;
        }
 
        US lenbday = strlen(an.Birthday) + 1;
 
        if (!lenbday) {
            return;
        }
 
        Birthday = new char[lenbday];
 
        if (Birthday == nullptr) {
            return;
        }
 
        strcpy_s(Birthday, lenbday, an.Birthday);
    }
 
    Person& operator = (const Person& an) {
 
        if (this == &an) {
            return *this;
        }
 
        Age = an.Age;
 
        if (FIO) {
            delete[]FIO; FIO = nullptr;
        }
 
        US lenfio = strlen(an.FIO) + 1;
 
        if (!lenfio) {
            return *this;
        }
 
        FIO = new char[lenfio];
 
        if (FIO == nullptr) {
            return *this;
        }
 
        strcpy_s(FIO, lenfio, an.FIO);
 
        if (Birthday) {
            delete[]Birthday; Birthday = nullptr;
        }
 
        US lenbday = strlen(an.Birthday) + 1;
 
        if (!lenbday) {
            return *this;
        }
 
        Birthday = new char[lenbday];
 
        if (Birthday == nullptr) {
            return *this;
        }
 
        strcpy_s(Birthday, lenbday, an.Birthday);
 
        return *this;
    }
 
    Person(Person&& an) {
 
        Age = an.Age;
        an.Age = 0;
        FIO = an.FIO;
        an.FIO = nullptr;
        Birthday = an.Birthday;
        an.Birthday = nullptr;
    }
 
    Person& operator=(Person&& an) {
 
        if (this == &an) {
            return *this;
        }
 
        if (FIO) { delete[]FIO; FIO = nullptr; }
        if (Birthday) { delete[]Birthday; Birthday = nullptr; }
 
        Age = an.Age;
        an.Age = 0;
        FIO = an.FIO;
        an.FIO = nullptr;
        Birthday = an.Birthday;
        an.Birthday = nullptr;
 
        return *this;
    }
 
    inline void Fill();
 
    inline void Print()const;
};
 
class Flat {
    Person* human;
    US size;
    US num;
    US room;
 
public: 
    Flat() : human(nullptr), size(0), num(0), room(1) {}
    Flat(US an, US n, US r) : size(an), human(new Person[size]), num(n), room(r) {}
    ~Flat() {
 
        cout << "\nВызывался деструктор Flat " << endl;
 
        if (human)
            delete[]human;
        human = nullptr;
    }
    Flat(const Flat& an) : size(an.size), human(new Person[size]), num(an.num), room(an.room) {
        if (human == nullptr) {
            return;
        }
 
        for (US i = 0; i < size; ++i) {
            human[i] = an.human[i];
        }
    }
    Flat& operator = (const Flat& an) {
        if (this == &an) {
            return *this;
        }
 
        if (human) { delete[]human; human = nullptr; }
 
        size = an.size;
        num = an.num;
        room = an.room;
 
        human = new Person[size];
        
        if (human == nullptr) {
            return *this;
        }
 
        for (US i = 0; i < size; ++i) {
            human[i] = an.human[i];
        }
 
        return *this;
 
 
    }
    Flat(Flat&& an) {
        size = an.size;
        an.size = 0;
        num = an.num;
        an.num = 0;
        room = an.room;
        an.room = 0;
        human = an.human;
        an.human = nullptr;
    }
    Flat& operator = (Flat&& an) {
        if (this == &an) {
            return *this;
        }
 
        size = an.size;
        an.size = 0;
        num = an.num;
        an.num = 0;
        room = an.room;
        an.room = 0;
        human = an.human;
        an.human = nullptr;
 
        return *this;
    }
 
    void Fill();
    inline void Print()const;
};
 
class House {
    Flat* apart;
    US size;
 
public:
    House() :apart(nullptr){}
    House(US an) : size(an), apart(new Flat[size]) {}
    ~House() {
 
        cout << "\nВызывался деструктор House " << endl;
 
        if (apart)
            delete[]apart;
        apart = nullptr;
    }
    House(const House& an) : size(an.size) {
        if (!apart) {
            apart = new Flat[size];
        }
 
        if (apart) {
 
            for (US i = 0; i < size; ++i) {
                apart[i] = an.apart[i];
            }
        }
    }
    House& operator = (const House& an) {
        if (this == &an) {
            return *this;
        }
 
        size = an.size;
 
        if (apart) { delete[]apart; apart = nullptr; }
 
        apart = new Flat[size];
 
        if (apart == nullptr) {
            return *this;
        }
 
        for (US i = 0; i < size; ++i) {
            apart[i] = an.apart[i];
        }
 
        return *this;
    }
    House(House&& an) {
        size = an.size;
        an.size = 0;
        apart = an.apart;
        an.apart = nullptr;
    }
    House& operator = (House&& an) {
        if (this == &an) {
            return *this;
        }
 
        size = an.size;
        an.size = 0;
 
        if (apart) { delete[]apart; apart = nullptr; }
 
        apart = an.apart;
        an.apart = nullptr;
 
        return *this;
    }
 
    void Fill();
    inline void Print()const;
};
 
 
int main() {
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    {
        House TestHouse;
 
        TestHouse.Fill();
 
        cout << "\n\t\t\t\t\tИнформация о доме: " << endl;
 
        TestHouse.Print();
    }
 
    system("pause");
    return 0;
}
 
inline void Person::Fill() {
 
    if (!FIO) {
 
        FIO = new char[70];
 
    }
 
    if (FIO) {
 
        cout << "\nВведите ФИО жителя: ";
        gets_s(FIO, strlen(FIO) + 1);
    }
 
    if (!Birthday) {
 
        Birthday = new char[15];
    }
 
    if (Birthday) {
        cout << "\nВведите дату его рождения (формат - ХХ.ХХ.ХХХХ) - ";
        gets_s(Birthday, strlen(Birthday) + 1);
    }
 
    if (strlen(Birthday) < 10 || strlen(Birthday) > 10) { cout << "\nОшибка ввода данных! " << endl; return; }
 
    if (!FIO || !Birthday) { return; }
 
    cout << "\nВведите возраст (полных лет. Если проживает ребенок, которому менее года, укажите 1): ";
    cin >> Age;
    cin.get();
 
    if (Age < 1 || Age > 120) {
 
        cout << "\nОшибка ввода данных! " << endl;
        return;
    }
 
    cout << endl;
 
}
 
inline void Person::Print()const {
 
    if (!FIO || !Birthday) { return; }
 
    cout << "\nФИО жителя - " << FIO << endl;
    cout << "\nДата рождения - " << Birthday << endl;
    cout << "\nВозраст - " << Age << endl;
 
}
 
void Flat::Fill() {
    
    cout << "Введите номер квартиры: ";
    cin >> num;
    cin.get();
 
    if (num < 1 || num > 2000) { cout << "\nОшибка ввода данных! " << endl; return; }
 
    cout << "\nСколько человек в ней проживают? ";
    cin >> size;
    cin.get();
 
    cout << "\nСколько в ней комнат? ";
    cin >> room;
    cin.get();
 
    if (room < 1 || room > 50) { cout << "\nОшибка ввода данных! " << endl; return; }
 
    if (!human) {
 
        human = new Person[size];
    }
 
    if (human == nullptr) {
 
        return;
    }
 
    cout << endl;
 
    for (US i = 0; i < size; ++i) {
        cout << i + 1 << ") ";
        human[i].Fill();
    }
    
 
}
 
inline void Flat::Print()const {
 
    cout << "\nНомер квартиры: " << num << ", квартира " << room << "-комнатная, в ней проживает - " << size << " чел. " << endl;
 
    if (human) {
 
        for (US i = 0; i < size; ++i) {
 
            cout << "\n" << i + 1 << ") " << endl;
            human[i].Print();
            cout << endl;
        }
    }
 
}
 
void House::Fill() {
 
    cout << "Сколько квартир в вашем доме? ";
    cin >> size;
    cin.get();
 
    if (size < 1 || size > 10000) { cout << "\nОшибка ввода данных! " << endl; return; }
 
    if (!apart) {
 
        apart = new Flat[size];
    }
 
    system("cls");
 
    for (US i = 0; i < size; ++i) {
        cout << "Введите данные о " << i + 1 << "-й квартире: " << endl << endl;
        apart[i].Fill();
        system("pause");
        system("cls");
    }
}
 
inline void House::Print()const {
 
    cout << "\nКвартир в доме - " << size << endl;
 
    if (apart) {
 
        for (US i = 0; i < size; ++i) {
            apart[i].Print();
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.04.2023, 00:36
Ответы с готовыми решениями:

Ошибка с динамической памятью
Очень прошу помочь исправить ошибку в области дин.памяти. Проблема: 1. Шаг Создаю массив для записи 2. Шаг удаляю элемент под...

Почему у меня возникает ошибка с памятью (sigsegv)?
почему у меня возникает ошибка с памятью? Код прилагаю #include&lt;iostream&gt; #include&lt;vector&gt; using namespace std; vector&lt;int&gt;...

Ошибка в коде при работе с динамической памятью
Не могу понят что не так ? При вводе в динамический массив А последовательность &quot;61 3 2 0 -2 -25 -61 -70&quot; программа крашится...

49
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
12.04.2023, 02:18  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Сыр-бор был и-за ненужного delete внутри конструктора, который пытался освободить несуществующую память. А проверка, которая как бы должна была от этого защищать, не срабатывала, потому что фактически проверяла "мусор".

Странно что-то, я вроде все убрал, сделал, как вы сказали, но все равно выдает ошибку в том же месте. В деструкторе класса Person.


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
#include <iostream>
#include <Windows.h>
using std::cout;
using std::endl;
using std::cin;
 
typedef unsigned short US;
 
class Person {
    char* FIO;
    char* Birthday;
    US Age;
 
public:
    
    Person() :FIO(nullptr), Birthday(nullptr), Age(0){}
    Person(const char* fio, const char* bday, US age) : FIO(new char[strlen(fio) + 1]), Birthday(new char[strlen(bday) + 1]), Age(age) {
        
        strcpy_s(FIO, strlen(fio) + 1, fio);
        strcpy_s(Birthday, strlen(bday) + 1, bday);
    }
 
    ~Person() { 
 
        delete[]FIO;
        delete[]Birthday;
 
    }
 
    Person(const Person& an) : Age(an.Age) {
 
 
        US lenfio = strlen(an.FIO) + 1;
 
        if (lenfio == 1) {
            return;
        }
 
        FIO = new char[lenfio];
 
        strcpy_s(FIO, lenfio, an.FIO);
 
        US lenbday = strlen(an.Birthday) + 1;
 
        if (lenbday == 1) {
            return;
        }
 
        Birthday = new char[lenbday];
 
        strcpy_s(Birthday, lenbday, an.Birthday);
    }
 
    Person& operator = (const Person& an) {
 
        if (this == &an) {
            return *this;
        }
 
        /*Age = an.Age;
 
        delete[]FIO;
 
        US lenfio = strlen(an.FIO) + 1;
 
        if (lenfio == 1) {
            return *this;
        }
 
        FIO = new char[lenfio];
 
        strcpy_s(FIO, lenfio, an.FIO);
 
        delete[]Birthday;
 
        US lenbday = strlen(an.Birthday) + 1;
 
        if (lenbday == 1) {
            return *this;
        }
 
        Birthday = new char[lenbday];
 
        strcpy_s(Birthday, lenbday, an.Birthday);*/
 
        Person(an).Swap(*this);
 
        return *this;
    }
 
    Person(Person&& an) : FIO(nullptr), Birthday(nullptr), Age(0) {
 
        an.Swap(*this);
    }
 
    Person& operator=(Person&& an) {
 
        if (this == &an) {
            return *this;
        }
 
        an.Swap(*this);
 
        return *this;
    }
 
    inline void Fill();
 
    inline void Print()const;
 
    inline void Swap(Person& an) {
 
        std::swap(FIO, an.FIO);
        std::swap(Birthday, an.Birthday);
        std::swap(Age, an.Age);
    }
};
 
class Flat {
    Person* human;
    US size;
    US num;
    US room;
 
public: 
    Flat() : human(nullptr), size(0), num(0), room(1) {}
    Flat(US an, US n, US r) : human(new Person[size]), size(an), num(n), room(r) {}
    ~Flat() {
 
        delete[]human;
 
    }
 
    Flat(const Flat& an) : human(new Person[size]), size(an.size), num(an.num), room(an.room) {
        
        for (US i = 0; i < size; ++i) {
            human[i] = an.human[i];
        }
    }
 
    Flat& operator = (const Flat& an) {
 
        if (this == &an) {
            return *this;
        }
 
        Flat(an).Swap(*this);
 
        return *this;
 
 
    }
 
    Flat(Flat&& an): human(nullptr), size(0), num(0), room(0) {
        
        an.Swap(*this);
    }
 
    Flat& operator = (Flat&& an) {
 
        if (this == &an) {
            return *this;
        }
 
        an.Swap(*this);
 
        return *this;
    }
 
    void Fill();
    inline void Print()const;
    inline void Swap(Flat& an) {
 
        std::swap(human, an.human);
        std::swap(size, an.size);
        std::swap(num, an.num);
        std::swap(room, an.room);
    }
};
 
class House {
    Flat* apart;
    US size;
 
public:
    House() :apart(nullptr){}
    House(US an) : size(an), apart(new Flat[size]) {}
    ~House() {
 
        delete[]apart;
    }
    House(const House& an) : size(an.size), apart(new Flat[size]) {
 
        if (!size) {
 
            return;
        }
 
        for (US i = 0; i < size; ++i) {
            apart[i] = an.apart[i];
        }
    }
    
    House& operator = (const House& an) {
 
        if (this == &an) {
            return *this;
        }
 
        House(an).Swap(*this);
 
        return *this;
    }
    House(House&& an): apart(nullptr), size(0) {
        
        an.Swap(*this);
 
    }
    House& operator = (House&& an) {
 
        if (this == &an) {
            return *this;
        }
 
        an.Swap(*this);
 
        return *this;
    }
 
    void Fill();
    inline void Print()const;
    inline void Swap(House&an) {
 
        std::swap(apart, an.apart);
        std::swap(size, an.size);
    }
};
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
12.04.2023, 05:19
Prang, ошибки в классе House. В коде я их отметил комментарием // ошибка .... Суть в том, что когда в классе объявляются переменные-члены класса, например:
C++
1
2
Flat* apart;
US size;
И вы хотите использовать список инициализаторов в конструкторе (например, конструктор копирования: House(House&& an): apart(nullptr), size(0)), то важно, чтобы переменные-члены класса инициализировались в том же порядке, в котором объявлены.
Проблем с порядком инициализации не будет вообще, если всю инициализацию перенести в тело конструктора. Список инициализаторов необходим для константных членов класса, для вызова конструктора базового класса. В общем у вас в этом вообще нужды не было. Вот код рабочий
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
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
#include <iostream>
#include <Windows.h>
using std::cout;
using std::endl;
using std::cin;
 
typedef unsigned short US;
 
class Person {
    char* FIO;
    char* Birthday;
    US Age;
 
public:
 
    Person() :FIO(nullptr), Birthday(nullptr), Age(0){}
    Person(const char* fio, const char* bday, US age) : FIO(new char[strlen(fio) + 1]), Birthday(new char[strlen(bday) + 1]), Age(age) {
 
        strcpy_s(FIO, strlen(fio) + 1, fio);
        strcpy_s(Birthday, strlen(bday) + 1, bday);
    }
 
    ~Person() {
 
        delete[]FIO;
        delete[]Birthday;
 
    }
 
    Person(const Person& an) : Age(an.Age) {
 
 
        US lenfio = strlen(an.FIO) + 1;
 
        if (lenfio == 1) {
            return;
        }
 
        FIO = new char[lenfio];
 
        strcpy_s(FIO, lenfio, an.FIO);
 
        US lenbday = strlen(an.Birthday) + 1;
 
        if (lenbday == 1) {
            return;
        }
 
        Birthday = new char[lenbday];
 
        strcpy_s(Birthday, lenbday, an.Birthday);
    }
 
    Person& operator = (const Person& an) {
 
        if (this == &an) {
            return *this;
        }
 
        /*Age = an.Age;
 
        delete[]FIO;
 
        US lenfio = strlen(an.FIO) + 1;
 
        if (lenfio == 1) {
            return *this;
        }
 
        FIO = new char[lenfio];
 
        strcpy_s(FIO, lenfio, an.FIO);
 
        delete[]Birthday;
 
        US lenbday = strlen(an.Birthday) + 1;
 
        if (lenbday == 1) {
            return *this;
        }
 
        Birthday = new char[lenbday];
 
        strcpy_s(Birthday, lenbday, an.Birthday);*/
 
        Person(an).Swap(*this);
 
        return *this;
    }
 
    Person(Person&& an) : FIO(nullptr), Birthday(nullptr), Age(0) {
 
        an.Swap(*this);
    }
 
    Person& operator=(Person&& an) {
 
        if (this == &an) {
            return *this;
        }
 
        an.Swap(*this);
 
        return *this;
    }
 
    inline void Fill();
 
    inline void Print()const;
 
    inline void Swap(Person& an) {
 
        std::swap(FIO, an.FIO);
        std::swap(Birthday, an.Birthday);
        std::swap(Age, an.Age);
    }
};
 
class Flat {
    Person* human;
    US size;
    US num;
    US room;
 
public:
    Flat() : human(nullptr), size(0), num(0), room(1) {}
    Flat(US an, US n, US r) : human(new Person[size]), size(an), num(n), room(r) {}
    ~Flat() {
 
        delete[]human;
 
    }
 
    Flat(const Flat& an) : human(new Person[size]), size(an.size), num(an.num), room(an.room) {
 
        for (US i = 0; i < size; ++i) {
            human[i] = an.human[i];
        }
    }
 
    Flat& operator = (const Flat& an) {
 
        if (this == &an) {
            return *this;
        }
 
        Flat(an).Swap(*this);
 
        return *this;
 
 
    }
 
    Flat(Flat&& an): human(nullptr), size(0), num(0), room(0) {
 
        an.Swap(*this);
    }
 
    Flat& operator = (Flat&& an) {
 
        if (this == &an) {
            return *this;
        }
 
        an.Swap(*this);
 
        return *this;
    }
 
    void Fill();
    inline void Print()const;
    inline void Swap(Flat& an) {
 
        std::swap(human, an.human);
        std::swap(size, an.size);
        std::swap(num, an.num);
        std::swap(room, an.room);
    }
};
 
class House {
    // ошибка 1
    //Flat* apart;
    //US size;
 
    US size;
    Flat* apart;
 
public:
    //House() :apart(nullptr){} // ошибка 2 - size не инициализируется
    House() : size(0), apart(nullptr){}
 
    House(US an) : size(an), apart(new Flat[size]) {}
    ~House() {
 
        delete[]apart;
    }
    House(const House& an) : size(an.size), apart(new Flat[size]) {
 
        if (!size) {
 
            return;
        }
 
        for (US i = 0; i < size; ++i) {
            apart[i] = an.apart[i];
        }
    }
 
    House& operator = (const House& an) {
 
        if (this == &an) {
            return *this;
        }
 
        House(an).Swap(*this);
 
        return *this;
    }
 
    // ошибка 3
    //House(House&& an): apart(nullptr), size(0) {
    House(House&& an): size(0), apart(nullptr) {
 
        an.Swap(*this);
 
    }
    House& operator = (House&& an) {
 
        if (this == &an) {
            return *this;
        }
 
        an.Swap(*this);
 
        return *this;
    }
 
    void Fill();
    inline void Print()const;
    inline void Swap(House&an) {
 
        std::swap(apart, an.apart);
        std::swap(size, an.size);
    }
};
 
int main() {
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    {
        House TestHouse;
 
        TestHouse.Fill();
 
        cout << "\n\t\t\t\t\tИнформация о доме: " << endl;
 
        TestHouse.Print();
    }
 
    system("pause");
    return 0;
}
 
inline void Person::Fill() {
 
    if (!FIO) {
 
        FIO = new char[70];
 
    }
 
    if (FIO) {
 
        cout << "\nВведите ФИО жителя: ";
        gets_s(FIO, strlen(FIO) + 1);
    }
 
    if (!Birthday) {
 
        Birthday = new char[15];
    }
 
    if (Birthday) {
        cout << "\nВведите дату его рождения (формат - ХХ.ХХ.ХХХХ) - ";
        gets_s(Birthday, strlen(Birthday) + 1);
    }
 
    if (strlen(Birthday) < 10 || strlen(Birthday) > 10) { cout << "\nОшибка ввода данных! " << endl; return; }
 
    if (!FIO || !Birthday) { return; }
 
    cout << "\nВведите возраст (полных лет. Если проживает ребенок, которому менее года, укажите 1): ";
    cin >> Age;
    cin.get();
 
    if (Age < 1 || Age > 120) {
 
        cout << "\nОшибка ввода данных! " << endl;
        return;
    }
 
    cout << endl;
 
}
 
inline void Person::Print()const {
 
    if (!FIO || !Birthday) { return; }
 
    cout << "\nФИО жителя - " << FIO << endl;
    cout << "\nДата рождения - " << Birthday << endl;
    cout << "\nВозраст - " << Age << endl;
 
}
 
void Flat::Fill() {
 
    cout << "Введите номер квартиры: ";
    cin >> num;
    cin.get();
 
    if (num < 1 || num > 2000) { cout << "\nОшибка ввода данных! " << endl; return; }
 
    cout << "\nСколько человек в ней проживают? ";
    cin >> size;
    cin.get();
 
    cout << "\nСколько в ней комнат? ";
    cin >> room;
    cin.get();
 
    if (room < 1 || room > 50) { cout << "\nОшибка ввода данных! " << endl; return; }
 
    if (!human) {
 
        human = new Person[size];
    }
 
    if (human == nullptr) {
 
        return;
    }
 
    cout << endl;
 
    for (US i = 0; i < size; ++i) {
        cout << i + 1 << ") ";
        human[i].Fill();
    }
 
 
}
 
inline void Flat::Print()const {
 
    cout << "\nНомер квартиры: " << num << ", квартира " << room << "-комнатная, в ней проживает - " << size << " чел. " << endl;
 
    if (human) {
 
        for (US i = 0; i < size; ++i) {
 
            cout << "\n" << i + 1 << ") " << endl;
            human[i].Print();
            cout << endl;
        }
    }
 
}
 
void House::Fill() {
 
    cout << "Сколько квартир в вашем доме? ";
    cin >> size;
    cin.get();
 
    if (size < 1 || size > 10000) { cout << "\nОшибка ввода данных! " << endl; return; }
 
    if (!apart) {
 
        apart = new Flat[size];
    }
 
    system("cls");
 
    for (US i = 0; i < size; ++i) {
        cout << "Введите данные о " << i + 1 << "-й квартире: " << endl << endl;
        apart[i].Fill();
        system("pause");
        system("cls");
    }
}
 
inline void House::Print()const {
 
    cout << "\nКвартир в доме - " << size << endl;
 
    if (apart) {
 
        for (US i = 0; i < size; ++i) {
            apart[i].Print();
        }
    }
}
0
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
12.04.2023, 16:31  [ТС]
Цитата Сообщение от Evgen173 Посмотреть сообщение
Вот код рабочий
Спасибо за помощь и замечания! Но у меня все ту же ошибку студия выдает. У вас рабочий этот код?
0
12.04.2023, 16:31  [ТС]

Не по теме:

удалить

0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
12.04.2023, 16:57
Цитата Сообщение от Prang Посмотреть сообщение
Странно что-то, я вроде все убрал, сделал, как вы сказали, но все равно выдает ошибку в том же месте. В деструкторе класса Person.
Цитата Сообщение от Prang Посмотреть сообщение
Но у меня все ту же ошибку студия выдает.
Полный код покажите.
0
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
12.04.2023, 17:06  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Полный код покажите.

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 <iostream>
#include <Windows.h>
using std::cout;
using std::endl;
using std::cin;
 
typedef unsigned short US;
 
class Person {
    char* FIO;
    char* Birthday;
    US Age;
 
public:
    
    Person() :FIO(nullptr), Birthday(nullptr), Age(0){}
    Person(const char* fio, const char* bday, US age) : FIO(new char[strlen(fio) + 1]), Birthday(new char[strlen(bday) + 1]), Age(age) {
        
        strcpy_s(FIO, strlen(fio) + 1, fio);
        strcpy_s(Birthday, strlen(bday) + 1, bday);
    }
 
    ~Person() { 
 
        delete[]FIO;
        delete[]Birthday;
 
    }
 
    Person(const Person& an) {
 
 
        US lenfio = strlen(an.FIO) + 1;
 
        if (lenfio == 1) {
            return;
        }
 
        FIO = new char[lenfio];
 
        strcpy_s(FIO, lenfio, an.FIO);
 
        US lenbday = strlen(an.Birthday) + 1;
 
        if (lenbday == 1) {
            return;
        }
 
        Birthday = new char[lenbday];
 
        strcpy_s(Birthday, lenbday, an.Birthday);
 
        Age = an.Age;
    }
 
    Person& operator = (const Person& an) {
 
        if (this == &an) {
            return *this;
        }
 
        Person(an).Swap(*this);
 
        return *this;
    }
 
    Person(Person&& an) : FIO(nullptr), Birthday(nullptr), Age(0) {
 
        an.Swap(*this);
    }
 
    Person& operator=(Person&& an) {
 
        if (this == &an) {
            return *this;
        }
 
        an.Swap(*this);
 
        return *this;
    }
 
    inline void Fill();
 
    inline void Print()const;
 
    inline void Swap(Person& an) {
 
        std::swap(FIO, an.FIO);
        std::swap(Birthday, an.Birthday);
        std::swap(Age, an.Age);
    }
};
 
class Flat {
    Person* human;
    US size;
    US num;
    US room;
 
public: 
    Flat() : human(nullptr), size(0), num(0), room(1) {}
    Flat(US an, US n, US r) : human(new Person[size]), size(an), num(n), room(r) {}
    ~Flat() {
 
        delete[]human;
 
    }
 
    Flat(const Flat& an) : human(new Person[size]), size(an.size), num(an.num), room(an.room) {
        
        for (US i = 0; i < size; ++i) {
            human[i] = an.human[i];
        }
    }
 
    Flat& operator = (const Flat& an) {
 
        if (this == &an) {
            return *this;
        }
 
        Flat(an).Swap(*this);
 
        return *this;
 
 
    }
 
    Flat(Flat&& an): human(nullptr), size(0), num(0), room(0) {
        
        an.Swap(*this);
    }
 
    Flat& operator = (Flat&& an) {
 
        if (this == &an) {
            return *this;
        }
 
        an.Swap(*this);
 
        return *this;
    }
 
    void Fill();
    inline void Print()const;
    inline void Swap(Flat& an) {
 
        std::swap(human, an.human);
        std::swap(size, an.size);
        std::swap(num, an.num);
        std::swap(room, an.room);
    }
};
 
class House {
    US size;
    Flat* apart;
 
public:
    House() :size(0), apart(nullptr){}
    House(US an) : size(an), apart(new Flat[size]) {}
    ~House() {
 
        delete[]apart;
    }
    House(const House& an) : size(an.size), apart(new Flat[size]) {
 
        if (!size) {
 
            return;
        }
 
        for (US i = 0; i < size; ++i) {
            apart[i] = an.apart[i];
        }
    }
    
    House& operator = (const House& an) {
 
        if (this == &an) {
            return *this;
        }
 
        House(an).Swap(*this);
 
        return *this;
    }
    House(House&& an): size(0), apart(nullptr) {
        
        an.Swap(*this);
 
    }
    House& operator = (House&& an) {
 
        if (this == &an) {
            return *this;
        }
 
        an.Swap(*this);
 
        return *this;
    }
 
    void Fill();
    inline void Print()const;
    inline void Swap(House&an) {
 
        std::swap(size, an.size);
        std::swap(apart, an.apart);
        
    }
};
 
 
int main() {
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    {
        House TestHouse;
 
        TestHouse.Fill();
 
        cout << "\n\t\t\t\t\tИнформация о доме: " << endl;
 
        TestHouse.Print();
    }
 
    system("pause");
    return 0;
}
 
inline void Person::Fill() {
 
    if (!FIO) {
 
        FIO = new char[70];
 
    }
 
    if (FIO) {
 
        cout << "\nВведите ФИО жителя: ";
        gets_s(FIO, strlen(FIO) + 1);
    }
 
    if (!Birthday) {
 
        Birthday = new char[15];
    }
 
    if (Birthday) {
        cout << "\nВведите дату его рождения (формат - ХХ.ХХ.ХХХХ) - ";
        gets_s(Birthday, strlen(Birthday) + 1);
    }
 
    if (strlen(Birthday) < 10 || strlen(Birthday) > 10) { cout << "\nОшибка ввода данных! " << endl; return; }
 
    if (!FIO || !Birthday) { return; }
 
    cout << "\nВведите возраст (полных лет. Если проживает ребенок, которому менее года, укажите 1): ";
    cin >> Age;
    cin.get();
 
    if (Age < 1 || Age > 120) {
 
        cout << "\nОшибка ввода данных! " << endl;
        return;
    }
 
    cout << endl;
 
}
 
inline void Person::Print()const {
 
    if (!FIO || !Birthday) { return; }
 
    cout << "\nФИО жителя - " << FIO << endl;
    cout << "\nДата рождения - " << Birthday << endl;
    cout << "\nВозраст - " << Age << endl;
 
}
 
void Flat::Fill() {
    
    cout << "Введите номер квартиры: ";
    cin >> num;
    cin.get();
 
    if (num < 1 || num > 2000) { cout << "\nОшибка ввода данных! " << endl; return; }
 
    cout << "\nСколько человек в ней проживают? ";
    cin >> size;
    cin.get();
 
    cout << "\nСколько в ней комнат? ";
    cin >> room;
    cin.get();
 
    if (room < 1 || room > 50) { cout << "\nОшибка ввода данных! " << endl; return; }
 
    if (!human) {
 
        human = new Person[size];
    }
 
    cout << endl;
 
    for (US i = 0; i < size; ++i) {
        cout << i + 1 << ") ";
        human[i].Fill();
    }
    
 
}
 
inline void Flat::Print()const {
 
    cout << "\nНомер квартиры: " << num << ", квартира " << room << "-комнатная, в ней проживает - " << size << " чел. " << endl;
 
    if (human) {
 
        for (US i = 0; i < size; ++i) {
 
            cout << "\n" << i + 1 << ") " << endl;
            human[i].Print();
            cout << endl;
        }
    }
 
}
 
void House::Fill() {
 
    cout << "Сколько квартир в вашем доме? ";
    cin >> size;
    cin.get();
 
    if (size < 1 || size > 10000) { cout << "\nОшибка ввода данных! " << endl; return; }
 
    if (!apart) {
 
        apart = new Flat[size];
    }
 
    system("cls");
 
    for (US i = 0; i < size; ++i) {
        cout << "Введите данные о " << i + 1 << "-й квартире: " << endl << endl;
        apart[i].Fill();
        system("pause");
        system("cls");
    }
}
 
inline void House::Print()const {
 
    cout << "\nКвартир в доме - " << size << endl;
 
    if (apart) {
 
        for (US i = 0; i < size; ++i) {
            apart[i].Print();
        }
    }
}
Добавлено через 3 минуты
Цитата Сообщение от Prang Посмотреть сообщение
room(1)

у меня в одном конструкторе room(1), в другом 0, исправил все на 0
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
12.04.2023, 20:20
Цитата Сообщение от Prang Посмотреть сообщение
Но у меня все ту же ошибку студия выдает.
У вас еще остались ошибки в методе Person::Fill(). Вы там вызываете strlen для неинициализированной памяти. Но даже если бы память была нормальной, такое использование strlen здесь - логическая ошибка.

Добавлено через 3 минуты
Вот примерное так. Только еще обработку ошибок потока нужно добавить.
Тут, если ошибка произошла при вводе, данные объекта не портятся: мы их заносим только когда точно уверены, что все введено верно.
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
void Person::Fill() 
{
    cout << "\nВведите ФИО жителя: ";
    char locFIO[70];
    cin.getline(locFIO, sizeof(locFIO));
    cout << "\nВведите дату его рождения (формат - ХХ.ХХ.ХХХХ) - ";
    char locBirthday[15];
    cin.getline(locBirthday, sizeof(locBirthday));
    if (strlen(locBirthday) < 10 || strlen(locBirthday) > 10)
    { 
        cout << "\nОшибка ввода данных! " << endl; 
        return; 
    }
    cout << "\nВведите возраст (полных лет. Если проживает ребенок, которому менее года, укажите 1): ";
    int locAge = 0;
    cin >> locAge;
    cin.get();
    if (locAge < 1 || locAge> 120) 
    {
        cout << "\nОшибка ввода данных! " << endl;
        return;
    }
    cout << endl;
 
    Person(locFIO, locBirthday, locAge).Swap(*this);
}
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
12.04.2023, 22:29
Цитата Сообщение от Prang Посмотреть сообщение
У вас рабочий этот код?
Да, у меня он отработал без ошибок, запускал в CodeBlocks. Каждую строчку не проверял, указал на ошибки, которые увидел. Допускаю, что в коде есть UB (неопределенное поведение), тогда от раза к разу результаты выполнения могут быть разными. Если у вас он выдает ошибку, это очень хорошо для отладки. Поставьте брейкпоинты и постарайтесь поймать строку, при выполнении которой происходит ошибка - место вашей конкретной проблемы сразу локализуется.

Добавлено через 1 минуту
Prang, кстати, показали бы данные, которые вводите и которые приводят к ошибке
0
18 / 1 / 0
Регистрация: 30.03.2023
Сообщений: 29
12.04.2023, 23:10  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
У вас еще остались ошибки в методе Person::Fill(). Вы там вызываете strlen для неинициализированной памяти. Но даже если бы память была нормальной, такое использование strlen здесь - логическая ошибка.

Спасибо огромное, помогли. Действительно, фигню написал. Сейчас все работает. Спасибо за замечания!

Цитата Сообщение от DrOffset Посмотреть сообщение
Только еще обработку ошибок потока нужно добавить.
Над этим подумаю завтра, пока не очень понимаю, о чем речь

Цитата Сообщение от Evgen173 Посмотреть сообщение
Поставьте брейкпоинты и постарайтесь поймать строку, при выполнении которой происходит ошибка - место вашей конкретной проблемы сразу локализуется.
С самого начала написания этого поста ошибка возникала в деструкторе класса Person. При попытке освободить память он выдавал ошибку.
Сейчас все работает (в методе Fill были косяки), спасибо и вам за помощь!
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
12.04.2023, 23:18
Prang, косяки были по всей программе (и остались сейчас, не всё мы исправили); Если бы мы исправили только метод Fill сперва, то это ничего глобально бы не решило, программа все равно осталась бы с большими проблемами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.04.2023, 23:18

Работа с динамической памятью через указатели. Загадочная ошибка.
Пишу в Microsoft Visual Studio -&gt;Win32 Console application -&gt;C++. Есть такая задача: Создать массив из N целых чисел, N вводит...

Работа с динамической памятью через указатели. Загадочная ошибка.
Программа запускается и нормально исполняется, но в конце появляется ошибка. Мог бы кто подсказать в чем проблема? Пишу в Microsoft...

После выполнения программы, работающей с динамической памятью, вылетает ошибка
при компиляции вылетает ошибка (не может обратиться к private gолям next, val) err: C2248 если поля поместить в public, то прога...

Работа с динамической памятью. Ошибка в функции getline через посимвольный ввод
Было дано вот такое задание: В этой задаче вам необходимо написать функцию getline, которая читает строку из стандартного потока ввода...

Ошибка при работе с динамической памятью - 'Invalid pointer operatoion'
Столкнулся с такой проблемой - код исполняется правильно, но при закрытие программы вываливается ошибка(скрин прилогается). Я нашёл...


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

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru